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
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)
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)
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')
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
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
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
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
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), }
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
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
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, }