def view(self):
     with session_scope() as session:
         ss = session.query(Game).filter(
             Game.completions.any(Completion.status_id == 2),
             ~Game.quotations.any(Quotation.tags.any(Tag.id == get_tag('endless game').id)),
             ~Game.quotations.any(Quotation.tags.any(Tag.id == get_tag('you win').id)))
         return render_template('source/index.html', sources=ss)
 def view(self):
     with session_scope() as session:
         no_type = session.query(Name).filter(Name.type == None)
         no_begin = session.query(Name).filter(
             or_(Name.begin_date == None,
                 Name.begin_date == ''))
         return render_template_string(self.template, no_type=no_type, no_begin=no_begin)
 def view(self):
     with session_scope() as session:
         metadata = defaultdict(lambda: defaultdict(list))
         things = ( session.query(Source).all()
                  + session.query(Term).all()
                  + session.query(Journal).all() )
         for s in things:
             for k, vs in s.user_metadata.items():
                 for v in vs:
                     metadata[k][v].append(s)
         return render_template_string(self.template, metadata=metadata)
 def view(self):
     with session_scope() as session:
         q = session.query(Completion).filter(Completion.end_date != None, Completion.status_id == 2).all()
         if 'individual' in request.args:
             entries = [{
                 'start' : e.start_date.isoformat() if e.start_date else e.end_date.isoformat(),
                 'end' : e.end_date.isoformat() if e.start_date else None,
                 'type' : 'range' if e.start_date and e.start_date != e.end_date else 'point',
                 'content' : e.source.title} for e in q]
         else:
             entries = []
             sers = {}
             for e in q:
                 if not (e.source.series and (e.source.type in ['episode', 'comic', 'periodical'])):
                     entries.append({
                         'start' : e.start_date.isoformat() if e.start_date else e.end_date.isoformat(),
                         'end' : e.end_date.isoformat() if e.start_date else None,
                         'type' : 'range' if e.start_date and e.start_date != e.end_date else 'point',
                         'content' : e.source.title})
                 else:
                     # A series item, so it should be collapsed
                     me = {
                         'start' : e.start_date.isoformat() if e.start_date else e.end_date.isoformat(),
                         'end' : e.end_date.isoformat() if e.start_date else None,
                         'type' : 'range' if e.start_date and e.start_date != e.end_date else 'point',
                         'content' : e.source.series.name}
                     if e.source.series.id in sers:
                         start = sers[e.source.series.id]['start']
                         if start > me['start']:
                             start = me['start']
                         sers[e.source.series.id]['start'] = start
                         end = sers[e.source.series.id]['end']
                         if (not end) or (me['end'] and (end < me['end'])):
                             end = me['end']
                         sers[e.source.series.id]['end'] = end
                     else:
                         sers[e.source.series.id] = me
             for e in sers.values():
                 entries.append({
                     'start' : e['start'],
                     'end' : e['end'] if e['end'] else None,
                     'type' : 'range' if e['end'] else 'point',
                     'content' : e['content']})
         return render_template_string(self.template, entries=entries)
 def view(self):
     with session_scope() as session:
         ss = session.query(Source).filter(Source.roles.any(Role.role_type_id == None))
         return render_template_string(self.template, sources=ss)