Example #1
0
class PartyDetail(APIPermissionRequiredMixin, mixins.PartyQuerySetMixin,
                  generics.RetrieveUpdateDestroyAPIView):

    serializer_class = serializers.PartySerializer
    filter_fields = ('archived', )
    lookup_url_kwarg = 'party'
    lookup_field = 'id'
    permission_required = {
        'GET': 'party.view',
        'PATCH': update_permissions('party.update'),
        'DELETE': update_permissions('party.delete'),
    }
Example #2
0
class PartiesEdit(LoginPermissionRequiredMixin, mixins.PartyObjectMixin,
                  organization_mixins.ProjectAdminCheckMixin,
                  generic.UpdateView):
    template_name = 'party/party_edit.html'
    form_class = forms.PartyForm
    permission_required = update_permissions('party.update')
    permission_denied_message = error_messages.PARTY_UPDATE
Example #3
0
class ProjectResources(APIPermissionRequiredMixin, mixins.ProjectResourceMixin,
                       generics.ListCreateAPIView):
    filter_backends = (
        DjangoFilterBackend,
        filters.SearchFilter,
        filters.OrderingFilter,
    )
    filter_fields = ('archived', )
    search_fields = ('name', 'description', 'original_file')
    ordering_fields = ('name', 'description', 'file', 'contributor__username',
                       'last_updated')
    permission_required = {
        'GET': 'resource.list',
        'POST': update_permissions('resource.add')
    }

    serializer_class = serializers.ResourceSerializer
    permission_filter_queryset = filter_archived_resources
    use_resource_library_queryset = True

    def get_queryset(self):
        proj = self.get_content_object()
        related_content_objs = ContentObject.objects.filter(
            resource=OuterRef('id'),
            content_type=ContentType.objects.get_for_model(proj),
            object_id=proj.id)
        return super().get_queryset().prefetch_related(
            'content_objects__content_type').annotate(
                attached=Exists(related_content_objs))
Example #4
0
class ResourceUnarchive(LoginPermissionRequiredMixin,
                        ArchiveMixin,
                        mixins.ResourceObjectMixin,
                        generic.UpdateView):
    do_archive = False
    permission_required = update_permissions('resource.unarchive')
    permission_denied_message = error_messages.RESOURCE_UNARCHIVE
Example #5
0
class LocationsAdd(LoginPermissionRequiredMixin, mixins.SpatialQuerySetMixin,
                   organization_mixins.ProjectAdminCheckMixin,
                   generic.CreateView):
    form_class = forms.LocationForm
    template_name = 'spatial/location_add.html'
    permission_required = update_permissions('spatial.add')
    permission_denied_message = error_messages.SPATIAL_CREATE

    def get_perms_objects(self):
        return [self.get_project()]

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        prj = self.get_project()

        kwargs['schema_selectors'] = ()
        if prj.current_questionnaire:
            kwargs['schema_selectors'] = ({
                'name': 'organization',
                'value': prj.organization,
                'selector': prj.organization.id
            }, {
                'name': 'project',
                'value': prj,
                'selector': prj.id
            }, {
                'name': 'questionnaire',
                'value': prj.current_questionnaire,
                'selector': prj.current_questionnaire
            })

        return kwargs
Example #6
0
class TenureRelationshipAdd(LoginPermissionRequiredMixin,
                            mixins.SpatialUnitRelationshipMixin,
                            organization_mixins.ProjectAdminCheckMixin,
                            generic.CreateView):
    template_name = 'spatial/relationship_add.html'
    form_class = forms.TenureRelationshipForm
    permission_required = update_permissions('tenure_rel.create')
    permission_denied_message = TENURE_REL_CREATE

    def get_perms_objects(self):
        return [self.get_project()]

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['initial'] = {
            'new_entity': not self.get_project().parties.exists(),
        }
        return kwargs

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        return context

    def get_success_url(self):
        return (reverse('locations:detail', kwargs=self.kwargs) +
                '#relationships')
