def query(self):
     request = self.request
     context = self.context
     q = find_index(context, 'system', 'content_type').eq('Song')
     q = q & find_index(context, 'system', 'allowed').allows(
         request, 'view')
     filter_text = request.params.get('filter_text')
     if filter_text:
         terms = generate_text_filter_terms(filter_text)
         text = find_index(context, 'system', 'text')
         for term in terms:
             if text.check_query(term):
                 q = q & text.eq(term)
     filter_genre = request.params.get('filter_genre')
     if filter_genre:
         q = q & find_index(context, 'yss', 'genre').eq(filter_genre)
     resultset = q.execute()
     sorting = request.params.get('sorting')
     reverse = request.params.get('reverse')
     if reverse == 'false':
         reverse = False
     reverse = bool(reverse)
     if sorting:
         resultset = self.sort_by(resultset, sorting, reverse)
     else:
         resultset = self.sort_by(resultset, self.default_sort, False)
     return resultset
Exemple #2
0
 def query(self):
     request = self.request
     context = self.context
     recordings = context['recordings']
     q = find_index(context, 'system', 'content_type').eq('Recording')
     if context != request.performer:
         q = q & find_index(context, 'yss', 'mixed').eq(True)
     q = q & find_index(context, 'system', 'path').eq(
         request.resource_path(recordings)
     )
     permission = (
         (context == request.performer and 'view' or 'yss.indexed')
         )
     q = q & find_index(context, 'system', 'allowed').allows(
         request, permission)
     filter_text = request.params.get('filter_text')
     if filter_text:
         terms = generate_text_filter_terms(filter_text)
         text = find_index(context, 'yss', 'text')
         for term in terms:
             if text.check_query(term):
                 q = q & text.eq(term)
     resultset = q.execute()
     sorting, reverse = self.get_sort_params()
     resultset = self.sort_by(resultset, sorting, reverse)
     return resultset
def recent_recordings(context, request, limit=10):
    q = find_index(context, 'system', 'content_type').eq('Recording')
    q = q & find_index(context, 'system', 'allowed').allows(
        request, 'view')
    created = find_index(context, 'yss', 'created')
    resultset = q.execute()
    return resultset.sort(created, reverse=True, limit=limit)
 def featured_recordings(self, limit=10):
     request = self.request
     context = self.context
     q = find_index(context, 'system', 'content_type').eq('Recording')
     q = q & find_index(context, 'system', 'allowed').allows(
         request, 'view')
     likes = find_index(context, 'yss', 'likes')
     resultset = q.execute()
     return resultset.sort(likes, reverse=True, limit=limit)
Exemple #5
0
 def featured_recordings(self, limit=10):
     context = self.context
     q = find_index(context, 'system', 'content_type').eq('Recording')
     q = q & find_index(context, 'yss', 'mixed').eq(True)
     q = q & find_index(context, 'system', 'allowed').allows(
         ['system.Everyone'], 'yss.indexed')
     num_likes = find_index(context, 'yss', 'num_likes')
     resultset = q.execute()
     return resultset.sort(num_likes, reverse=True, limit=limit)
Exemple #6
0
 def _invite_code_validator(node, value):
     if not value:
         raise colander.Invalid(node, f'Invitation code required')
     value = value.upper()
     ctindex = find_index(context, 'system', 'content_type')
     nameindex = find_index(context, 'system', 'name')
     q = ctindex.eq('Invitation') & nameindex.eq(value)
     results = list(q.execute())
     if not results:
         raise colander.Invalid(node, f'No such invite code {value}')
     if results[0].redeemer:
         raise colander.Invalid(
             node, f'Sorry, invite code {value} was already redeemed')
Exemple #7
0
 def sort_by(self, rs, token, reverse):
     context = self.context
     name = find_index(context, 'system', 'name')
     num_likes = find_index(context, 'yss', 'num_likes')
     num_recordings = find_index(context, 'yss', 'num_recordings')
     created = find_index(context, 'yss', 'created')
     sorting = {
         'created':(created, num_likes, num_recordings, name),
         'name':(name, num_likes, created, num_recordings),
         'likes':(num_likes, name, num_recordings, created),
         'recordings':(num_recordings, num_likes, name, created),
         }
     indexes = sorting.get(token, sorting[self.default_sort])
     for idx in indexes[1:]:
         rs = rs.sort(idx)
     first = indexes[0]
     rs = rs.sort(first, reverse=reverse)
     return rs
