def select_table(self, table_class='table', **kwargs): field = self.work_event kwargs.setdefault('type', 'radio') field_id = kwargs.pop('id', field.id) html = ['<table %s>' % html_params(id=field_id, class_=table_class)] html.append("""<tr> <th>Name</th> <th>Extra Info</th> <th>Selected</th> </tr>""") for value, label, checked in field.iter_choices(): event_info = Event.get_by_id(value) html.append("<tr>\n") choice_id = '%s-%s' % (field_id, value) options = dict(kwargs, name=field.name, value=value, id=choice_id) if checked: options['checked'] = 'checked' html.append('<td><label for="%s">%s</label></td>\n' % (field_id, label)) html.append('<td>' + ', '.join(event_info.extra) + '</td>\n') html.append('<td><input %s /></td>\n' % html_params(**options)) html.append('</tr>') html.append('</table>') return ''.join(html)
def validate(self): initial_validation = super(WorkSubmitForm, self).validate() if not initial_validation: return False # check syntax try: extra_list = json.loads(self.extra.data) if type(extra_list) is dict: # check content event = Event.get_by_id(self.work_event.data) item_list = event.extra for item in item_list: if item not in extra_list: self.extra.errors.append('Missing one or more fields.') return False return True else: self.extra.errors.append('Bad syntax.') return False except: self.extra.errors.append('Bad syntax.') return False
def work_upload(): """ Work upload/update page for team user. On GET method, it renders work upload template. On POST method, it update/create corresponding work instance and stores the PDF file. When storing the file, it combines the current UNIX format time with original filename filtered with :funciton:`secure_filename` to form the filename used for local storage. .. note:: Don't forget to create directory static/work_upload manually! Team user required. """ form = WorkSubmitForm() current_team = current_user.team # append all open events to event select field's choice list event_list = Event.query.filter( and_(Event.start_time <= dt.datetime.now(), Event.end_time >= dt.datetime.now()) ).all() choice_list = [] for each_event in event_list: choice_list.append((each_event.id, each_event.name)) form.work_event.choices = choice_list # if no event is currently open, flash an error if len(choice_list) == 0: flash("No event is currently open.", "warning") return redirect(url_for("team.work_panel")) if form.validate_on_submit(): filename = secure_filename(str(calendar.timegm(time.gmtime())) + form.work_file.data.filename) upload_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../static/work_upload/") form.work_file.data.save(upload_dir + filename) if current_team.work: modified_work = current_team.work extra_info = json.loads(form.extra.data) modified_work.update( title=form.work_title.data, file_path=url_for("static", filename="work_upload/" + filename), created_at=dt.datetime.now(), extra=extra_info, ) if not modified_work.event_id == form.work_event.data: flash( "To change event, you must delete your current work and propose a new one. Other changes have been successfully saved.", "warning", ) else: flash("Work updated. You're all set.", "success") else: extra_info = json.loads(form.extra.data) Work.create( title=form.work_title.data, file_path=url_for("static", filename="work_upload/" + filename), team=current_team, team_id=current_team.id, event=Event.get_by_id(form.work_event.data), event_id=form.work_event.data, extra=extra_info, ) flash("Work uploaded. You're all set.", "success") return redirect(url_for("team.work_panel")) else: flash_errors(form) if current_team.work and request.method == "GET": form.work_title.data = current_team.work.title form.work_event.data = current_team.work.event_id form.extra.data = json.dumps(current_team.work.extra) return render_template("team/work_upload.html", upload_form=form)