Example #7
0
class OrganizationMembersAdd(mixins.OrganizationMixin,
                             LoginPermissionRequiredMixin, generic.CreateView):
    model = OrganizationRole
    form_class = forms.AddOrganizationMemberForm
    template_name = 'organization/organization_members_add.html'
    permission_required = update_permissions('org.users.add')
    permission_denied_message = error_messages.ORG_USERS_ADD

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['organization'] = self.get_organization()
        return context

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs(*args, **kwargs)

        if self.request.method == 'POST':
            kwargs['organization'] = self.get_organization()

        return kwargs

    def get_success_url(self):
        return reverse('organization:members_edit',
                       kwargs={
                           'slug': self.object.organization.slug,
                           'username': self.object.user.username
                       })
Example #8
0
class ResourceArchive(LoginPermissionRequiredMixin, ArchiveMixin,
                      mixins.ResourceObjectMixin, generic.UpdateView):
    do_archive = True
    permission_required = update_permissions('resource.archive')
    permission_denied_message = error_messages.RESOURCE_ARCHIVE

    def get_success_url(self):
        next_url = self.request.GET.get('next', None)
        if next_url:
            return next_url + '#resources'

        project = self.get_project()
        resource = self.get_object()
        if self.request.user.has_perm('resource.unarchive', resource):
            return reverse('resources:project_detail',
                           kwargs={
                               'organization': project.organization.slug,
                               'project': project.slug,
                               'resource': resource.id,
                           })
        else:
            return reverse('resources:project_list',
                           kwargs={
                               'organization': project.organization.slug,
                               'project': project.slug,
                           })
Example #9
0
class PartiesEdit(LoginPermissionRequiredMixin,
                  JsonAttrsMixin,
                  mixins.PartyObjectMixin,
                  organization_mixins.ProjectAdminCheckMixin,
                  generic.UpdateView):
    template_name = 'party/party_edit.html'
    form_class = forms.PartyForm
    permission_required = update_permissions('party.update')
    permission_denied_message = error_messages.PARTY_UPDATE
    attributes_field = 'attributes'

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['project'] = self.get_project()
        return kwargs

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)

        project = context['object']
        if project.current_questionnaire:
            try:
                party_type = Question.objects.get(
                    name='party_type',
                    questionnaire_id=project.current_questionnaire)
                option = QuestionOption.objects.get(question=party_type,
                                                    name=context['party'].type)
                context['type_choice_labels'] = template_xlang_labels(
                    option.label_xlat)
            except Question.DoesNotExist:
                pass

        return context
Example #10
0
class LocationEdit(LoginPermissionRequiredMixin, mixins.SpatialUnitObjectMixin,
                   organization_mixins.ProjectAdminCheckMixin,
                   generic.UpdateView):
    template_name = 'spatial/location_edit.html'
    form_class = forms.LocationForm
    permission_required = update_permissions('spatial.edit')
    permission_denied_message = error_messages.SPATIAL_UPDATE
Example #11
0
class ProjectResources(APIPermissionRequiredMixin, mixins.ProjectResourceMixin,
                       generics.ListCreateAPIView):
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
        filters.OrderingFilter,
    )
    filter_fields = ('archived', )
    search_fields = (
        'name',
        'description',
        'file',
    )
    ordering_fields = (
        'name',
        'description',
        'file',
    )
    permission_required = {
        'GET': 'resource.list',
        'POST': update_permissions('resource.add')
    }

    def filter_archived_resources(self, view, obj):
        if obj.archived:
            return ('resource.view', 'resource.unarchive')
        else:
            return ('resource.view', )

    permission_filter_queryset = filter_archived_resources
    use_resource_library_queryset = True
