def get(self, key, ta='', responses=None, success=None, errors=None): invite = EvalInvite.get_by_key_name(key) if not invite: return self.redirect('/') settings = Settings.get_by_key_name('settings') invite.expired = datetime.datetime.now() > settings.expire_date success = success or [] errors = errors or [] remaining = invite.remaining_evals() if not remaining and not invite.tas: if settings.send_completed_email: body = const.COMPLETED_EMAIL_TEMPLATE.format(invite.name) try: to_email = '{} <{}>'.format(invite.name, invite.email) mail.send_mail(settings.admin_email, to_email, const.COMPLETED_EMAIL_SUBJECT, body) except apiproxy_errors.OverQuotaError as message: logging.error(message) completed = Completed(name=invite.name, email=invite.email) completed.put() invite.delete() questions = None else: if not responses: responses = [''] * len(const.QUESTIONS) questions = zip(const.QUESTIONS, responses) values = {'invite': invite, 'success': success, 'errors': errors, 'sel_ta': ta, 'questions': questions, 'remaining': remaining} template = jinja_environment.get_template('eval.html') self.response.out.write(template.render(values))
def email_result(self): key_name = self.request.get('key') obj = Eval.get_by_key_name(key_name) if not obj: return self.get(errors=['Invalid key: {!r}'.format(key_name)]) if obj.sent_results: return self.get(errors=['Results already emailed.']) safe_ta_name = obj.ta.replace(' ', '_') ta_result_name = '{}-{}.txt'.format(obj.course, safe_ta_name) ta_result = Eval.generate_summary([obj]) course_list = [x for x in Eval.all().filter('course =', obj.course)] course_result = Eval.generate_summary(course_list, True) all_result = Eval.generate_summary([x for x in Eval.all()], True) settings = Settings.get_by_key_name('settings') email_to = '{} <{}>'.format(obj.ta, obj.ta_email) email_cc = '{} <{}>'.format(obj.instructor, obj.instructor_email) body = const.RESULT_EMAIL_TEMPLATE.format(obj.ta) attachments = [(ta_result_name, ta_result), ('{}.txt'.format(obj.course), course_result), ('all.txt', all_result)] try: mail.send_mail(sender=settings.admin_email, to=email_to, cc=email_cc, subject=const.RESULT_EMAIL_SUBJECT, body=body, attachments=attachments) obj.sent_results = True obj.put() self.get(['Sent result to {} and {}'.format(obj.ta, obj.instructor)]) except Exception, e: self.get(errors=[str(e)])
def update_expire_date(self): expire_date = self.request.get('expire_date') try: expire_date = datetime.datetime.strptime(expire_date, '%Y:%m:%d %H:%M') except ValueError: expire_date = None if not expire_date: return self.get(errors=['Invalid expire date']) settings = Settings.get_by_key_name('settings') settings.expire_date = expire_date settings.put() return self.get(['Expire date updated.'])
def get(self, form=None): current_settings = Settings.get_by_key_name(config.SETTINGS_KEY) if current_settings: current_settings = current_settings.to_dict() current_settings['allowed_ips'] = ','.join(current_settings['allowed_ips']) else: current_settings = Settings.reset_auth(config.SETTINGS_KEY); if form is None: form = SettingsForm(current_settings) self.response.out.write(template.render(os.path.join(config.APP_ROOT_DIR, "templates/index.html"), {"no_settings" : (current_settings is None), "form" : form, "title" : "Mail Engine for App Engine"}))
def check(token, public, remote_addr): authorized = False settings = Settings.get_by_key_name(config.SETTINGS_KEY) if settings is not None: compare_token = hashlib.sha1(public + settings.auth_key).hexdigest() if compare_token == token: authorized = True if settings.allowed_ips and remote_addr not in settings.allowed_ips: authorized = False return authorized
def post(self): settings = Settings.get_by_key_name('settings') for invites, output in helpers.invite_iterator(): name = invites[0].name to_email = '{} <{}>'.format(name, invites[0].email) body = const.EMAIL_TEMPLATE.format(student=name, body=output) try: mail.send_mail(settings.admin_email, to_email, const.EMAIL_SUBJECT, body) now = datetime.datetime.now() for invite in invites: invite.email_sent = now invite.put() except apiproxy_errors.OverQuotaError: taskqueue.add(url='/admin/email', countdown=60) return self.response.set_status(200)
def post(self): settings = Settings.get_by_key_name(config.SETTINGS_KEY) sender = self.request.get(SENDER, settings.default_sender) subject = self.request.get(SUBJECT, settings.default_subject) body = self.request.get(BODY, '') recipients = self.request.get(RECIPIENTS) if recipients: recipients = recipients.split(COMMA) else: recipients = [] m = Message(recipients=recipients, sender=sender, subject=subject, body=body) m.put() m.send()
def post(self, key): invite = EvalInvite.get_by_key_name(key) if not invite: return self.redirect('/') settings = Settings.get_by_key_name('settings') if datetime.datetime.now() > settings.expire_date: return self.get(key) ta = self.request.get('ta') if ta not in invite.tas: return self.get(key, errors=('Must select a TA to evaluate',)) if self.request.get('not_applicable'): success = 'Not Applicable: {}'.format(ta) else: errors = [] responses = self.get_responses() for i in range(len(const.QUESTIONS)): if i >= len(responses): responses.append('') continue if const.QUESTIONS[i][1] in [0, 1]: if responses[i] not in ['0', '1', '2', '3', '4', '5']: responses[i] = '' errors.append('Must provide an answer for {!r}'.format( const.QUESTIONS[i][0])) if errors: return self.get(key, ta, responses, errors=errors) try: db.run_in_transaction(Eval.update, invite.course, ta, responses) except apiproxy_errors.RequestTooLargeError: return self.get(key, ta, responses, errors=('Your response is too long',)) success = 'Evaluated: {}'.format(ta) # Remove TA from list of TAs student can evaluate invite.tas.remove(ta) invite.put() self.get(key, success=success)