def import_row(self, row):
        # generate slugs
        row['name'] = row['name'].strip()
        row['email'] = row['email'].lower()
        if row['url'] and not row['url'].startswith(('http://', 'https://')):
            row['url'] = 'http://' + row['url']
        row['slug'] = slugify(row['name'])
        row['classification'] = self.get_classification(
            row.pop('classification__slug', None))

        categories = parse_tags(row.pop('categories', ''))
        categories = list(self.get_categories(categories))

        tags = parse_tags(row.pop('tags', ''))
        # Backwards compatible handling of topic__slug
        topic_slug = row.pop('topic__slug', None)
        if topic_slug:
            tags.append(self.get_topic(topic_slug))

        # resolve foreign keys
        row['jurisdiction'] = self.get_jurisdiction(
            row.pop('jurisdiction__slug'))
        parent = row.pop('parent__name', None)
        if parent:
            row['parent'] = PublicBody.objects.get(slug=slugify(parent))

        # get optional values
        for n in ('description', 'other_names', 'request_note',
                  'website_dump'):
            row[n] = row.get(n, '')

        try:
            if 'id' in row and row['id']:
                pb = PublicBody.objects.get(id=row['id'])
            else:
                pb = PublicBody.objects.get(slug=row['slug'])
            # If it exists, update it
            row.pop('id', None)  # Do not update id though
            row['_updated_by'] = self.user
            PublicBody.objects.filter(id=pb.id).update(**row)
            pb.laws.clear()
            pb.laws.add(*row['jurisdiction'].laws)
            pb.tags.set(*tags)
            pb.categories.set(*categories)
            return pb
        except PublicBody.DoesNotExist:
            pass
        row.pop('id', None)  # Remove id if present
        public_body = PublicBody(**row)
        public_body._created_by = self.user
        public_body._updated_by = self.user
        public_body.confirmed = True
        public_body.site = self.site
        public_body.save()
        public_body.laws.add(*row['jurisdiction'].laws)
        public_body.tags.set(*list(tags))
        return public_body
Beispiel #2
0
    def import_row(self, row):
        # generate slugs
        row['name'] = row['name'].strip()
        row['email'] = row['email'].lower()
        if row['url'] and not row['url'].startswith(('http://', 'https://')):
            row['url'] = 'http://' + row['url']
        row['slug'] = slugify(row['name'])
        row['classification_slug'] = slugify(row['classification'])

        def comma_splitter(tag_string):
            return [t.strip() for t in tag_string.split(',') if t.strip()]

        tags = comma_splitter(row.pop('tags', ''))
        # Backwards compatible handling of topic__slug
        topic_slug = row.pop('topic__slug', None)
        if topic_slug:
            tags.append(self.get_topic(topic_slug))

        # resolve foreign keys
        row['jurisdiction'] = self.get_jurisdiction(row.pop('jurisdiction__slug'))
        parent = row.pop('parent__name', None)
        if parent:
            row['parent'] = PublicBody.objects.get(slug=slugify(parent))

        # get optional values
        for n in ('description', 'other_names', 'request_note', 'website_dump'):
            row[n] = row.get(n, '')

        try:
            if 'id' in row and row['id']:
                pb = PublicBody.objects.get(id=row['id'])
            else:
                pb = PublicBody.objects.get(slug=row['slug'])
            # If it exists, update it
            row.pop('id', None)  # Do not update id though
            row['_updated_by'] = self.user
            PublicBody.objects.filter(id=pb.id).update(**row)
            pb.laws.clear()
            pb.laws.add(*row['jurisdiction'].laws)
            pb.tags.set(*tags)
            return
        except PublicBody.DoesNotExist:
            pass
        row.pop('id', None)  # Remove id if present
        public_body = PublicBody(**row)
        public_body._created_by = self.user
        public_body._updated_by = self.user
        public_body.confirmed = True
        public_body.site = self.site
        public_body.save()
        public_body.laws.add(*row['jurisdiction'].laws)
        public_body.tags.set(*list(tags))
