diff --git a/adhocracy-plus/config/urls.py b/adhocracy-plus/config/urls.py index b4f37a397..9fa9d9118 100644 --- a/adhocracy-plus/config/urls.py +++ b/adhocracy-plus/config/urls.py @@ -33,12 +33,14 @@ from apps.polls.api import PollViewSet from apps.polls.api import VoteViewSet from apps.polls.routers import QuestionDefaultRouter +from apps.projects.api import ProjectViewSet from apps.users.decorators import user_is_project_admin router = routers.DefaultRouter() router.register(r'follows', FollowViewSet, basename='follows') router.register(r'reports', ReportViewSet, basename='reports') router.register(r'polls', PollViewSet, basename='polls') +router.register(r'projects', ProjectViewSet, basename='projects') module_router = a4routers.ModuleDefaultRouter() # FIXME: rename to 'chapters' diff --git a/apps/projects/api.py b/apps/projects/api.py new file mode 100644 index 000000000..cea547b01 --- /dev/null +++ b/apps/projects/api.py @@ -0,0 +1,9 @@ +from rest_framework import viewsets + +from adhocracy4.projects.models import Project +from apps.projects.serializers import ProjectSerializer + + +class ProjectViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Project.objects.all() + serializer_class = ProjectSerializer diff --git a/apps/projects/serializers.py b/apps/projects/serializers.py new file mode 100644 index 000000000..411571b8c --- /dev/null +++ b/apps/projects/serializers.py @@ -0,0 +1,44 @@ +from easy_thumbnails.files import get_thumbnailer +from rest_framework import serializers + +from adhocracy4.projects.models import Project + + +class ProjectSerializer(serializers.ModelSerializer): + title = serializers.SerializerMethodField() + url = serializers.SerializerMethodField() + organisation = serializers.SerializerMethodField() + tile_image = serializers.SerializerMethodField() + tile_image_copyright = serializers.SerializerMethodField() + + class Meta: + model = Project + fields = ['title', 'url', 'organisation', 'tile_image', + 'tile_image_copyright'] + + def get_title(self, instance): + return instance.name + + def get_url(self, instance): + return instance.get_absolute_url() + + def get_organisation(self, instance): + return instance.organisation.name + + def get_tile_image(self, instance): + image_url = '' + if instance.tile_image: + image = get_thumbnailer(instance.tile_image)['project_thumbnail'] + image_url = image.url + elif instance.image: + image = get_thumbnailer(instance.image)['project_thumbnail'] + image_url = image.url + return image_url + + def get_tile_image_copyright(self, instance): + if instance.tile_image: + return instance.tile_image_copyright + elif instance.image: + return instance.image_copyright + else: + return None diff --git a/apps/userdashboard/assets/js/a4_candy_userdashboard/ModerationProjects.jsx b/apps/userdashboard/assets/js/a4_candy_userdashboard/ModerationProjects.jsx new file mode 100644 index 000000000..bdb67e038 --- /dev/null +++ b/apps/userdashboard/assets/js/a4_candy_userdashboard/ModerationProjects.jsx @@ -0,0 +1,61 @@ +/* global fetch */ +import React from 'react' + +export default class ModerationProjects extends React.Component { + constructor (props) { + super(props) + + this.state = { + projectTitle: [], + organisation: [], + url: [], + projectImage: [], + imageCopyright: [] + } + } + + getProjectData (projectData) { + let i = 0 + for (i = 0; i < projectData.length; i++) { + var element = document.createElement('div') + element.setAttribute('class', 'col-sm-6 col-lg-4') + element.innerHTML = '