Exemple #1
0
def contact():
    if request.method == 'POST':
        name = request.form.get('name')
        email = request.form.get('email')
        subject = request.form.get('subject')
        message = request.form.get('message')

        if all((name, email, subject, message)):
            body = "Name: {}\n\nEmail: {}\n\nSubject: {}\n\nMessage:\n{}".format(
                name, email, subject, message)
            create_object(
                Emails(
                    request_id=None,
                    privacy=PRIVATE,
                    to=OPENRECORDS_DL_EMAIL,
                    cc=None,
                    bcc=None,
                    subject=subject,
                    body=body,
                ))
            send_contact_email(subject, [OPENRECORDS_DL_EMAIL], body, email)
            flash('Your message has been sent. We will get back to you.',
                  category='success')
        else:
            flash('Cannot send email.', category='danger')
    error_id = request.args.get('error_id', '')
    return render_template('main/contact.html', error_id=error_id)
Exemple #2
0
def create_contact_record(request, first_name, last_name, email, subject,
                          message):
    """
    Creates Users, Emails, and Events entries for a contact submission for a request.
    Sends email with message to all agency users associated with the request.

    :param request: request object
    :param first_name: sender's first name
    :param last_name: sender's last name
    :param email: sender's email
    :param subject: subject of email
    :param message: email body
    """
    if current_user == request.requester:
        user = current_user
    else:
        user = Users(guid=generate_guid(),
                     email=email,
                     first_name=first_name,
                     last_name=last_name,
                     email_validated=False,
                     terms_of_use_accepted=False,
                     is_anonymous_requester=True)
        create_object(user)

        create_object(
            Events(request_id=request.id,
                   user_guid=None,
                   type_=event_type.USER_CREATED,
                   new_value=user.val_for_events))

    body = "Name: {} {}\n\nEmail: {}\n\nSubject: {}\n\nMessage:\n{}".format(
        first_name, last_name, email, subject, message)

    agency_emails = get_assigned_users_emails(request.id)

    email_obj = Emails(request.id,
                       PRIVATE,
                       to=','.join([
                           email.replace('{', '').replace('}', '')
                           for email in agency_emails
                       ]),
                       cc=None,
                       bcc=None,
                       subject=subject,
                       body=body)

    create_object(email_obj)

    create_object(
        Events(request_id=request.id,
               user_guid=user.guid,
               type_=event_type.CONTACT_EMAIL_SENT,
               response_id=email_obj.id,
               new_value=email_obj.val_for_events))

    send_contact_email(subject, agency_emails, message, email)
Exemple #3
0
def insertEmail():
    if request.method == 'POST':
        newEmailSubject = request.form['email_subject']
        newEmailContent = request.form['email_content']
        newTimestamp = request.form['timestamp']
        email = Emails(newEmailSubject, newEmailContent, newTimestamp)
        db.session.add(email)
        db.session.commit()
        # Default recipient use any email. I used a temporary email
        default_recipient = "*****@*****.**"
        save_now(newTimestamp, default_recipient, newEmailSubject, newEmailContent)
        return "<p>Inserted</p>"
    else:
        return "<p>you need to POST your request</p>"
Exemple #4
0
from app.models import Emails
from app import db

contact1 = Emails('Allan', 'Angus', '*****@*****.**')
contact2 = Emails('Barbara', 'Baggins', '*****@*****.**')
contact3 = Emails('Daniel', 'Dunn', '*****@*****.**')
contact4 = Emails('Carl', 'Cuff', '*****@*****.**')
contact5 = Emails('Justine', 'Jetta', '*****@*****.**')
contact6 = Emails('Elian', 'Elton', '*****@*****.**')
contact7 = Emails('Francine', 'Ffrench', '*****@*****.**')
contact8 = Emails('Georgette', 'Glaxon', '*****@*****.**')
contact9 = Emails('Harry', 'Houdini', '*****@*****.**')
contact10 = Emails('Ilias', 'Ingram', '*****@*****.**')

db.session.add(contact1)
db.session.add(contact2)
db.session.add(contact3)
db.session.add(contact4)
db.session.add(contact5)
db.session.add(contact6)
db.session.add(contact7)
db.session.add(contact8)
db.session.add(contact9)
db.session.add(contact10)

