Example #1
0
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])
Example #3
0
def slugify(s):
    s = slugify_unicode(s, separator="_", to_lower=True)
    if s == "":
        return "_"
    if s[0] in digits:
        s = f"_{s}"
    return s
Example #4
0
 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()
Example #5
0
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)
Example #6
0
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)
Example #7
0
 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)
Example #9
0
 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()
Example #10
0
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)
Example #11
0
 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
Example #12
0
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)
Example #13
0
    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
Example #14
0
    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
Example #15
0
    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
Example #16
0
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]))
Example #17
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()
Example #18
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()
Example #19
0
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', '')
Example #20
0
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)
Example #21
0
 def save(self, *args, **kwargs):
     self.slug = slugify_unicode(self.org_name, separator='_')
     super(User, self).save(*args, **kwargs)
Example #22
0
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
        )
Example #23
0
 def save(self, *args, **kwargs):
     self.slug = slugify_unicode(self.name)
     super(Bank, self).save(*args, **kwargs)
Example #24
0
 def slugify_name(self, name):
     """Slufigy name with underscore"""
     self.name = slugify_unicode(name, separator='_')
 def slug(self):
     return slugify_unicode(self.title,)
Example #26
0
 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()
Example #27
0
 def save(self, *args, **kwargs):
     if not self.slug:
         self.slug = slugify_unicode(self.ProName, allow_unicode=True)
     super(Product, self).save(*args, **kwargs)
Example #28
0
#!/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)
Example #29
0
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
        )
Example #30
0
def slug(s):
    return slugify_unicode(s, to_lower=True)
Example #31
0
 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()
Example #32
0
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'))
    )
Example #33
0
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'))
        )
Example #34
0
 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)
Example #35
0
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')))
Example #36
0
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)
Example #37
0
from slugify import slugify_unicode

slugify = lambda x, y: slugify_unicode(x, separator=y)
 def slug(self):
     return slugify_unicode(self.series.title)
Example #39
0
 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