Beispiel #3
0
    def import_row(self, row):
        # generate slugs
        row["name"] = row["name"].strip()
        row["email"] = row["email"].lower()
        if row["url"] and not row["url"].startswith(("http://", "https://")):
            row["url"] = "http://" + row["url"]
        row["slug"] = slugify(row["name"])
        row["classification_slug"] = slugify(row["classification"])

        tags = parse_tags(row.pop("tags", ""))
        # Backwards compatible handling of topic__slug
        topic_slug = row.pop("topic__slug", None)
        if topic_slug:
            tags.append(self.get_topic(topic_slug))

        # resolve foreign keys
        row["jurisdiction"] = self.get_jurisdiction(row.pop("jurisdiction__slug"))
        parent = row.pop("parent__name", None)
        if parent:
            row["parent"] = PublicBody.objects.get(slug=slugify(parent))

        # get optional values
        for n in ("description", "other_names", "request_note", "website_dump"):
            row[n] = row.get(n, "")

        try:
            if "id" in row and row["id"]:
                pb = PublicBody.objects.get(id=row["id"])
            else:
                pb = PublicBody.objects.get(slug=row["slug"])
            # If it exists, update it
            row.pop("id", None)  # Do not update id though
            row["_updated_by"] = self.user
            PublicBody.objects.filter(id=pb.id).update(**row)
            pb.laws.clear()
            pb.laws.add(*row["jurisdiction"].laws)
            pb.tags.set(*tags)
            return
        except PublicBody.DoesNotExist:
            pass
        row.pop("id", None)  # Remove id if present
        public_body = PublicBody(**row)
        public_body._created_by = self.user
        public_body._updated_by = self.user
        public_body.confirmed = True
        public_body.site = self.site
        public_body.save()
        public_body.laws.add(*row["jurisdiction"].laws)
        public_body.tags.set(*list(tags))
Beispiel #4
0
    def import_row(self, row):
        # generate slugs
        row['name'] = row['name'].strip()
        row['email'] = row['email'].lower()
        row['slug'] = slugify(row['name'])
        row['classification_slug'] = slugify(row['classification'])

        # resolve foreign keys
        row['topic'] = self.get_topic(row.pop('topic__slug'))
        row['jurisdiction'] = self.get_jurisdiction(
            row.pop('jurisdiction__slug'))
        parent = row.pop('parent__name', None)
        if parent:
            row['parent'] = PublicBody.objects.get(slug=slugify(parent))

        # get optional values
        for n in ('description', 'other_names', 'request_note',
                  'website_dump'):
            row[n] = row.get(n, '')

        try:
            if 'id' in row and row['id']:
                pb = PublicBody.objects.get(id=row['id'])
            else:
                pb = PublicBody.objects.get(slug=row['slug'])
            # If it exists, update it
            row.pop('id', None)  # Do not update id though
            row['_updated_by'] = self.user
            PublicBody.objects.filter(id=pb.id).update(**row)
            pb.laws.clear()
            pb.laws.add(*row['jurisdiction'].laws)
            return
        except PublicBody.DoesNotExist:
            pass
        row.pop('id', None)  # Remove id if present
        public_body = PublicBody(**row)
        public_body._created_by = self.user
        public_body._updated_by = self.user
        public_body.confirmed = True
        public_body.site = self.site
        public_body.save()
        public_body.laws.add(*row['jurisdiction'].laws)
Beispiel #5
0
    def import_row(self, row):
        # generate slugs
        row['name'] = row['name'].strip()
        row['email'] = row['email'].lower()
        row['slug'] = slugify(row['name'])
        row['classification_slug'] = slugify(row['classification'])

        # resolve foreign keys
        row['topic'] = self.get_topic(row.pop('topic__slug'))
        row['jurisdiction'] = self.get_jurisdiction(row.pop('jurisdiction__slug'))
        parent = row.pop('parent__name', None)
        if parent:
            row['parent'] = PublicBody.objects.get(slug=slugify(parent))

        # get optional values
        for n in ('description', 'other_names', 'request_note', 'website_dump'):
            row[n] = row.get(n, '')

        try:
            if 'id' in row and row['id']:
                pb = PublicBody.objects.get(id=row['id'])
            else:
                pb = PublicBody.objects.get(slug=row['slug'])
            # If it exists, update it
            row.pop('id', None)  # Do not update id though
            row['_updated_by'] = self.user
            PublicBody.objects.filter(id=pb.id).update(**row)
            pb.laws.clear()
            pb.laws.add(*row['jurisdiction'].laws)
            return
        except PublicBody.DoesNotExist:
            pass
        row.pop('id', None)  # Remove id if present
        public_body = PublicBody(**row)
        public_body._created_by = self.user
        public_body._updated_by = self.user
        public_body.confirmed = True
        public_body.site = self.site
        public_body.save()
        public_body.laws.add(*row['jurisdiction'].laws)