Exemple #8
0
 def query(self):
     request = self.request
     context = self.context
     q = find_index(context, 'yss', 'oid').any(context.likes_songids)
     q = q & find_index(context, 'system', 'content_type').eq('Song')
     q = q & find_index(context, 'system', 'allowed').allows(
         request, 'yss.indexed')
     filter_text = request.params.get('filter_text')
     if filter_text:
         terms = generate_text_filter_terms(filter_text)
         text = find_index(context, 'yss', 'text')
         for term in terms:
             if text.check_query(term):
                 q = q & text.eq(term)
     resultset = q.execute()
     sorting, reverse = self.get_sort_params()
     resultset = self.sort_by(resultset, sorting, reverse)
     return resultset
 def sort_by(self, rs, token, reverse):
     context = self.context
     title = find_index(context, 'yss', 'title')
     likes = find_index(context, 'yss', 'likes')
     genre = find_index(context, 'yss', 'genre')
     created = find_index(context, 'yss', 'created')
     sorting = {
         #'date':(created, likes, title, genre),
         'date':(created,),
         'title':(title, likes, genre, created),
         'genre':(genre, title, likes, created),
         'likes':(likes, title, genre, created),
         }
     indexes = sorting.get(token, sorting['date'])
     for idx in indexes[1:]:
         rs = rs.sort(idx)
     first = indexes[0]
     rs = rs.sort(first, reverse=reverse)
     return rs
Exemple #10
0
 def sort_by(self, rs, token, reverse):
     context = self.context
     title = find_index(context, 'yss', 'title')
     performer = find_index(context, 'yss', 'performer')
     num_likes = find_index(context, 'yss', 'num_likes')
     genre = find_index(context, 'yss', 'genre')
     created = find_index(context, 'yss', 'created')
     sorting = {
         'created':(created, num_likes, title, performer, genre),
         'title':(title, performer, num_likes, genre, created),
         'performer':(performer, title, num_likes, genre, created),
         'genre':(genre, performer, title, num_likes, created),
         'likes':(num_likes, performer, title, genre, created),
         }
     indexes = sorting.get(token, sorting[self.default_sort])
     for idx in indexes[1:]:
         rs = rs.sort(idx)
     first = indexes[0]
     rs = rs.sort(first, reverse=reverse)
     return rs
Exemple #11
0
 def query(self):
     request = self.request
     context = self.context
     q = find_index(context, 'system', 'content_type').eq('Recording')
     q = q & find_index(context, 'system', 'allowed').allows(
         ['system.Everyone'], 'yss.indexed')
     q = q & find_index(context, 'yss', 'mixed').eq(True)
     filter_text = request.params.get('filter_text')
     if filter_text:
         terms = generate_text_filter_terms(filter_text)
         text = find_index(context, 'yss', 'text')
         for term in terms:
             if text.check_query(term):
                 q = q & text.eq(term)
     filter_genre = request.params.get('filter_genre')
     if filter_genre:
         q = q & find_index(context, 'yss', 'genre').eq(filter_genre)
     resultset = q.execute()
     sorting, reverse = self.get_sort_params()
     resultset = self.sort_by(resultset, sorting, reverse)
     return resultset
Exemple #12
0
 def view(self):
     recording = self.context
     request = self.request
     if request.performer is not recording.performer:
         recording.num_views.change(1)
         idx = find_index(recording, 'yss', 'num_views')
         idx.reindex_resource(recording, action_mode=MODE_DEFERRED)
     return {
         'title':recording.title,
         'performer':recording.performer,
         'num_likes':recording.num_likes,
         'num_views':recording.num_views(),
         'liked_by': recording.liked_by,
         'stream_url': request.resource_url(recording, '@@movie'),
         'mixed': recording.mixed,
         'has_edit_permission':int(self.has_edit_permission),
         }
Exemple #13
0
 def sort_by(self, rs, token, reverse):
     context = self.context
     created = find_index(context, 'yss', 'created')
     title = find_index(context, 'yss', 'title')
     num_likes = find_index(context, 'yss', 'num_likes')
     artist = find_index(context, 'yss', 'artist')
     num_recordings = find_index(context, 'yss', 'num_recordings')
     duration = find_index(context, 'yss', 'duration')
     num_likes = find_index(context, 'yss', 'num_likes')
     sorting = {
         'created':(created, artist, title, num_recordings, num_likes),
         'title':(title, artist, num_recordings, created, num_likes),
         'artist':(artist, title, num_recordings, created, num_likes),
         'num_likes':(num_likes, artist, title, num_recordings),
         'num_recordings':(num_recordings, artist, title, num_likes),
         'duration':(duration, artist, title, num_recordings, num_likes),
         }
     indexes = sorting.get(token, sorting[self.default_sort])
     for idx in indexes[1:]:
         rs = rs.sort(idx)
     first = indexes[0]
     rs = rs.sort(first, reverse=reverse)
     return rs