Example #12
0
class LocationsAdd(LoginPermissionRequiredMixin, mixins.SpatialQuerySetMixin,
                   organization_mixins.ProjectAdminCheckMixin,
                   generic.CreateView):
    form_class = forms.LocationForm
    template_name = 'spatial/location_add.html'
    permission_required = update_permissions('spatial.add')
    permission_denied_message = error_messages.SPATIAL_CREATE

    def get(self, request, *args, **kwargs):
        referrer = request.META.get('HTTP_REFERER', None)
        if referrer:
            current_url = reverse('locations:add', kwargs=self.kwargs)
            if current_url not in referrer:
                request.session['cancel_add_location_url'] = referrer
        else:
            # In case the browser does not send any referrer
            request.session['cancel_add_location_url'] = reverse(
                'organization:project-dashboard', kwargs=self.kwargs)
        return super().get(request, *args, **kwargs)

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        cancel_url = self.request.session.get('cancel_add_location_url', None)
        context['cancel_url'] = cancel_url or reverse(
            'organization:project-dashboard', kwargs=self.kwargs)
        return context

    def get_perms_objects(self):
        return [self.get_project()]

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['project'] = self.get_project()
        return kwargs
Example #13
0
class PartyResourceList(APIPermissionRequiredMixin, mixins.PartyResourceMixin,
                        generics.ListCreateAPIView):
    serializer_class = ResourceSerializer
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
        filters.OrderingFilter,
    )
    filter_fields = ('archived', )
    search_fields = (
        'name',
        'description',
        'file',
    )
    ordering_fields = (
        'name',
        'description',
        'file',
    )
    permission_required = {
        'GET': 'party.resources.list',
        'POST': update_permissions('party.resources.add')
    }

    def get_perms_objects(self):
        return [self.get_object()]
Example #14
0
class PartyRelationshipResourceNew(LoginPermissionRequiredMixin,
                                   mixins.PartyRelationshipResourceMixin,
                                   organization_mixins.ProjectAdminCheckMixin,
                                   generic.CreateView):
    template_name = 'party/relationship_resources_new.html'
    permission_required = update_permissions('tenure_rel.resources.add')
    permission_denied_message = error_messages.TENURE_REL_RESOURCES_ADD
Example #15
0
class SpatialUnitList(APIPermissionRequiredMixin, mixins.SpatialQuerySetMixin,
                      generics.ListCreateAPIView):
    def get_actions(self, request):
        if self.get_project().archived:
            return ['project.view_archived', 'spatial.list']
        if self.get_project().public():
            return ['project.view', 'spatial.list']
        else:
            return ['project.view_private', 'spatial.list']

    serializer_class = serializers.SpatialUnitSerializer
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
        filters.OrderingFilter,
    )
    filter_fields = ('type', )

    permission_required = {
        'GET': get_actions,
        'POST': update_permissions('spatial.create'),
    }

    def get_perms_objects(self):
        return [self.get_project()]
Example #16
0
class ProjectUsersDetail(APIPermissionRequiredMixin, mixins.ProjectRoles,
                         generics.RetrieveUpdateDestroyAPIView):
    serializer_class = serializers.ProjectUserSerializer

    permission_required = {
        'GET': 'project.users.list',
        'PATCH': update_permissions('project.users.update'),
        'PUT': update_permissions('project.users.update'),
        'DELETE': update_permissions('project.users.delete'),
    }

    def destroy(self, request, *args, **kwargs):
        ProjectRole.objects.get(project=self.prj,
                                user=self.get_object()).delete()

        return Response(status=status.HTTP_204_NO_CONTENT)
Example #17
0
class SpatialUnitDetail(APIPermissionRequiredMixin,
                        mixins.SpatialQuerySetMixin,
                        generics.RetrieveUpdateDestroyAPIView):

    serializer_class = serializers.SpatialUnitSerializer
    lookup_url_kwarg = 'spatial_id'
    lookup_field = 'id'
    permission_required = {
        'GET': 'spatial.view',
        'PATCH': update_permissions('spatial.update'),
        'DELETE': update_permissions('spatial.delete')
    }

    def destroy(self, request, *args, **kwargs):
        self.get_object().delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