Beispiel #6
0
def submit_request(request, public_body=None):
    error = False
    foilaw = None
    if public_body is not None:
        public_body = get_object_or_404(PublicBody, slug=public_body)
        if not public_body.email:
            raise Http404
        all_laws = FoiLaw.objects.filter(jurisdiction=public_body.jurisdiction)
    else:
        all_laws = FoiLaw.objects.all()
    context = {"public_body": public_body}

    request_form = RequestForm(all_laws, FoiLaw.get_default_law(), True, request.POST)
    context["request_form"] = request_form
    context["public_body_form"] = PublicBodyForm()
    if public_body is None and request.POST.get("public_body") == "new":
        pb_form = PublicBodyForm(request.POST)
        context["public_body_form"] = pb_form
        if pb_form.is_valid():
            data = pb_form.cleaned_data
            data["confirmed"] = False
            # Take the first jurisdiction there is
            data["jurisdiction"] = Jurisdiction.objects.all()[0]
            data["slug"] = slugify(data["name"])
            public_body = PublicBody(**data)
        else:
            error = True

    if not request_form.is_valid():
        error = True
    else:
        if (
            public_body is None
            and request_form.cleaned_data["public_body"] != ""
            and request_form.cleaned_data["public_body"] != "new"
        ):
            public_body = request_form.public_body_object

    context["user_form"] = None
    user = None
    if not request.user.is_authenticated():
        user_form = NewUserForm(request.POST)
        context["user_form"] = user_form
        if not user_form.is_valid():
            error = True
    else:
        user = request.user

    if not error:
        password = None
        if user is None:
            user, password = AccountManager.create_user(**user_form.cleaned_data)
        sent_to_pb = 1
        if public_body is not None and public_body.pk is None:
            public_body._created_by = user
            public_body.save()
            sent_to_pb = 2
        elif public_body is None:
            sent_to_pb = 0

        if foilaw is None:
            if public_body is not None:
                foilaw = public_body.default_law
            else:
                foilaw = request_form.foi_law

        foi_request = FoiRequest.from_request_form(
            user, public_body, foilaw, form_data=request_form.cleaned_data, post_data=request.POST
        )

        if user.is_active:
            if sent_to_pb == 0:
                messages.add_message(
                    request, messages.INFO, _("Others can now suggest the Public Bodies for your request.")
                )
            elif sent_to_pb == 2:
                messages.add_message(
                    request,
                    messages.INFO,
                    _(
                        "Your request will be sent as soon as the newly created Public Body was confirmed by an administrator."
                    ),
                )

            else:
                messages.add_message(request, messages.INFO, _("Your request has been sent."))
            return redirect(u"%s%s" % (foi_request.get_absolute_url(), _("?request-made")))
        else:
            AccountManager(user).send_confirmation_mail(request_id=foi_request.pk, password=password)
            messages.add_message(
                request, messages.INFO, _("Please check your inbox for mail from us to confirm your mail address.")
            )
            # user cannot access the request yet!
            return redirect("/")
    messages.add_message(
        request, messages.ERROR, _("There were errors in your form submission. Please review and submit again.")
    )
    return render(request, "foirequest/request.html", context, status=400)
Beispiel #7
0
 def export_csv(self, request, queryset):
     return HttpResponse(PublicBody.export_csv(queryset),
                         content_type='text/csv')
