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'), }
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
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))
class ResourceUnarchive(LoginPermissionRequiredMixin, ArchiveMixin, mixins.ResourceObjectMixin, generic.UpdateView): do_archive = False permission_required = update_permissions('resource.unarchive') permission_denied_message = error_messages.RESOURCE_UNARCHIVE
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
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')
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 })
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, })
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
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
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
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
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()]
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
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()]
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)
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)
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
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, })
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')
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
class ProjectUsers(APIPermissionRequiredMixin, mixins.ProjectRoles, generics.ListCreateAPIView): serializer_class = serializers.ProjectUserSerializer permission_required = { 'GET': 'project.users.list', 'POST': update_permissions('project.users.add') }
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)
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()]
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'), }
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)
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)
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)
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)
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