db.session.commit()
Exemple #5
0
def update_request_statuses():
    """
    Update statuses for all requests that are now Due Soon or Overdue
    and send a notification email to agency admins listing the requests.
    """
    with scheduler.app.app_context():
        now = datetime.utcnow()
        due_soon_date = calendar.addbusdays(
            now, current_app.config['DUE_SOON_DAYS_THRESHOLD']).replace(
                hour=23, minute=59, second=59)  # the entire day

        requests_overdue = Requests.query.filter(
            Requests.due_date < now,
            Requests.status != request_status.CLOSED).order_by(
                Requests.due_date.asc()).all()

        requests_due_soon = Requests.query.filter(
            Requests.due_date > now, Requests.due_date <= due_soon_date,
            Requests.status != request_status.CLOSED).order_by(
                Requests.due_date.asc()).all()

        agencies_to_requests_overdue = {}
        agencies_to_acknowledgments_overdue = {}
        agencies_to_requests_due_soon = {}
        agencies_to_acknowledgments_due_soon = {}

        def add_to_agencies_to_request_dict(req, agencies_to_request_dict):
            if req.agency.ein not in agencies_to_request_dict:
                agencies_to_request_dict[req.agency.ein] = [req]
            else:
                agencies_to_request_dict[req.agency.ein].append(req)

        # OVERDUE
        for request in requests_overdue:

            if request.was_acknowledged:
                add_to_agencies_to_request_dict(request,
                                                agencies_to_requests_overdue)
            else:
                add_to_agencies_to_request_dict(
                    request, agencies_to_acknowledgments_overdue)

            if request.status != request_status.OVERDUE:
                update_object({"status": request_status.OVERDUE}, Requests,
                              request.id)

        # DUE SOON
        for request in requests_due_soon:

            if request.was_acknowledged:
                add_to_agencies_to_request_dict(request,
                                                agencies_to_requests_due_soon)
            else:
                add_to_agencies_to_request_dict(
                    request, agencies_to_acknowledgments_due_soon)

            if request.status != request_status.DUE_SOON:
                update_object({"status": request_status.DUE_SOON}, Requests,
                              request.id)

        # get all possible agencies to email
        agency_eins = set(
            list(agencies_to_requests_overdue) +
            list(agencies_to_acknowledgments_overdue) +
            list(agencies_to_requests_due_soon) +
            list(agencies_to_acknowledgments_due_soon))

        # mail to agency admins for each agency
        for agency_ein in agency_eins:
            agency_requests_overdue = agencies_to_requests_overdue.get(
                agency_ein, [])
            agency_acknowledgments_overdue = agencies_to_acknowledgments_overdue.get(
                agency_ein, [])
            agency_requests_due_soon = agencies_to_requests_due_soon.get(
                agency_ein, [])
            agency_acknowledgments_due_soon = agencies_to_acknowledgments_due_soon.get(
                agency_ein, [])

            user_emails = list(
                set(admin.notification_email or admin.email
                    for admin in Agencies.query.filter_by(
                        ein=agency_ein).one().administrators))
            send_email(
                STATUSES_EMAIL_SUBJECT,
                to=user_emails,
                template=STATUSES_EMAIL_TEMPLATE,
                requests_overdue=agency_requests_overdue,
                acknowledgments_overdue=agency_acknowledgments_overdue,
                requests_due_soon=agency_requests_due_soon,
                acknowledgments_due_soon=agency_acknowledgments_due_soon)
            email = Emails(
                request.id,
                PRIVATE,
                to=','.join(user_emails),
                cc=None,
                bcc=None,
                subject=STATUSES_EMAIL_SUBJECT,
                body=render_template(
                    STATUSES_EMAIL_TEMPLATE + ".html",
                    requests_overdue=agency_requests_overdue,
                    acknowledgments_overdue=agency_acknowledgments_overdue,
                    requests_due_soon=agency_requests_due_soon,
                    acknowledgments_due_soon=agency_acknowledgments_due_soon))
            create_object(email)
            create_object(
                Events(request.id,
                       user_guid=None,
                       auth_user_type=None,
                       type_=EMAIL_NOTIFICATION_SENT,
                       previous_value=None,
                       new_value=email.val_for_events,
                       response_id=None,
                       timestamp=datetime.utcnow()))
