def slugify(s): s = slugify_unicode(s, separator="_", to_lower=True) if s == "": return "_" if s[0] in digits: s = f"_{s}" return s
def url_filter(key, value, format_, meta): ''' Filter special links. If a link is of the form '!STRING', use the bang-expression to search DuckDuckGo. So for instance (with markdown) '[Fishmans](!w)' would search Wikipedia for "Fishmans". If a link is empty, like '[About me]()', then automatically link to the slug-form of the text; in this case, the link would be transformed to '[About me](./about-me)' (or whatever equivalent in the output format). ''' if key == 'Link': [txt, [url, attr]] = value if url == "!w": url = "https://en.wikipedia.org/wiki/" + stringify(txt) elif url.startswith("!w%20"): url = "https://en.wikipedia.org/wiki/" + url[len("!w%20"):] elif url == "!wja": url = "https://ja.wikipedia.org/wiki/" + stringify(txt) elif url.startswith("!wja%20"): url = "https://ja.wikipedia.org/wiki/" + url[len("!wja%20"):] elif url.startswith("!"): url = "http://duckduckgo.com/?q=" + url + " " + stringify(txt) elif url == '': # So we want to internally link txt url = slugify_unicode(stringify(txt), to_lower=True) url = "./" + url return Link(txt, [url, attr])
def clean(self): """Ensures all :class: `core.documents.FormGroup` instances for this document have their slug set.""" for group in self.groups: if not group.slug: group.slug = slugify_unicode(group.name).lower() return super(Form, self).clean()
def message_list(): page_title = _('Messages') template_name = 'frontend/message_list.html' qs = messages.all().order_by('-received') queryset_filter = filters.messages_filterset()(qs, request.args) if request.args.get('export'): # Export requested dataset = messages.export_list(qs) basename = slugify_unicode( '%s messages %s' % (g.event.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'))) content_disposition = 'attachment; filename=%s.csv' % basename return Response(dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv") else: data = request.args.to_dict() page = int(data.pop('page', 1)) context = { 'page_title': page_title, 'filter_form': queryset_filter.form, 'args': data, 'pager': queryset_filter.qs.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')) } return render_template(template_name, **context)
def message_list(): page_title = _('Messages') template_name = 'frontend/message_list.html' qs = messages.all().order_by('-received') queryset_filter = filters.messages_filterset()(qs, request.args) if request.args.get('export'): # Export requested dataset = messages.export_list(qs) basename = slugify_unicode('%s messages %s' % ( g.event.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'))) content_disposition = 'attachment; filename=%s.csv' % basename return Response( dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv" ) else: data = request.args.to_dict() page = int(data.pop('page', 1)) context = { 'page_title': page_title, 'filter_form': queryset_filter.form, 'args': data, 'pager': queryset_filter.qs.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')) } return render_template(template_name, **context)
def download_filename(self): """ download filename """ ext = mimetypes.guess_extension(self.content_type) filename = '.'.join([self.name, ext]) return slugify_unicode(filename, ok=settings.VALID_LABEL_CHARACTERS)
def locations_list(): template_name = 'frontend/location_list.html' page_title = _('Locations') queryset = services.locations.find() queryset_filter = filters.location_filterset()(queryset, request.args) args = request.args.copy() page = int(args.pop('page', '1')) subset = queryset_filter.qs.order_by('location_type') if request.args.get('export') and permissions.export_locations.can(): # Export requested dataset = services.locations.export_list(queryset_filter.qs) basename = slugify_unicode('%s locations %s' % ( g.event.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'))) content_disposition = 'attachment; filename=%s.csv' % basename return Response( dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv" ) else: ctx = dict( args=args, filter_form=queryset_filter.form, page_title=page_title, form=DummyForm(), locations=subset.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE'))) return render_template(template_name, **ctx)
def clean(self): '''Ensures all :class: `core.documents.FormGroup` instances for this document have their slug set.''' for group in self.groups: if not group.slug: group.slug = slugify_unicode(group.name).lower() return super(Form, self).clean()
def add_event(room, event): url = external_url('schedule.line_up_proposal', proposal_id=event['id'], slug=None) event_node = etree.SubElement(room, 'event', id=str(event['id']), guid=str(uuid5(NAMESPACE_URL, url))) _add_sub_with_text(event_node, 'room', room.attrib['name']) _add_sub_with_text(event_node, 'title', event['title']) _add_sub_with_text(event_node, 'type', event.get('type', 'talk')) _add_sub_with_text(event_node, 'date', event['start_date'].isoformat()) # Start time _add_sub_with_text(event_node, 'start', event['start_date'].strftime('%H:%M')) duration = get_duration(event['start_date'], event['end_date']) _add_sub_with_text(event_node, 'duration', duration) _add_sub_with_text(event_node, 'abstract', event['description']) _add_sub_with_text(event_node, 'description', event['description']) _add_sub_with_text( event_node, 'slug', 'emf%s-%s-%s' % (event_start().year, event['id'], slugify_unicode(event['title']).lower())) _add_sub_with_text(event_node, 'subtitle', '') _add_sub_with_text(event_node, 'track', '') add_persons(event_node, event) add_recording(event_node, event)
def save(self, *args, **kwargs): # force_insert=False, force_update=False, using=None, # update_fields=None, commit=True, one_pass=True, import slugify self.url = slugify.slugify_unicode(self.title, ) instance = super(Comment, self, ).save(*args, **kwargs) # instance.save() print instance return instance
def quality_assurance_list(form_id): form = services.forms.get_or_404(pk=form_id, form_type='CHECKLIST') page_title = _(u'Quality Assurance — %(name)s', name=form.name) filter_class = generate_quality_assurance_filter(form) data = request.args.to_dict() data['form_id'] = unicode(form.pk) page = int(data.pop('page', 1)) loc_types = displayable_location_types(is_administrative=True) location = None if request.args.get('location'): location = services.locations.find( pk=request.args.get('location')).first() if request.args.get('export') and permissions.export_submissions.can(): mode = request.args.get('export') queryset = services.submissions.find( submission_type='O', form=form ).order_by('location', 'contributor') query_filterset = filter_class(queryset, request.args) dataset = services.submissions.export_list( query_filterset.qs, g.deployment) basename = slugify_unicode('%s %s %s %s' % ( g.event.name.lower(), form.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'), mode)) content_disposition = 'attachment; filename=%s.csv' % basename return Response( dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv" ) submissions = services.submissions.find(form=form, submission_type='O') query_filterset = filter_class(submissions, request.args) filter_form = query_filterset.form VERIFICATION_OPTIONS = services.submissions.__model__.VERIFICATION_OPTIONS context = { 'form': form, 'args': data, 'filter_form': filter_form, 'page_title': page_title, 'location_types': loc_types, 'location': location, 'pager': query_filterset.qs.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')), 'submissions': submissions, 'quality_statuses': QUALITY_STATUSES, 'verification_statuses': VERIFICATION_OPTIONS } template_name = 'frontend/quality_assurance_list.html' return render_template(template_name, **context)
def slug(self): slug = slugify_unicode(self.summary).lower() if len(slug) > 60: words = re.split(' +|[,.;:!?]+', self.summary) break_words = ['and', 'which', 'with', 'without', 'for', '-', ''] for i, word in reversed(list(enumerate(words))): new_slug = slugify_unicode(' '.join(words[:i])).lower() if word in break_words: if len(new_slug) > 10 and not len(new_slug) > 60: slug = new_slug break elif len(slug) > 60 and len(new_slug) > 10: slug = new_slug if len(slug) > 60: slug = slug[:60] + '-' return slug
def slug(self): slug = slugify_unicode(self.summary).lower() if len(slug) > 60: words = re.split(" +|[,.;:!?]+", self.summary) break_words = ["and", "which", "with", "without", "for", "-", ""] for i, word in reversed(list(enumerate(words))): new_slug = slugify_unicode(" ".join(words[:i])).lower() if word in break_words: if len(new_slug) > 10 and not len(new_slug) > 60: slug = new_slug break elif len(slug) > 60 and len(new_slug) > 10: slug = new_slug if len(slug) > 60: slug = slug[:60] + "-" return slug
def compile_choice(environment, concept, parent_rule, directives): logger.debug('Compiling choice for %s:%s:\n%r', concept, parent_rule, directives) if is_text(directives): directives = [directives] intro, directives, subsituations = compile_directives(environment, concept, parent_rule, directives) subrule = environment.location_separator.join( [parent_rule, slugify_unicode(get_text(intro), to_lower=True)] ) try: return ( types.Choice(subrule), {subrule: types.Situation(intro, directives), **merge_dicts(*subsituations)} ) except Exception as e: raise exceptions.ParseError('%s: %s' % (e.__class__.__name__, e.args[0]))
def deserialize(cls, form, data): groups = [] # verify that first field is always a group if len(data['fields']) > 0: if data['fields'][0]['component'] != 'group': raise ValueError('Fields specified outside of group') for f in data['fields']: if f['component'] == 'group': group = FormGroup(name=f['label'], slug=slugify_unicode(f['label'])) groups.append(group) continue field = FormField( name=f['label'], description=f['description'], ) if f['analysis']: field.analysis_type = f['analysis'] if f['component'] == 'textarea': field.is_comment_field = True field.analysis_type = 'N/A' # is always False elif f['component'] == 'textInput': field.represents_boolean = f['required'] if f['min']: field.min_value = f['min'] if f['max']: field.max_value = f['max'] else: field.options = {k: v for v, k in enumerate(f['options'], 1)} if f['component'] == 'checkbox': field.allows_multiple_values = True group.fields.append(field) form.groups = groups # frag the field cache so it's regenerated try: delattr(form, '_field_cache') except AttributeError: pass form.save()
def deserialize(cls, form, data): groups = [] # verify that first field is always a group if len(data["fields"]) > 0: if data["fields"][0]["component"] != "group": raise ValueError("Fields specified outside of group") for f in data["fields"]: if f["component"] == "group": group = FormGroup(name=f["label"], slug=slugify_unicode(f["label"])) groups.append(group) continue field = FormField(name=f["label"], description=f["description"]) if f["analysis"]: field.analysis_type = f["analysis"] if f["component"] == "textarea": field.is_comment_field = True field.analysis_type = "N/A" # is always False elif f["component"] == "textInput": field.represents_boolean = f["required"] if f["min"]: field.min_value = f["min"] if f["max"]: field.max_value = f["max"] else: field.options = {k: v for v, k in enumerate(f["options"], 1)} if f["component"] == "checkbox": field.allows_multiple_values = True group.fields.append(field) form.groups = groups # frag the field cache so it's regenerated try: delattr(form, "_field_cache") except AttributeError: pass form.save()
def add_event(room, event): event_node = etree.SubElement(room, 'event', id=str(event['id'])) _add_sub_with_text(event_node, 'room', room.attrib['name']) _add_sub_with_text(event_node, 'title', event['title']) _add_sub_with_text(event_node, 'type', event.get('type', 'talk')) _add_sub_with_text(event_node, 'date', event['start_date'].isoformat()) # Start time _add_sub_with_text(event_node, 'start', event['start_date'].strftime('%H:%M')) duration = get_duration(event['start_date'], event['end_date']) _add_sub_with_text(event_node, 'duration', duration) _add_sub_with_text(event_node, 'abstract', event['description']) _add_sub_with_text(event_node, 'description', event['description']) _add_sub_with_text(event_node, 'slug', 'emf2016-%s-%s' % (event['id'], slugify_unicode(event['title']).lower())) _add_sub_with_text(event_node, 'subtitle', '') _add_sub_with_text(event_node, 'track', '')
def message_list(): page_title = _('Messages') template_name = 'frontend/message_list.html' deployment = g.deployment message_events = set(events.overlapping_events(g.event)).union({g.event}) qs = Message.objects(deployment=deployment, event__in=message_events).order_by( '-received', '-direction') queryset_filter = filters.messages_filterset()(qs, request.args) if request.args.get('export') and permissions.export_messages.can(): # Export requested dataset = messages.export_list(queryset_filter.qs) basename = slugify_unicode( '%s messages %s' % (g.event.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'))) content_disposition = 'attachment; filename=%s.csv' % basename return Response(dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv") else: data = request.args.to_dict(flat=False) page_spec = data.pop(u'page', None) or [1] page = int(page_spec[0]) context = { 'page_title': page_title, 'filter_form': queryset_filter.form, 'args': data, 'pager': queryset_filter.qs.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')), 'chart_data': message_time_series(queryset_filter.qs) } return render_template(template_name, **context)
def save(self, *args, **kwargs): self.slug = slugify_unicode(self.org_name, separator='_') super(User, self).save(*args, **kwargs)
def participant_list(page=1): page_title = _('Participants') template_name = 'frontend/participant_list.html' sortable_columns = { 'id': 'participant_id', 'name': 'name', 'gen': 'gender' } try: extra_fields = filter( lambda f: getattr(f, 'listview_visibility', False) is True, g.deployment.participant_extra_fields) except AttributeError: extra_fields = [] location = None if request.args.get('location'): location = services.locations.find( pk=request.args.get('location')).first() for field in extra_fields: sortable_columns.update({field.name: field.name}) queryset = services.participants.find() queryset_filter = filters.participant_filterset()(queryset, request.args) form = DummyForm(request.form) if request.form.get('action') == 'send_message': message = request.form.get('message', '') recipients = filter( lambda x: x is not '', [participant.phone if participant.phone else '' for participant in queryset_filter.qs]) recipients.extend(current_app.config.get('MESSAGING_CC')) if message and recipients and permissions.send_messages.can(): send_messages.delay(str(g.event.pk), message, recipients) return 'OK' else: abort(400) if request.args.get('export') and permissions.export_participants.can(): # Export requested dataset = services.participants.export_list(queryset_filter.qs) basename = slugify_unicode('%s participants %s' % ( g.event.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'))) content_disposition = 'attachment; filename=%s.csv' % basename return Response( dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv" ) else: # request.args is immutable, so the .pop() call will fail on it. # using .copy() returns a mutable version of it. args = request.args.copy() page = int(args.pop('page', '1')) sort_by = sortable_columns.get( args.pop('sort_by', ''), 'participant_id') subset = queryset_filter.qs.order_by(sort_by) # load form context context = dict( args=args, extra_fields=extra_fields, filter_form=queryset_filter.form, form=form, location=location, page_title=page_title, location_types=helpers.displayable_location_types( is_administrative=True), participants=subset.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')) ) return render_template( template_name, **context )
def save(self, *args, **kwargs): self.slug = slugify_unicode(self.name) super(Bank, self).save(*args, **kwargs)
def slugify_name(self, name): """Slufigy name with underscore""" self.name = slugify_unicode(name, separator='_')
def slug(self): return slugify_unicode(self.title,)
def clean(self): if not self.slug: self.slug = slugify_unicode(self.name).lower() self.ancestor_count = len(self.ancestors_ref) return super(LocationType, self).clean()
def save(self, *args, **kwargs): if not self.slug: self.slug = slugify_unicode(self.ProName, allow_unicode=True) super(Product, self).save(*args, **kwargs)
#!/usr/bin/python # -*- coding: utf-8 -*- import sys from slugify import slugify_unicode if __name__ == '__main__': line = sys.stdin.next() slug = slugify_unicode(line, to_lower=True).encode('utf-8') sys.stdout.write(slug)
def participant_list(page=1): page_title = _('Participants') template_name = 'frontend/participant_list.html' sortable_columns = { 'id': 'participant_id', 'name': 'name', 'gen': 'gender' } extra_fields = g.deployment.participant_extra_fields or [] location = None if request.args.get('location'): location = services.locations.find( pk=request.args.get('location')).first() for field in extra_fields: sortable_columns.update({field.name: field.name}) queryset = services.participants.find() queryset_filter = filters.participant_filterset()(queryset, request.args) form = DummyForm(request.form) if request.form.get('action') == 'send_message': message = request.form.get('message', '') recipients = [participant.phone if participant.phone else '' for participant in queryset_filter.qs] recipients.extend(current_app.config.get('MESSAGING_CC')) if message and recipients: send_messages.delay(str(g.event.pk), message, recipients) return 'OK' else: abort(400) if request.args.get('export'): # Export requested dataset = services.participants.export_list(queryset_filter.qs) basename = slugify_unicode('%s participants %s' % ( g.event.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'))) content_disposition = 'attachment; filename=%s.csv' % basename return Response( dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv" ) else: # request.args is immutable, so the .pop() call will fail on it. # using .copy() returns a mutable version of it. args = request.args.copy() page = int(args.pop('page', '1')) sort_by = sortable_columns.get( args.pop('sort_by', ''), 'participant_id') subset = queryset_filter.qs.order_by(sort_by) # load form context context = dict( args=args, extra_fields=extra_fields, filter_form=queryset_filter.form, form=form, location=location, page_title=page_title, location_types=helpers.displayable_location_types( is_administrative=True), participants=subset.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')) ) return render_template( template_name, **context )
def slug(s): return slugify_unicode(s, to_lower=True)
def submission_list(form_id): form = services.forms.get_or_404(pk=form_id) permissions.require_item_perm('view_forms', form) filter_class = generate_submission_filter(form) page_title = form.name template_name = 'frontend/submission_list.html' data = request.args.to_dict() data['form_id'] = unicode(form.pk) page = int(data.pop('page', 1)) loc_types = displayable_location_types(is_administrative=True) location = None if request.args.get('location'): location = services.locations.find( pk=request.args.get('location')).first() if request.args.get('export') and permissions.export_submissions.can(): mode = request.args.get('export') if mode in ['master', 'aggregated']: queryset = services.submissions.find( submission_type='M', form=form ).order_by('location') else: queryset = services.submissions.find( submission_type='O', form=form ).order_by('location', 'contributor') query_filterset = filter_class(queryset, request.args) basename = slugify_unicode('%s %s %s %s' % ( g.event.name.lower(), form.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'), mode)) content_disposition = 'attachment; filename=%s.csv' % basename if mode == 'aggregated': # TODO: you want to change the float format or even remove it # if you have columns that have float values dataset = aggregated_dataframe(query_filterset.qs, form)\ .to_csv(encoding='utf-8', index=False, float_format='%d') else: dataset = services.submissions.export_list( query_filterset.qs, g.deployment) return Response( dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv" ) # first retrieve observer submissions for the form # NOTE: this implicitly restricts selected submissions # to the currently selected event. queryset = services.submissions.find( submission_type='O', form=form ).order_by('location', 'contributor') query_filterset = filter_class(queryset, request.args) filter_form = query_filterset.form if request.form.get('action') == 'send_message': message = request.form.get('message', '') recipients = filter( lambda x: x is not '', [submission.contributor.phone if submission.contributor and submission.contributor.phone else '' for submission in query_filterset.qs.only( 'contributor').select_related(1)]) recipients.extend(current_app.config.get('MESSAGING_CC')) if message and recipients and permissions.send_messages.can(): send_messages.delay(str(g.event.pk), message, recipients) return 'OK' else: abort(400) if form.form_type == 'CHECKLIST': form_fields = [] else: form_fields = [field for group in form.groups for field in group.fields if not field.is_comment_field] return render_template( template_name, args=data, filter_form=filter_form, form=form, form_fields=form_fields, location_types=loc_types, location=location, page_title=page_title, pager=query_filterset.qs.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')) )
def submission_list(form_id): form = services.forms.get_or_404(pk=form_id) permissions.require_item_perm('view_forms', form) filter_class = generate_submission_filter(form) page_title = form.name template_name = 'frontend/submission_list.html' data = request.args.to_dict() data['form_id'] = unicode(form.pk) page = int(data.pop('page', 1)) loc_types = displayable_location_types(is_administrative=True) location = None if request.args.get('location'): location = services.locations.find( pk=request.args.get('location')).first() if request.args.get('export'): mode = request.args.get('export') if mode == 'master': queryset = services.submissions.find( submission_type='M', form=form ) else: queryset = services.submissions.find( submission_type='O', form=form ) query_filterset = filter_class(queryset, request.args) dataset = services.submissions.export_list( query_filterset.qs, g.deployment) basename = slugify_unicode('%s %s %s %s' % ( g.event.name.lower(), form.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'), mode)) content_disposition = 'attachment; filename=%s.csv' % basename return Response( dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv" ) # first retrieve observer submissions for the form # NOTE: this implicitly restricts selected submissions # to the currently selected event. queryset = services.submissions.find( submission_type='O', form=form ) query_filterset = filter_class(queryset, request.args) filter_form = query_filterset.form if request.form.get('action') == 'send_message': message = request.form.get('message', '') recipients = [submission.contributor.phone if submission.contributor and submission.contributor.phone else '' for submission in query_filterset.qs] recipients.extend(current_app.config.get('MESSAGING_CC')) if message and recipients: send_messages.delay(str(g.event.pk), message, recipients) return 'OK' else: abort(400) if form.form_type == 'CHECKLIST': form_fields = [] else: form_fields = [field for group in form.groups for field in group.fields] if request.args.get('export'): # Export requested # TODO: complete export functionality return "" else: return render_template( template_name, args=data, filter_form=filter_form, form=form, form_fields=form_fields, location_types=loc_types, location=location, page_title=page_title, pager=query_filterset.qs.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')) )
def __call__(self, string): if any(character not in VALID_ASCII for character in string): return slugify_unicode(string).replace('-', '').lower() else: return self.slug(string)
def submission_list(form_id): form = services.forms.get_or_404(pk=form_id) permissions.require_item_perm('view_forms', form) filter_class = generate_submission_filter(form) page_title = form.name template_name = 'frontend/submission_list.html' data = request.args.to_dict() data['form_id'] = unicode(form.pk) page = int(data.pop('page', 1)) loc_types = displayable_location_types(is_administrative=True) location = None if request.args.get('location'): location = services.locations.find( pk=request.args.get('location')).first() if request.args.get('export'): mode = request.args.get('export') if mode == 'master': queryset = services.submissions.find(submission_type='M', form=form) else: queryset = services.submissions.find(submission_type='O', form=form) query_filterset = filter_class(queryset, request.args) dataset = services.submissions.export_list(query_filterset.qs, g.deployment) basename = slugify_unicode( '%s %s %s %s' % (g.event.name.lower(), form.name.lower(), datetime.utcnow().strftime('%Y %m %d %H%M%S'), mode)) content_disposition = 'attachment; filename=%s.csv' % basename return Response(dataset, headers={'Content-Disposition': content_disposition}, mimetype="text/csv") # first retrieve observer submissions for the form # NOTE: this implicitly restricts selected submissions # to the currently selected event. queryset = services.submissions.find(submission_type='O', form=form) query_filterset = filter_class(queryset, request.args) filter_form = query_filterset.form if request.form.get('action') == 'send_message': message = request.form.get('message', '') recipients = [ submission.contributor.phone if submission.contributor and submission.contributor.phone else '' for submission in query_filterset.qs ] recipients.extend(current_app.config.get('MESSAGING_CC')) if message and recipients: send_messages.delay(str(g.event.pk), message, recipients) return 'OK' else: abort(400) if form.form_type == 'CHECKLIST': form_fields = [] else: form_fields = [ field for group in form.groups for field in group.fields ] if request.args.get('export'): # Export requested # TODO: complete export functionality return "" else: return render_template( template_name, args=data, filter_form=filter_form, form=form, form_fields=form_fields, location_types=loc_types, location=location, page_title=page_title, pager=query_filterset.qs.paginate( page=page, per_page=current_app.config.get('PAGE_SIZE')))
def add_event(room, event): url = external_url('schedule.line_up_proposal', proposal_id=event['id'], slug=None) event_node = etree.SubElement(room, 'event', id=str(event['id']), guid=str(uuid5(NAMESPACE_URL, url))) _add_sub_with_text(event_node, 'room', room.attrib['name']) _add_sub_with_text(event_node, 'title', event['title']) _add_sub_with_text(event_node, 'type', event.get('type', 'talk')) _add_sub_with_text(event_node, 'date', event['start_date'].isoformat()) # Start time _add_sub_with_text(event_node, 'start', event['start_date'].strftime('%H:%M')) duration = get_duration(event['start_date'], event['end_date']) _add_sub_with_text(event_node, 'duration', duration) _add_sub_with_text(event_node, 'abstract', event['description']) _add_sub_with_text(event_node, 'description', event['description']) _add_sub_with_text(event_node, 'slug', 'emf%s-%s-%s' % (event_start().year, event['id'], slugify_unicode(event['title']).lower())) _add_sub_with_text(event_node, 'subtitle', '') _add_sub_with_text(event_node, 'track', '') add_persons(event_node, event) add_recording(event_node, event)
from slugify import slugify_unicode slugify = lambda x, y: slugify_unicode(x, separator=y)
def slug(self): return slugify_unicode(self.series.title)
def test_slugify_unicode(self): self.assertEqual(slugify_unicode('-=Слово по-русски=-'), u'Слово-по-русски') self.assertEqual(slugify_unicode('слово_по_русски'), u'слово-по-русски')
def handle_chamber(chamber_name, source_url, data, term_data): resp = requests.get(source_url) root = lxml.html.fromstring(resp.text) terms = [(x.find('span').text.strip(), urljoin(source_url, x.get('href'))) for x in root.cssselect('.menu-treemenu')[0].cssselect('a')] for term_name, term_url in terms: term_number, start_date, end_date = re.match(r'(\d*)[^\d]+(\d{4})[ -]+(\d{4})', term_name).groups() term = { 'name': term_name, 'id': term_name, 'start_date': int(start_date), 'end_date': int(end_date), 'term_number': int(term_number) if term_number else 0, } term_data.append(term) while term_url: print term_url term_resp = requests.get(term_url) term_root = lxml.html.fromstring(term_resp.text) trs = term_root.cssselect('.jsn-infotable')[0].cssselect('tr')[1:] for tr in trs: member = {} member['term'] = term_name member['term_id'] = term_name member['chamber'] = chamber_name # There are no constituencies, it's a central party list system member['area'] = '' name_link = tr.cssselect('.jsn-table-column-name')[0].find('a') name, note = re.match(r'\s+([^\(]+)\s*(?:\((.+)\)+)?', name_link.text).groups() member['name'] = name.strip() if note: member['note'] = note member['id'] = slugify_unicode(member['name']) details_url = member['details_url'] = urljoin(source_url, name_link.get('href')) try: member['party'] = tr.cssselect('.jsn-table-column-country')[0].text.strip() except AttributeError: # Karupu, Sebastiaan, for example, has nothing in this column. # http://www.parliament.gov.na/index.php?option=com_contact&view=category&id=104&Itemid=1479&limitstart=40 member['party'] = '' try: script = tr.cssselect('.jsn-table-column-email')[0].getchildren()[0].text_content() except (AttributeError, IndexError): # No no email for this person. script = None else: member['email'] = unjs_email(script) # # Get hold of the lines of javascript which aren't fiddling with the DOM # jslines = [x.strip() for x in re.search(r'<!--(.*)//-->', mailto_script, re.M | re.S).group(1).strip().splitlines() if not x.strip().startswith('document')] # # The name of the variable containing the variable containing the email address # # varies, so find it by regex. # varname = re.search(r'var (addy\d+)', mailto_script).group(1) # jslines.append('return {}'.format(varname)) # js = '(function() {{{}}})()'.format(' '.join(jslines)) # member['email'] = unescape(execjs.eval(js)) details_resp = requests.get(details_url) details_root = lxml.html.fromstring(details_resp.text) key = (member['name'], member['term']) try: src = details_root.cssselect('.jsn-contact-image')[0].cssselect('img')[0].get('src') if src: member['image'] = urljoin(source_url, details_root.cssselect('.jsn-contact-image')[0].cssselect('img')[0].get('src')) else: member['image'] = '' except: print "No image found for {} in {}".format(*key) member['image'] = '' if key in data: print "Duplicate (name, term) pair ignored: ({}, {})".format(*key) else: data[key] = member next_links = term_root.cssselect('a[title=Next]') term_url = urljoin(term_url, next_links[0].get('href')) if next_links else None