Beispiel #8
0
def submit_request(request, public_body=None):
    error = False
    foilaw = None
    if public_body is not None:
        public_body = get_object_or_404(PublicBody,
                slug=public_body)
        if not public_body.email:
            raise Http404
        all_laws = FoiLaw.objects.filter(jurisdiction=public_body.jurisdiction)
    else:
        all_laws = FoiLaw.objects.all()
    context = {"public_body": public_body}

    request_form = RequestForm(all_laws, FoiLaw.get_default_law(),
            True, request.POST)
    context['request_form'] = request_form
    context['public_body_form'] = PublicBodyForm()
    if (public_body is None and
            request.POST.get('public_body') == "new"):
        pb_form = PublicBodyForm(request.POST)
        context["public_body_form"] = pb_form
        if pb_form.is_valid():
            data = pb_form.cleaned_data
            data['confirmed'] = False
            # Take the first jurisdiction there is
            data['jurisdiction'] = Jurisdiction.objects.all()[0]
            data['slug'] = slugify(data['name'])
            public_body = PublicBody(**data)
        else:
            error = True

    if not request_form.is_valid():
        error = True
    else:
        if (public_body is None and
                request_form.cleaned_data['public_body'] != '' and
                request_form.cleaned_data['public_body'] != 'new'):
            public_body = request_form.public_body_object

    context['user_form'] = None
    user = None
    if not request.user.is_authenticated():
        user_form = NewUserForm(request.POST)
        context['user_form'] = user_form
        if not user_form.is_valid():
            error = True
    else:
        user = request.user

    if not error:
        password = None
        if user is None:
            user, password = AccountManager.create_user(**user_form.cleaned_data)
        sent_to_pb = 1
        if public_body is not None and public_body.pk is None:
            public_body._created_by = user
            public_body.save()
            sent_to_pb = 2
        elif public_body is None:
            sent_to_pb = 0

        if foilaw is None:
            if public_body is not None:
                foilaw = public_body.default_law
            else:
                foilaw = request_form.foi_law

        foi_request = FoiRequest.from_request_form(
                user,
                public_body,
                foilaw,
                form_data=request_form.cleaned_data,
                post_data=request.POST
        )

        if user.is_active:
            if sent_to_pb == 0:
                messages.add_message(request, messages.INFO,
                    _('Others can now suggest the Public Bodies for your request.'))
            elif sent_to_pb == 2:
                messages.add_message(request, messages.INFO,
                    _('Your request will be sent as soon as the newly created Public Body was confirmed by an administrator.'))

            else:
                messages.add_message(request, messages.INFO,
                    _('Your request has been sent.'))
            return redirect(u'%s%s' % (foi_request.get_absolute_url(), _('?request-made')))
        else:
            AccountManager(user).send_confirmation_mail(request_id=foi_request.pk,
                    password=password)
            messages.add_message(request, messages.INFO,
                    _('Please check your inbox for mail from us to confirm your mail address.'))
            # user cannot access the request yet!
            return redirect("/")
    messages.add_message(request, messages.ERROR,
        _('There were errors in your form submission. Please review and submit again.'))
    return render(request, 'foirequest/request.html', context, status=400)
Beispiel #9
0
    def import_row(self, row):

        # generate slugs
        if 'name' in row:
            row['name'] = row['name'].strip()

        if 'email' in row:
            row['email'] = row['email'].lower()

        if 'url' in row:
            if row['url'] and not row['url'].startswith(
                ('http://', 'https://')):
                row['url'] = 'http://' + row['url']

        if 'slug' not in row and 'name' in row:
            row['slug'] = slugify(row['name'])

        if 'classification' in row:
            row['classification'] = self.get_classification(
                row.pop('classification', None))

        categories = row.pop('categories', '').split(',')

        categories = list(self.get_categories(categories))

        # resolve foreign keys
        if 'jurisdiction__slug' in row:
            row['jurisdiction'] = self.get_jurisdiction(
                row.pop('jurisdiction__slug'))

        regions = None
        if 'georegion_id' in row:
            regions = [self.get_georegion(id=row.pop('georegion_id'))]
        elif 'georegion_identifier' in row:
            regions = [
                self.get_georegion(identifier=row.pop('georegion_identifier'))
            ]
        elif 'regions' in row:
            regions = row.pop('regions')
            if regions:
                regions = [
                    self.get_georegion(id=r) for r in regions.split(',')
                ]

        parent = row.pop('parent__name', None)
        if parent:
            row['parent'] = PublicBody._default_manager.get(
                slug=slugify(parent))

        parent = row.pop('parent__id', None)
        if parent:
            row['parent'] = PublicBody._default_manager.get(pk=parent)

        # get optional values
        for n in ('description', 'other_names', 'request_note', 'website_dump',
                  'wikidata_item'):
            if n in row:
                row[n] = row.get(n, '').strip()

        if 'lat' in row and 'lng' in row:
            lat = row.pop('lat')
            lng = row.pop('lng')
            if lat and lng:
                row['geo'] = Point(float(lng), float(lat))

        try:
            if 'id' in row and row['id']:
                pb = PublicBody._default_manager.get(id=row['id'])
            elif row.get('source_reference'):
                pb = PublicBody._default_manager.get(
                    source_reference=row['source_reference'])
            else:
                pb = PublicBody._default_manager.get(slug=row['slug'])
            # If it exists, update it
            row.pop('id', None)  # Do not update id though
            row.pop('slug', None)  # Do not update slug either
            row['_updated_by'] = self.user
            row['updated_at'] = timezone.now()
            PublicBody._default_manager.filter(id=pb.id).update(**row)
            pb.laws.clear()
            pb.laws.add(*row['jurisdiction'].laws)
            if regions:
                pb.regions.set(regions)
            pb.categories.set(*categories)
            return pb
        except PublicBody.DoesNotExist:
            pass
        row.pop('id', None)  # Remove id if present
        pb = PublicBody(**row)
        pb._created_by = self.user
        pb._updated_by = self.user
        pb.created_at = timezone.now()
        pb.updated_at = timezone.now()
        pb.confirmed = True
        pb.site = self.site
        pb.save()
        pb.laws.add(*row['jurisdiction'].laws)
        if regions:
            pb.regions.set(regions)
        pb.categories.set(*categories)
        return pb