Exemple #6
0
def _update_request_statuses():
    """
    Update statuses for all requests that are now Due Soon or Overdue
    and send a notification email to agency admins listing the requests.
    """
    now = datetime.utcnow()
    due_soon_date = calendar.addbusdays(
        now, current_app.config['DUE_SOON_DAYS_THRESHOLD']).replace(
            hour=23, minute=59, second=59)  # the entire day

    agencies = Agencies.query.with_entities(
        Agencies.ein).filter_by(is_active=True).all()

    for agency_ein, in agencies:
        requests_overdue = Requests.query.filter(
            Requests.due_date < now, Requests.status != request_status.CLOSED,
            Requests.agency_ein == agency_ein).order_by(
                Requests.due_date.asc()).all()

        requests_due_soon = Requests.query.filter(
            Requests.due_date > now, Requests.due_date <= due_soon_date,
            Requests.status != request_status.CLOSED,
            Requests.agency_ein == agency_ein).order_by(
                Requests.due_date.asc()).all()

        if not requests_overdue and not requests_due_soon:
            continue

        agency_requests_overdue = []
        agency_acknowledgments_overdue = []
        agency_requests_due_soon = []
        agency_acknowledgments_due_soon = []

        # OVERDUE
        for request in requests_overdue:

            if request.was_acknowledged:
                agency_requests_overdue.append(request)
            else:
                agency_acknowledgments_overdue.append(request)

            if request.status != request_status.OVERDUE:
                create_object(
                    Events(
                        request.id,
                        user_guid=None,
                        auth_user_type=None,
                        type_=REQ_STATUS_CHANGED,
                        previous_value={"status": request.status},
                        new_value={"status": request_status.OVERDUE},
                        response_id=None,
                    ))
                update_object({"status": request_status.OVERDUE}, Requests,
                              request.id)

        # DUE SOON
        for request in requests_due_soon:

            if request.was_acknowledged:
                agency_requests_due_soon.append(request)
            else:
                agency_acknowledgments_due_soon.append(request)

            if request.status != request_status.DUE_SOON:
                create_object(
                    Events(
                        request.id,
                        user_guid=None,
                        auth_user_type=None,
                        type_=REQ_STATUS_CHANGED,
                        previous_value={"status": request.status},
                        new_value={"status": request_status.DUE_SOON},
                        response_id=None,
                    ))
                update_object({"status": request_status.DUE_SOON}, Requests,
                              request.id)

        # mail to agency admins for each agency
        user_emails = list(
            set(admin.notification_email or admin.email
                for admin in Agencies.query.filter_by(
                    ein=agency_ein).one().administrators))

        send_email(STATUSES_EMAIL_SUBJECT,
                   to=user_emails,
                   template=STATUSES_EMAIL_TEMPLATE,
                   requests_overdue=agency_requests_overdue,
                   acknowledgments_overdue=agency_acknowledgments_overdue,
                   requests_due_soon=agency_requests_due_soon,
                   acknowledgments_due_soon=agency_acknowledgments_due_soon)
        email = Emails(
            request.id,
            PRIVATE,
            to=','.join(user_emails),
            cc=None,
            bcc=None,
            subject=STATUSES_EMAIL_SUBJECT,
            body=render_template(
                STATUSES_EMAIL_TEMPLATE + ".html",
                requests_overdue=agency_requests_overdue,
                acknowledgments_overdue=agency_acknowledgments_overdue,
                requests_due_soon=agency_requests_due_soon,
                acknowledgments_due_soon=agency_acknowledgments_due_soon))
        create_object(email)
        create_object(
            Events(request.id,
                   user_guid=None,
                   auth_user_type=None,
                   type_=EMAIL_NOTIFICATION_SENT,
                   previous_value=None,
                   new_value=email.val_for_events,
                   response_id=None,
                   timestamp=datetime.utcnow()))
