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)
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)
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>"
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()
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()))
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()))
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