def list_institutions(): section = "Manage" if current_user.is_creator else None return render_template( "institutions.html", title="Institutions", section=section, subsection="institutions", maintained_institutions=institutions({'admin': current_user.email}), institutions=institutions(), maxlength=maxlength, )
def list_institutions(): return render_template( "institutions.html", title="Institutions", institutions=institutions(), top_menu=basic_top_menu(), )
def list_institutions(): section = "Manage" if current_user.is_creator else None return render_template( "institutions.html", title="Institutions", section=section, subsection="institutions", institutions=institutions(), )
def save_talk(): raw_data = request.form resp, seminar, talk = can_edit_talk(raw_data.get("seminar_id", ""), raw_data.get("seminar_ctr", ""), raw_data.get("token", "")) if resp is not None: return resp data = { 'seminar_id': talk.seminar_id, 'token': talk.token, 'display': talk.display, # could be being edited by anonymous user } if talk.new: curmax = talks_max('seminar_ctr', {'seminar_id': talk.seminar_id}) if curmax is None: curmax = 0 data['seminar_ctr'] = curmax + 1 else: data['seminar_ctr'] = talk.seminar_ctr for col in db.talks.search_cols: if col in data: continue try: val = raw_data.get(col) if not val: data[col] = None else: data[col] = process_user_input(val, db.talks.col_type[col]) if col == 'speaker_homepage' and val and not val.startswith( "http"): data[col] = "http://" + data[col] if col == "access" and val not in ["open", "users", "endorsed"]: raise ValueError("Invalid access type") except Exception as err: flash_error("Error processing %s: %s", [col, err]) talk = WebTalk(talk.seminar_id, talk.seminar_ctr, data=raw_data) title = "Create talk" if talk.new else "Edit talk" return render_template("edit_talk.html", talk=talk, seminar=seminar, title=title, top_menu=basic_top_menu(), categories=categories(), institutions=institutions(), timezones=timezones) new_version = WebTalk(talk.seminar_id, data['seminar_ctr'], data=data) if new_version == talk: flash("No changes made to talk.") else: new_version.save() edittype = "created" if talk.new else "edited" flash("Talk successfully %s!" % edittype) return redirect( url_for("show_talk", semid=new_version.seminar_id, talkid=new_version.seminar_ctr), 301)
def make_error(err): flash_error("Error processing %s: %s" % (col, err)) seminar = WebSeminar(shortname, data=raw_data) return render_template("edit_seminar.html", seminar=seminar, title="Edit seminar error", top_menu=basic_top_menu(), categories=categories(), institutions=institutions(), lock=None)
def failure(): return render_template( "edit_talk.html", talk=talk, seminar=talk.seminar, title="Edit talk", section="Manage", subsection="edittalk", institutions=institutions(), timezones=timezones, )
def failure(): return render_template( "edit_seminar.html", seminar=seminar, title="Edit properties", section=manage, subsection="editsem", institutions=institutions(), weekdays=weekdays, timezones=timezones, lock=lock, )
def make_error(shortname, col=None, err=None): if err is not None: flash_error("Error processing %s: {0}".format(err), col) seminar = WebSeminar(shortname, data=raw_data) manage = "Manage" if current_user.is_organizer else "Create" return render_template( "edit_seminar.html", seminar=seminar, title="Edit seminar error", section=manage, institutions=institutions(), lock=None, )
def edit_talk(): if request.method == "POST": data = request.form else: data = request.args token = data.get("token", "") resp, talk = can_edit_talk(data.get("seminar_id", ""), data.get("seminar_ctr", ""), token) if resp is not None: return resp if token: # Also want to override top menu from seminars.utils import top_menu menu = top_menu() menu[2] = (url_for("create.index"), "", "Manage") extras = {"top_menu": menu} else: extras = {} # The seminar schedule page adds in a date and times if data.get("date", "").strip(): tz = talk.seminar.tz date = process_user_input(data["date"], "date", "date", tz) try: # TODO: clean this up start_time = process_user_input(data.get("start_time"), "start_time", "time", tz) end_time = process_user_input(data.get("end_time"), "end_time", "time", tz) start_time = localize_time(datetime.combine(date, start_time), tz) end_time = localize_time(datetime.combine(date, end_time), tz) except ValueError: return redirect( url_for(".edit_seminar_schedule", shortname=talk.seminar_id), 302) talk.start_time = start_time talk.end_time = end_time # lock = get_lock(seminar_id, data.get("lock")) title = "Create talk" if talk.new else "Edit talk" return render_template("edit_talk.html", talk=talk, seminar=talk.seminar, title=title, section="Manage", subsection="edittalk", institutions=institutions(), timezones=timezones, token=token, **extras)
def make_error(talk, col=None, err=None): if err is not None: flash_error("Error processing %s: {0}".format(err), col) talk = WebTalk(talk.seminar_id, talk.seminar_ctr, data=raw_data) title = "Create talk error" if talk.new else "Edit talk error" return render_template( "edit_talk.html", talk=talk, seminar=talk.seminar, title=title, section="Manage", subsection="edittalk", institutions=institutions(), timezones=timezones, )
def edit_seminar(): if request.method == "POST": data = request.form else: data = request.args shortname = data.get("shortname", "") new = data.get("new") == "yes" resp, seminar = can_edit_seminar(shortname, new) if resp is not None: return resp if new: subjects = clean_subjects(data.get("subjects")) if not subjects: return show_input_errors( [format_errmsg("Please select at least one subject.")]) else: seminar.subjects = subjects seminar.is_conference = process_user_input(data.get("is_conference"), "is_conference", "boolean", None) if seminar.is_conference: seminar.frequency = 1 seminar.per_day = 4 seminar.name = data.get("name", "") seminar.institutions = clean_institutions(data.get("institutions")) if seminar.institutions: seminar.timezone = db.institutions.lookup(seminar.institutions[0], "timezone") lock = get_lock(shortname, data.get("lock")) title = "Create series" if new else "Edit series" manage = "Manage" if current_user.is_organizer else "Create" return render_template( "edit_seminar.html", seminar=seminar, title=title, section=manage, subsection="editsem", institutions=institutions(), short_weekdays=short_weekdays, timezones=timezones, max_slots=MAX_SLOTS, lock=lock, )
def edit_talk(): if request.method == 'POST': data = request.form else: data = request.args resp, seminar, talk = can_edit_talk(data.get("seminar_id", ""), data.get("seminar_ctr", ""), data.get("token", "")) if resp is not None: return resp #lock = get_lock(seminar_id, data.get("lock")) title = "Create talk" if talk.new else "Edit talk" return render_template("edit_talk.html", talk=talk, seminar=seminar, title=title, top_menu=basic_top_menu(), categories=categories(), institutions=institutions(), timezones=timezones)
def edit_seminar(): if request.method == 'POST': data = request.form else: data = request.args shortname = data.get("shortname", "") new = (data.get("new") == "yes") resp, seminar = can_edit_seminar(shortname, new) if resp is not None: return resp lock = get_lock(shortname, data.get("lock")) title = "Create seminar" if new else "Edit seminar" return render_template("edit_seminar.html", seminar=seminar, title=title, top_menu=basic_top_menu(), categories=categories(), institutions=institutions(), weekdays=weekdays, timezones=timezones, lock=lock)
def index(): # TODO: use a join for the following query seminars = [] conferences = [] for semid in db.seminar_organizers.search({"email": current_user.email}, "seminar_id"): seminar = WebSeminar(semid) if seminar.is_conference: conferences.append(seminar) else: seminars.append(seminar) manage = "Manage" if current_user.is_organizer else "Create" return render_template( "create_index.html", seminars=seminars, conferences=conferences, institution_known=institution_known, institutions=institutions(), section=manage, subsection="home", title=manage, user_is_creator=current_user.is_creator, )
def edit_seminar(): if request.method == "POST": data = request.form else: data = request.args shortname = data.get("shortname", "") new = data.get("new") == "yes" resp, seminar = can_edit_seminar(shortname, new) if resp is not None: return resp if new: seminar.is_conference = process_user_input(data.get("is_conference"), "boolean", None) if seminar.is_conference: seminar.frequency = 1 seminar.per_day = 4 seminar.name = data.get("name", "") seminar.institutions = clean_institutions(data.get("institutions")) if seminar.institutions: seminar.timezone = db.institutions.lookup(seminar.institutions[0], "timezone") lock = get_lock(shortname, data.get("lock")) title = "conference" if seminar.is_conference else "seminar" title = "Create " + title if new else "Edit " + title + " properties" manage = "Manage" if current_user.is_organizer else "Create" return render_template( "edit_seminar.html", seminar=seminar, title=title, section=manage, subsection="editsem", institutions=institutions(), weekdays=weekdays, timezones=timezones, lock=lock, )
def index(): # TODO: use a join for the following query seminars = {} conferences = {} deleted_seminars = [] deleted_talks = [] def key(elt): role_key = {"organizer": 0, "curator": 1, "creator": 3} return (role_key[elt[1]], elt[0].name) for rec in db.seminar_organizers.search( {"email": ilike_query(current_user.email)}, ["seminar_id", "curator"]): semid = rec["seminar_id"] role = "curator" if rec["curator"] else "organizer" seminar = WebSeminar(semid) pair = (seminar, role) if seminar.is_conference: conferences[semid] = pair else: seminars[semid] = pair role = "creator" for semid in seminars_search({"owner": ilike_query(current_user.email)}, "shortname", include_deleted=True): if semid not in seminars and semid not in conferences: seminar = WebSeminar(semid, deleted=True) # allow deleted pair = (seminar, role) if seminar.deleted: deleted_seminars.append(seminar) elif seminar.is_conference: conferences[semid] = pair else: seminars[semid] = pair seminars = sorted(seminars.values(), key=key) conferences = sorted(conferences.values(), key=key) deleted_seminars.sort(key=lambda sem: sem.name) for semid, semctr in db._execute( # ~~* is case insensitive amtch SQL(""" SELECT DISTINCT ON ({Ttalks}.{Csemid}, {Ttalks}.{Csemctr}) {Ttalks}.{Csemid}, {Ttalks}.{Csemctr} FROM {Ttalks} INNER JOIN {Tsems} ON {Ttalks}.{Csemid} = {Tsems}.{Csname} WHERE {Tsems}.{Cowner} ~~* %s AND {Ttalks}.{Cdel} = %s AND {Tsems}.{Cdel} = %s """).format( Ttalks=IdentifierWrapper("talks"), Tsems=IdentifierWrapper("seminars"), Csemid=IdentifierWrapper("seminar_id"), Csemctr=IdentifierWrapper("seminar_ctr"), Csname=IdentifierWrapper("shortname"), Cowner=IdentifierWrapper("owner"), Cdel=IdentifierWrapper("deleted"), ), [ilike_escape(current_user.email), True, False], ): talk = WebTalk(semid, semctr, deleted=True) deleted_talks.append(talk) deleted_talks.sort(key=lambda talk: (talk.seminar.name, talk.start_time)) manage = "Manage" if current_user.is_organizer else "Create" return render_template( "create_index.html", seminars=seminars, conferences=conferences, deleted_seminars=deleted_seminars, deleted_talks=deleted_talks, institution_known=institution_known, institutions=institutions(), section=manage, subsection="home", title=manage, user_is_creator=current_user.is_creator, )