Exemple #14
0
 def sort_by(self, rs, token, reverse):
     context = self.context
     title = find_index(context, 'yss', 'title')
     artist = find_index(context, 'yss', 'artist')
     likes = find_index(context, 'yss', 'likes')
     genre = find_index(context, 'yss', 'genre')
     created = find_index(context, 'yss', 'created')
     duration = find_index(context, 'yss', 'duration')
     sorting = {
         'date':(created, likes, title, artist, genre),
         'title':(title, artist, likes, genre, created),
         'artist':(artist, title, likes, genre, created),
         'genre':(genre, artist, title, likes, created),
         'likes':(likes, artist, title, genre, created),
         'duration':(duration, artist, title, genre, created),
         }
     indexes = sorting.get(token, sorting[self.default_sort])
     for idx in indexes[1:]:
         rs = rs.sort(idx)
     first = indexes[0]
     rs = rs.sort(first, reverse=reverse)
     return rs
Exemple #15
0
def create_profile(context, request):
    schema = CreatePerformerSchema().bind(request=request, context=context)
    form = deform.Form(schema, buttons=('Save',))
    rendered = None
    if 'Save' in request.POST:
        controls = request.POST.items()
        try:
            appstruct = form.validate(controls)
        except deform.ValidationFailure as e:
            rendered = e.render()
        else:
            registry = request.registry
            principals = find_service(context, 'principals')
            root = find_root(context)
            username = appstruct['username']
            userid = request.session.get('userid', username) # socmed signups
            user = principals.add_user(userid, registry=registry)
            performer = registry.content.create('Performer')
            root['performers'][username] = performer
            performer['recordings'] = registry.content.create('Recordings')
            performer['invitations'] = registry.content.create('Invitations')
            performer['invitations'].add_more(10)
            phdata = appstruct['photo']
            fp = phdata.get('fp')
            if fp is not None:
                for photoname, photosize in (
                        ('photo', (320, 320)),
                        ('photo_thumbnail', (40, 40)),
                ):
                    photo = registry.content.create('File')
                    alsoProvides(photo, IPerformerPhoto) # for view lookup
                    performer[photoname] = photo
                    fp.seek(0)
                    pil_image = PIL.Image.open(fp)
                    if pil_image.size[0] != photosize[0]: # width
                        pil_image.thumbnail(photosize, PIL.Image.ANTIALIAS)
                    buffer = io.BytesIO()
                    pil_image.save(buffer, 'png')
                    buffer.seek(0)
                    photo.upload(buffer)
                    photo.mimetype = 'image/png'
            # NB: performer.user required before setting tzname and email
            performer.user = user
            performer.title = appstruct['title']
            performer.email = appstruct['email']
            performer.birthdate = appstruct['birthdate']
            performer.sex = appstruct['sex']
            performer.genre = appstruct['genre']
            performer.tzname = appstruct['tzname']
            performer.location = appstruct['location']
            ctindex = find_index(context, 'system', 'content_type')
            nameindex = find_index(context, 'system', 'name')
            q = ctindex.eq('Invitation') & nameindex.eq(
                appstruct['invite_code'].upper())
            results = list(q.execute())
            if results:
                invitation = results[0]
                invitation.redeemer = performer
                invitation.redemption_date = datetime.datetime.utcnow(
                ).replace(tzinfo=pytz.UTC)
            set_acl(performer, [(Allow, user.__oid__, ['yss.edit'])])
            headers = remember(request, get_oid(user))
            request.session.flash('Your account is created. Welcome!', 'info')
            return HTTPFound(request.resource_url(performer), headers=headers)
    else:
        appstruct = {
            'csrf_token': request.session.get_csrf_token(),
            'username': request.session.get('profilename', ''),
            'title': request.session.get('realname', ''),
            'email': '',
            'photo':colander.null,
            'birthdate': colander.null,
            'sex': colander.null,
            'genre': colander.null,
            'tzname': colander.null,
            'location':colander.null,
        }
    if rendered is None:
        rendered = form.render(appstruct, readonly=False)
    return {
        'form':rendered,
        }