Example #18
0
class LocationResourceNew(LoginPermissionRequiredMixin,
                          mixins.SpatialUnitResourceMixin,
                          organization_mixins.ProjectAdminCheckMixin,
                          generic.CreateView):
    template_name = 'spatial/resources_new.html'
    permission_required = update_permissions('spatial.resources.add')
    permission_denied_message = error_messages.SPATIAL_ADD_RESOURCE
Example #19
0
class ResourceDetach(LoginPermissionRequiredMixin,
                     organization_mixins.ProjectMixin, generic.DeleteView):
    http_method_names = ('post', )
    model = ContentObject
    pk_url_kwarg = 'attachment'
    permission_required = update_permissions('resource.edit')
    permission_denied_message = error_messages.RESOURCE_EDIT

    def get_object(self):
        try:
            return ContentObject.objects.get(
                id=self.kwargs['attachment'],
                resource__id=self.kwargs['resource'],
                resource__project__slug=self.kwargs['project'],
            )
        except ContentObject.DoesNotExist as e:
            raise Http404(e)

    def get_perms_objects(self):
        try:
            return [Resource.objects.get(pk=self.kwargs['resource'])]
        except Resource.DoesNotExist as e:
            raise Http404(e)

    def get_success_url(self):
        next_url = self.request.GET.get('next', None)
        if next_url:
            return next_url + '#resources'

        project = self.get_project()
        return reverse('resources:project_list',
                       kwargs={
                           'organization': project.organization.slug,
                           'project': project.slug,
                       })
Example #20
0
class OrganizationProjectList(PermissionsFilterMixin,
                              APIPermissionRequiredMixin,
                              mixins.OrgRoleCheckMixin,
                              mixins.ProjectQuerySetMixin,
                              generics.ListCreateAPIView):
    org_lookup = 'organization'
    serializer_class = serializers.ProjectSerializer
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
        filters.OrderingFilter,
    )
    filter_fields = ('archived', )
    search_fields = (
        'name',
        'organization__name',
        'country',
        'description',
    )
    ordering_fields = (
        'name',
        'organization',
        'country',
        'description',
    )
    permission_required = {
        'GET': 'project.list',
        'POST': update_permissions('project.create')
    }

    def get_organization(self):
        if not hasattr(self, 'org'):
            self.org = get_object_or_404(Organization,
                                         slug=self.kwargs['organization'])
        return self.org

    def get_perms_objects(self):
        return list(self.get_queryset()) + [self.get_organization()]

    def get_serializer_context(self, *args, **kwargs):
        org = self.get_organization()
        context = super(OrganizationProjectList,
                        self).get_serializer_context(*args, **kwargs)
        context['organization'] = org

        return context

    def get_queryset(self):
        if self.request.method == 'POST':
            return [self.get_organization()]

        if self.is_administrator:
            return super().get_queryset().filter(
                organization__slug=self.kwargs['organization'])
        else:
            return super().get_queryset().filter(
                organization__slug=self.kwargs['organization'],
                archived=False,
                access='public')
Example #21
0
class PartyResourcesNew(LoginPermissionRequiredMixin,
                        mixins.PartyResourceMixin,
                        organization_mixins.ProjectAdminCheckMixin,
                        resource_mixins.HasUnattachedResourcesMixin,
                        generic.CreateView):
    template_name = 'party/resources_new.html'
    permission_required = update_permissions('party.resources.add')
    permission_denied_message = error_messages.PARTY_RESOURCES_ADD
Example #22
0
class ProjectUsers(APIPermissionRequiredMixin, mixins.ProjectRoles,
                   generics.ListCreateAPIView):

    serializer_class = serializers.ProjectUserSerializer
    permission_required = {
        'GET': 'project.users.list',
        'POST': update_permissions('project.users.add')
    }
