Example #1
0
def review_api():
    decision = request.form.get("submit")
    series = set()
    for series_id in db.seminar_organizers.search(
        {"email": ilike_query(current_user.email)}, "seminar_id"):
        series.add(series_id)
    for series_id in seminars_search(
        {"owner": ilike_query(current_user.email)},
            "shortname",
            include_pending=True):
        series.add(series_id)
    series = list(series)
    if decision == "approve":
        db.seminars.update(
            {
                "shortname": {
                    "$in": series
                },
                "by_api": True,
                "display": False
            }, {"display": True},
            restat=False)
        db.talks.update(
            {
                "seminar_id": {
                    "$in": series
                },
                "by_api": True,
                "display": False
            }, {"display": True},
            restat=False)
    else:
        db.seminars.delete(
            {
                "shortname": {
                    "$in": series
                },
                "by_api": True,
                "display": False
            },
            restat=False)
        db.talks.delete(
            {
                "seminar_id": {
                    "$in": series
                },
                "by_api": True,
                "display": False
            },
            restat=False)
        # Need to check whether new seminars might have been completely deleted
        for series_id in series:
            if db.seminars.lookup(series_id) is None:
                db.seminar_organizers.delete({"seminar_id": series_id})

    return redirect(url_for("create.index"))
Example #2
0
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,
    )