Beispiel #10
0
 def export_csv(self, request, queryset):
     return export_csv_response(PublicBody.export_csv(queryset))
Beispiel #11
0
 def export_csv(self, request, queryset):
     return HttpResponse(PublicBody.export_csv(queryset),
         content_type='text/csv')
Beispiel #12
0
 def export_csv(self, request, queryset):
     return export_csv_response(PublicBody.export_csv(queryset))
Beispiel #13
0
def submit_request(request, public_body=None):
    error = False
    foi_law = None
    if public_body is not None:
        public_body = get_object_or_404(PublicBody,
                slug=public_body)
        if not public_body.email:
            raise Http404
        all_laws = FoiLaw.objects.filter(jurisdiction=public_body.jurisdiction)
    else:
        all_laws = FoiLaw.objects.all()
    context = {"public_body": public_body}

    request_form = RequestForm(user=request.user,
                               list_of_laws=all_laws,
                               default_law=FoiLaw.get_default_law(),
                               data=request.POST)
    context['request_form'] = request_form
    context['public_body_form'] = PublicBodyForm()
    if (public_body is None and
            request.POST.get('public_body') == "new"):
        pb_form = PublicBodyForm(request.POST)
        context["public_body_form"] = pb_form
        if pb_form.is_valid():
            data = pb_form.cleaned_data
            data['confirmed'] = False
            # Take the first jurisdiction there is
            data['jurisdiction'] = Jurisdiction.objects.all()[0]
            data['slug'] = slugify(data['name'])
            public_body = PublicBody(**data)
        else:
            error = True

    if not request_form.is_valid():
        error = True
    else:
        if (public_body is None and
                request_form.cleaned_data['public_body'] != '' and
                request_form.cleaned_data['public_body'] != 'new'):
            public_body = request_form.public_body_object

    context['user_form'] = None
    user = None
    if not request.user.is_authenticated:
        user_form = NewUserForm(request.POST)
        context['user_form'] = user_form
        if not user_form.is_valid():
            error = True
    else:
        user = request.user

    if error:
        messages.add_message(request, messages.ERROR,
            _('There were errors in your form submission. Please review and submit again.'))
        return render(request, 'foirequest/request.html', context, status=400)

    password = None
    if user is None:
        user, password = AccountManager.create_user(**user_form.cleaned_data)
    sent_to_pb = 1
    if public_body is not None and public_body.pk is None:
        public_body._created_by = user
        public_body.save()
        sent_to_pb = 2
    elif public_body is None:
        sent_to_pb = 0

    if foi_law is None:
        if public_body is not None:
            foi_law = public_body.default_law
        else:
            foi_law = request_form.foi_law

    kwargs = registry.run_hook('pre_request_creation', request,
        user=user,
        public_body=public_body,
        foi_law=foi_law,
        form_data=request_form.cleaned_data,
        post_data=request.POST
    )
    foi_request = FoiRequest.from_request_form(**kwargs)

    if user.is_active:
        if sent_to_pb == 0:
            messages.add_message(request, messages.INFO,
                _('Others can now suggest the Public Bodies for your request.'))
        elif sent_to_pb == 2:
            messages.add_message(request, messages.INFO,
                _('Your request will be sent as soon as the newly created Public Body was confirmed by an administrator.'))

        else:
            messages.add_message(request, messages.INFO,
                _('Your request has been sent.'))
        if request_form.cleaned_data['redirect_url']:
            redirect_url = request_form.cleaned_data['redirect_url']
            if is_safe_url(redirect_url, allowed_hosts=settings.ALLOWED_REDIRECT_HOSTS):
                return redirect(redirect_url)
        return redirect(u'%s%s' % (foi_request.get_absolute_url(), _('?request-made')))
    else:
        AccountManager(user).send_confirmation_mail(request_id=foi_request.pk,
                password=password)
        messages.add_message(request, messages.INFO,
                _('Please check your inbox for mail from us to confirm your mail address.'))
        # user cannot access the request yet!
        return redirect("/")