Example #23
0
class OrganizationUsersDetail(APIPermissionRequiredMixin,
                              mixins.OrganizationRoles,
                              generics.RetrieveUpdateDestroyAPIView):

    serializer_class = serializers.OrganizationUserSerializer
    permission_required = {
        'PUT': update_permissions('org.users.edit'),
        'PATCH': update_permissions('org.users.edit'),
        'DELETE': update_permissions('org.users.remove')
    }

    def destroy(self, request, *args, **kwargs):
        user = self.get_object()
        if user == request.user:
            raise PermissionDenied
        OrganizationRole.objects.get(organization=self.org, user=user).delete()

        return Response(status=status.HTTP_204_NO_CONTENT)
Example #24
0
class SpatialRelationshipCreate(APIPermissionRequiredMixin,
                                mixins.SpatialRelationshipQuerySetMixin,
                                generics.CreateAPIView):

    permission_required = update_permissions('spatial_rel.create')
    serializer_class = serializers.SpatialRelationshipWriteSerializer

    def get_perms_objects(self):
        return [self.get_project()]
Example #25
0
class OrganizationUsers(APIPermissionRequiredMixin, mixins.OrganizationRoles,
                        generics.ListCreateAPIView):

    lookup_url_kwarg = 'organization'
    lookup_field = 'slug'
    serializer_class = serializers.OrganizationUserSerializer
    permission_required = {
        'GET': 'org.users.list',
        'POST': update_permissions('org.users.add'),
    }
Example #26
0
class OrganizationEdit(LoginPermissionRequiredMixin,
                       core_mixins.CacheObjectMixin, generic.UpdateView):
    model = Organization
    form_class = forms.OrganizationForm
    template_name = 'organization/organization_edit.html'
    permission_required = update_permissions('org.update', True)
    permission_denied_message = error_messages.ORG_EDIT

    def get_success_url(self):
        return reverse('organization:dashboard', kwargs=self.kwargs)
Example #27
0
class ProjectEdit(mixins.ProjectMixin, mixins.ProjectAdminCheckMixin,
                  LoginPermissionRequiredMixin):
    model = Project
    permission_required = update_permissions('project.update', True)

    def get_object(self):
        return self.get_project()

    def get_success_url(self):
        return reverse('organization:project-dashboard', kwargs=self.kwargs)
Example #28
0
class PartyRelationshipEdit(LoginPermissionRequiredMixin,
                            mixins.PartyRelationshipObjectMixin,
                            organization_mixins.ProjectAdminCheckMixin,
                            generic.UpdateView):
    template_name = 'party/relationship_edit.html'
    form_class = forms.TenureRelationshipEditForm
    permission_required = update_permissions('tenure_rel.update')
    permission_denied_message = error_messages.TENURE_REL_UPDATE

    def get_success_url(self):
        return reverse('parties:relationship_detail', kwargs=self.kwargs)
Example #29
0
class PartiesDelete(LoginPermissionRequiredMixin, mixins.PartyObjectMixin,
                    organization_mixins.ProjectAdminCheckMixin,
                    generic.DeleteView):
    template_name = 'party/party_delete.html'
    permission_required = update_permissions('party.delete')
    permission_denied_message = error_messages.PARTY_DELETE

    def get_success_url(self):
        kwargs = self.kwargs
        del kwargs['party']
        return reverse('parties:list', kwargs=self.kwargs)
Example #30
0
class ProjectResourcesEdit(LoginPermissionRequiredMixin,
                           mixins.ResourceObjectMixin,
                           organization_mixins.ProjectAdminCheckMixin,
                           generic.UpdateView):
    template_name = 'resources/edit.html'
    permission_required = update_permissions('resource.edit')
    permission_denied_message = error_messages.RESOURCE_EDIT

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['cancel_url'] = self.get_success_url()
        return context