Exemple #7
0
def post_emails_item():
    """Post emails item by id."""
    try:
        # Get parameters from request
        value = request.args.get('value', None)
        type = request.args.get('type', None)
        user = request.args.get('user', None)
        main = request.args.get('main', None)

        # Check and set user (should be an integer number existed in database)
        if user:
            user = variable_type_check(user, int)
            if not user.result:
                return json_http_response(
                    status=400,
                    given_message=_(
                        "Value «%(value)s» from parameter"
                        " «&user=%(value)s» is not type of «%(type)s»",
                        value=user.value,
                        type=user.type
                    ),
                    dbg=request.args.get('dbg', False)
                )
            user_obj = Users.query.get(user.value)
            if not user_obj:
                return json_http_response(
                    status=404,
                    given_message=_(
                        "Add email to user with id=%(id)s is impossible:"
                        " user is does not exist in database",
                        id=user.value
                    ),
                    dbg=request.args.get('dbg', False)
                )
        else:
            return json_http_response(
                status=400,
                given_message=_(
                    "You don't provide user in parameter"
                    " «&user=», so adding email has been terminated"
                ),
                dbg=request.args.get('dbg', False)
            )

        # Check and set email value (should be a email formated string
        # in 1-100 range unique in entire database)
        if value:
            value = variable_type_check(value.strip(), str)
            if not value.result:
                return json_http_response(
                    status=400,
                    given_message=_(
                        "Value «%(value)s» from parameter"
                        " «&value=%(value)s» is not type of «%(type)s»",
                        value=value.value,
                        type=value.type
                    ),
                    dbg=request.args.get('dbg', False)
                )
            if len(value.value) > 100:
                answer_string = str(
                    value.value[:5]
                )+"..."+str(
                    value.value[-5:]
                ) if len(
                    value.value
                ) > 10 else value.value
                return json_http_response(
                    status=400,
                    given_message=_(
                        "Value «%(value)s» from parameter"
                        " «&value=%(value)s» is out of range 1-100",
                        value=answer_string
                    ),
                    dbg=request.args.get('dbg', False)
                )
            if not validate_email(value.value):
                return json_http_response(
                    status=400,
                    given_message=_(
                        "Something's wrong with email «%(value)s»"
                        " validation: email incorrect or does not exist",
                        value=value.value
                    ),
                    dbg=request.args.get('dbg', False)
                )
            if Emails.query.filter(Emails.value == value.value).first():
                return json_http_response(
                    status=400,
                    given_message=_(
                        "Email «%(value)s» already exist in database: email"
                        " must be unique in entire database",
                        value=value.value
                    ),
                    dbg=request.args.get('dbg', False)
                )
        else:
            return json_http_response(
                status=400,
                given_message=_(
                    "You don't provide email value in parameter"
                    " «&value=», so adding email has been terminated"
                ),
                dbg=request.args.get('dbg', False)
            )

        # Check and set email type (should be a string in 1-20 range)
        if type:
            type = variable_type_check(type.strip(), str)
            if not type.result:
                return json_http_response(
                    status=400,
                    given_message=_(
                        "Value «%(value)s» from parameter"
                        " «&type=%(value)s» is not type of «%(type)s»",
                        value=type.value,
                        type=type.type
                    ),
                    dbg=request.args.get('dbg', False)
                )
            if len(type.value) > 20:
                answer_string = str(
                    type.value[:5]
                )+"..."+str(
                    type.value[-5:]
                ) if len(
                    type.value
                ) > 10 else type.value
                return json_http_response(
                    status=400,
                    given_message=_(
                        "Value «%(value)s» from parameter"
                        " «&type=%(value)s» is out of range 1-20",
                        value=answer_string
                    ),
                    dbg=request.args.get('dbg', False)
                )

        filter = {'user_id': user.value, 'main': True}
        user_main_email = Emails.query.filter_by(**filter).first()

        # Check state "main" (boolean)
        if main:
            main = variable_type_check(main, bool)
            if not main.result:
                return json_http_response(
                    status=400,
                    given_message=_(
                        "Value «%(value)s» from parameter «&main=%(value)s»"
                        " is not type of «%(type)s»",
                        value=main.value,
                        type=main.type
                    ),
                    dbg=request.args.get('dbg', False)
                )
            else:
                if main.value and not user_main_email:
                    main = True
                elif main.value and user_main_email:
                    main = True
                    user_main_email.main = False
                elif not main.value and not user_main_email:
                    main = True
                else:
                    main = False
        elif user_main_email:
            main = False
        elif not user_main_email:
            main = True

        email = Emails(
            user_id=user.value,
            type=type.value if type else None,
            value=value.value,
            verify=0,
            active_until=None,
            main=main,
        )
        db.session.add(email)
        db.session.flush()

        # Before send response, dump newly added email to json and add
        # his data to response
        email_schema = EmailsSchema(
            only=["id", "value", "links", "type"]
        )
        email_dump = email_schema.dump(email)
        db.session.commit()

        output_json = {
            "message": _(
                "Successfully added email «%(email)s»"
                " to user «%(user)s»! Please, check email box for verification"
                " mail.",
                email=value.value,
                user=user_obj.login
            ),
            "email": email_dump,
            "responseType": _("Success"),
            "status": 200
        }
        # ----------------------------------------------------------------------

        response = Response(
            response=json.dumps(output_json),
            status=200,
            mimetype='application/json'
        )

        post_emails_verify_item(email.id)

    except Exception:

        response = json_http_response(dbg=request.args.get('dbg', False))

    return response