Beispiel #14
0
    def import_row(self, row):
        # generate slugs
        if 'name' in row:
            row['name'] = row['name'].strip()

        if 'email' in row:
            row['email'] = row['email'].lower()

        if 'url' in row:
            if row['url'] and not row['url'].startswith(
                ('http://', 'https://')):
                row['url'] = 'http://' + row['url']

        if 'slug' not in row and 'name' in row:
            row['slug'] = slugify(row['name'])

        if 'classification' in row:
            row['classification'] = self.get_classification(
                row.pop('classification', None))

        categories = parse_tags(row.pop('categories', ''))
        categories = list(self.get_categories(categories))

        tags = parse_tags(row.pop('tags', ''))
        # Backwards compatible handling of topic__slug
        topic_slug = row.pop('topic__slug', None)
        if topic_slug:
            tags.append(self.get_topic(topic_slug))

        # resolve foreign keys
        if 'jurisdiction__slug' in row:
            row['jurisdiction'] = self.get_jurisdiction(
                row.pop('jurisdiction__slug'))

        regions = None
        if 'georegion_id' in row:
            regions = [self.get_georegion(id=row.pop('georegion_id'))]
        elif 'georegion_identifier' in row:
            regions = [
                self.get_georegion(identifier=row.pop('georegion_identifier'))
            ]
        elif 'regions' in row:
            regions = row.pop('regions')
            if regions:
                regions = [
                    self.get_georegion(id=r) for r in regions.split(',')
                ]

        parent = row.pop('parent__name', None)
        if parent:
            row['parent'] = PublicBody.objects.get(slug=slugify(parent))

        parent = row.pop('parent__id', None)
        if parent:
            row['parent'] = PublicBody.objects.get(pk=parent)

        # get optional values
        for n in ('description', 'other_names', 'request_note',
                  'website_dump'):
            if n in row:
                row[n] = row.get(n, '').strip()

        try:
            if 'id' in row and row['id']:
                pb = PublicBody.objects.get(id=row['id'])
            else:
                pb = PublicBody.objects.get(slug=row['slug'])
            # If it exists, update it
            row.pop('id', None)  # Do not update id though
            row.pop('slug', None)  # Do not update slug either
            row['_updated_by'] = self.user
            row['updated_at'] = timezone.now()
            PublicBody.objects.filter(id=pb.id).update(**row)
            pb.laws.clear()
            pb.laws.add(*row['jurisdiction'].laws)
            pb.tags.set(*tags)
            if regions:
                pb.regions.set(*regions)
            pb.categories.set(*categories)
            return pb
        except PublicBody.DoesNotExist:
            pass
        row.pop('id', None)  # Remove id if present
        pb = PublicBody(**row)
        pb._created_by = self.user
        pb._updated_by = self.user
        pb.created_at = timezone.now()
        pb.updated_at = timezone.now()
        pb.confirmed = True
        pb.site = self.site
        pb.save()
        pb.laws.add(*row['jurisdiction'].laws)
        pb.tags.set(*list(tags))
        if regions:
            pb.regions.set(*regions)
        pb.categories.set(*categories)
        return pb