From bc4aa2cb4f05fbab775c11a9ba053c034d8161ee Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2013 10:56:35 +0200 Subject: [PATCH] Initial implementation of users list api call. --- greenmine/base/api.py | 32 +++++++++++++++++++--- greenmine/base/fixtures/initial_data.json | 30 --------------------- greenmine/base/serializers.py | 10 +++++++ greenmine/base/urls.py | 14 +++++----- greenmine/scrum/admin.py | 12 +++------ greenmine/scrum/api.py | 33 ++++++----------------- greenmine/scrum/models.py | 22 +++------------ greenmine/scrum/permissions.py | 21 +++++++++------ greenmine/scrum/serializers.py | 14 ++-------- greenmine/scrum/urls.py | 6 ++--- 10 files changed, 79 insertions(+), 115 deletions(-) diff --git a/greenmine/base/api.py b/greenmine/base/api.py index 1dfaf6b8..0fc35900 100644 --- a/greenmine/base/api.py +++ b/greenmine/base/api.py @@ -9,10 +9,13 @@ from rest_framework.parsers import JSONParser from rest_framework.reverse import reverse from rest_framework.views import APIView from rest_framework.response import Response +from rest_framework.permissions import IsAuthenticated from rest_framework import status +from rest_framework import generics -from greenmine.base.serializers import LoginSerializer, UserLogged +from greenmine.base.serializers import LoginSerializer, UserLogged, UserSerializer from greenmine.base.models import User +from greenmine.scrum import models class ApiRoot(APIView): @@ -23,8 +26,7 @@ class ApiRoot(APIView): 'projects': reverse('project-list', request=request, format=format), 'milestones': reverse('milestone-list', request=request, format=format), 'user-stories': reverse('user-story-list', request=request, format=format), - 'changes': reverse('change-list', request=request, format=format), - 'change-attachments': reverse('change-attachment-list', request=request, format=format), + 'attachments': reverse('attachment-list', request=request, format=format), 'tasks': reverse('task-list', request=request, format=format), 'issues': reverse('issue-list', request=request, format=format), 'severities': reverse('severity-list', request=request, format=format), @@ -39,9 +41,33 @@ class ApiRoot(APIView): 'question_responses': reverse('question-response-list', request=request, format=format), 'wiki_pages': reverse('wiki-page-list', request=request, format=format), 'wiki_page_attachments': reverse('wiki-page-attachment-list', request=request, format=format), + 'users': reverse('user-list', request=request, format=format), }) + +#class UserFilter(django_filters.FilterSet): +# no_milestone = django_filters.NumberFilter(name="mileston", lookup_type='isnull') +# +# class Meta: +# model = UserStory +# fields = ['project', 'milestone', 'no_milestone'] + + +class UserList(generics.ListCreateAPIView): + model = User + serializer_class = UserSerializer + permission_classes = (IsAuthenticated,) + + def get_queryset(self): + projects = models.Project.objects.filter(members=self.request.user) + return super(UserList, self).get_queryset().filter(projects__in=projects)\ + .order_by('id').distinct() + + def pre_save(self, obj): + pass + + class Login(APIView): def post(self, request, format=None): username = request.DATA.get('username', None) diff --git a/greenmine/base/fixtures/initial_data.json b/greenmine/base/fixtures/initial_data.json index d3ca846d..9cfc6c01 100644 --- a/greenmine/base/fixtures/initial_data.json +++ b/greenmine/base/fixtures/initial_data.json @@ -169,36 +169,6 @@ "questions", "questionresponse" ], - [ - "add_change", - "scrum", - "change" - ], - [ - "change_change", - "scrum", - "change" - ], - [ - "delete_change", - "scrum", - "change" - ], - [ - "add_changeattachment", - "scrum", - "changeattachment" - ], - [ - "change_changeattachment", - "scrum", - "changeattachment" - ], - [ - "delete_changeattachment", - "scrum", - "changeattachment" - ], [ "add_issue", "scrum", diff --git a/greenmine/base/serializers.py b/greenmine/base/serializers.py index 89898752..90f2a0cb 100644 --- a/greenmine/base/serializers.py +++ b/greenmine/base/serializers.py @@ -1,4 +1,7 @@ +# -*- coding: utf-8 -*- + from rest_framework import serializers +from greenmine.base.models import User class UserLogged(object): @@ -48,3 +51,10 @@ class LoginSerializer(serializers.Serializer): instance.colorize_tags = attrs.get('colorize_tags', instance.colorize_tags) return instance return UserLogged(**attrs) + + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + exclude = ('password',) + #fields = ('id', 'username') diff --git a/greenmine/base/urls.py b/greenmine/base/urls.py index 07c0e8de..1099542a 100644 --- a/greenmine/base/urls.py +++ b/greenmine/base/urls.py @@ -1,11 +1,13 @@ -from django.conf.urls import patterns, url -from rest_framework.urlpatterns import format_suffix_patterns +# -*- coding: utf-8 -*- -from greenmine.base.api import Login, Logout, ApiRoot +from rest_framework.urlpatterns import format_suffix_patterns +from django.conf.urls import patterns, url +from greenmine.base import api urlpatterns = format_suffix_patterns(patterns('', - url(r'^auth/login/$', Login.as_view(), name='login'), - url(r'^auth/logout/$', Logout.as_view(), name='logout'), - url(r'^$', ApiRoot.as_view(), name='api_root'), + url(r'^auth/login/$', api.Login.as_view(), name='login'), + url(r'^auth/logout/$', api.Logout.as_view(), name='logout'), + url(r'^users/$', api.UserList.as_view(), name="user-list"), + url(r'^$', api.ApiRoot.as_view(), name='api_root'), )) diff --git a/greenmine/scrum/admin.py b/greenmine/scrum/admin.py index fbbdfedb..2f0172a5 100644 --- a/greenmine/scrum/admin.py +++ b/greenmine/scrum/admin.py @@ -50,16 +50,10 @@ class UserStoryAdmin(reversion.VersionAdmin): admin.site.register(models.UserStory, UserStoryAdmin) -class ChangeAdmin(reversion.VersionAdmin): - list_display = ["id", "change_type", "project", "owner"] +class AttachmentAdmin(reversion.VersionAdmin): + list_display = ["id", "owner"] -admin.site.register(models.Change, ChangeAdmin) - - -class ChangeAttachmentAdmin(reversion.VersionAdmin): - list_display = ["id", "change", "owner"] - -admin.site.register(models.ChangeAttachment, ChangeAttachmentAdmin) +admin.site.register(models.Attachment, AttachmentAdmin) class TaskAdmin(reversion.VersionAdmin): diff --git a/greenmine/scrum/api.py b/greenmine/scrum/api.py index 17701078..c10e2dab 100644 --- a/greenmine/scrum/api.py +++ b/greenmine/scrum/api.py @@ -7,6 +7,7 @@ from greenmine.scrum.serializers import * from greenmine.scrum.models import * from greenmine.scrum.permissions import * + class UserStoryFilter(django_filters.FilterSet): no_milestone = django_filters.NumberFilter(name="milestone", lookup_type='isnull') @@ -99,9 +100,9 @@ class UserStoryDetail(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsAuthenticated, UserStoryDetailPermission,) -class ChangeList(generics.ListCreateAPIView): - model = Change - serializer_class = ChangeSerializer +class AttachmentList(generics.ListCreateAPIView): + model = Attachment + serializer_class = AttachmentSerializer permission_classes = (IsAuthenticated,) def get_queryset(self): @@ -111,28 +112,10 @@ class ChangeList(generics.ListCreateAPIView): obj.owner = self.request.user -class ChangeDetail(generics.RetrieveUpdateDestroyAPIView): - model = Change - serializer_class = ChangeSerializer - permission_classes = (IsAuthenticated, ChangeDetailPermission,) - - -class ChangeAttachmentList(generics.ListCreateAPIView): - model = ChangeAttachment - serializer_class = ChangeAttachmentSerializer - permission_classes = (IsAuthenticated,) - - def get_queryset(self): - return self.model.objects.filter(change__project__members=self.request.user) - - def pre_save(self, obj): - obj.owner = self.request.user - - -class ChangeAttachmentDetail(generics.RetrieveUpdateDestroyAPIView): - model = ChangeAttachment - serializer_class = ChangeAttachmentSerializer - permission_classes = (IsAuthenticated, ChangeAttachmentDetailPermission,) +class AttachmentDetail(generics.RetrieveUpdateDestroyAPIView): + model = Attachment + serializer_class = AttachmentSerializer + permission_classes = (IsAuthenticated, AttachmentDetailPermission,) class TaskList(generics.ListCreateAPIView): diff --git a/greenmine/scrum/models.py b/greenmine/scrum/models.py index 56bc4831..db11ebd5 100644 --- a/greenmine/scrum/models.py +++ b/greenmine/scrum/models.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from django.db import models - from django.utils import timezone from django.dispatch import receiver from django.contrib.contenttypes.models import ContentType @@ -245,29 +244,18 @@ class UserStory(models.Model): return self.status.is_closed -class Change(models.Model): - change_type = models.IntegerField(choices=TASK_CHANGE_CHOICES) - owner = models.ForeignKey('base.User', related_name='changes') - created_date = models.DateTimeField(auto_now_add=True) - - project = models.ForeignKey("Project", related_name="changes") +class Attachment(models.Model): + owner = models.ForeignKey("base.User", related_name="change_attachments") + project = models.ForeignKey("Project", related_name="attachments") content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey('content_type', 'object_id') - data = PickledObjectField() - tags = PickledObjectField() - - -class ChangeAttachment(models.Model): - change = models.ForeignKey("Change", related_name="attachments") - owner = models.ForeignKey("base.User", related_name="change_attachments") - created_date = models.DateTimeField(auto_now_add=True) attached_file = models.FileField(upload_to="files/msg", max_length=500, null=True, blank=True) - tags = PickledObjectField() + class Task(models.Model): @@ -300,7 +288,6 @@ class Task(models.Model): watchers = models.ManyToManyField('base.User', related_name='task_watch', null=True) - changes = generic.GenericRelation(Change) tags = PickledObjectField() class Meta: @@ -358,7 +345,6 @@ class Issue(models.Model): watchers = models.ManyToManyField('base.User', related_name='issue_watch', null=True) - changes = generic.GenericRelation(Change) tags = PickledObjectField() class Meta: diff --git a/greenmine/scrum/permissions.py b/greenmine/scrum/permissions.py index 7f52e9ba..a9b70ca7 100644 --- a/greenmine/scrum/permissions.py +++ b/greenmine/scrum/permissions.py @@ -1,5 +1,6 @@ from greenmine.base.permissions import BaseDetailPermission + class ProjectDetailPermission(BaseDetailPermission): get_permission = "can_view_project" put_permission = "change_project" @@ -8,6 +9,7 @@ class ProjectDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = [] + class MilestoneDetailPermission(BaseDetailPermission): get_permission = "can_view_milestone" put_permission = "change_milestone" @@ -16,6 +18,7 @@ class MilestoneDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class UserStoryDetailPermission(BaseDetailPermission): get_permission = "can_view_userstory" put_permission = "change_userstory" @@ -24,6 +27,7 @@ class UserStoryDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class TaskDetailPermission(BaseDetailPermission): get_permission = "can_view_task" put_permission = "change_task" @@ -32,6 +36,7 @@ class TaskDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class IssueDetailPermission(BaseDetailPermission): get_permission = "can_view_issue" put_permission = "change_issue" @@ -40,15 +45,8 @@ class IssueDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] -class ChangeDetailPermission(BaseDetailPermission): - get_permission = "can_view_change" - put_permission = "change_change" - patch_permission = "change_change" - delete_permission = "can_delete_change" - safe_methods = ['HEAD', 'OPTIONS'] - path_to_project = ['project'] -class ChangeAttachmentDetailPermission(BaseDetailPermission): +class AttachmentDetailPermission(BaseDetailPermission): get_permission = "can_view_changeattachment" put_permission = "change_changeattachment" patch_permission = "change_changeattachment" @@ -56,6 +54,7 @@ class ChangeAttachmentDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['change', 'project'] + class SeverityDetailPermission(BaseDetailPermission): get_permission = "can_view_severity" put_permission = "can_severity_severity" @@ -64,6 +63,7 @@ class SeverityDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class IssueStatusDetailPermission(BaseDetailPermission): get_permission = "can_view_issuestatus" put_permission = "can_severity_issuestatus" @@ -72,6 +72,7 @@ class IssueStatusDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class TaskStatusDetailPermission(BaseDetailPermission): get_permission = "can_view_taskstatus" put_permission = "can_severity_taskstatus" @@ -80,6 +81,7 @@ class TaskStatusDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class UserStoryStatusDetailPermission(BaseDetailPermission): get_permission = "can_view_userstorystatus" put_permission = "can_severity_userstorystatus" @@ -88,6 +90,7 @@ class UserStoryStatusDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class PriorityDetailPermission(BaseDetailPermission): get_permission = "can_view_priority" put_permission = "can_severity_priority" @@ -96,6 +99,7 @@ class PriorityDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class IssueTypeDetailPermission(BaseDetailPermission): get_permission = "can_view_issuetype" put_permission = "can_severity_issuetype" @@ -104,6 +108,7 @@ class IssueTypeDetailPermission(BaseDetailPermission): safe_methods = ['HEAD', 'OPTIONS'] path_to_project = ['project'] + class PointsDetailPermission(BaseDetailPermission): get_permission = "can_view_points" put_permission = "can_severity_points" diff --git a/greenmine/scrum/serializers.py b/greenmine/scrum/serializers.py index 10ea68b3..16bb5fc7 100644 --- a/greenmine/scrum/serializers.py +++ b/greenmine/scrum/serializers.py @@ -48,19 +48,9 @@ class MilestoneSerializer(serializers.ModelSerializer): fields = () -class ChangeSerializer(serializers.ModelSerializer): - tags = PickleField() - +class AttachmentSerializer(serializers.ModelSerializer): class Meta: - model = Change - fields = () - - -class ChangeAttachmentSerializer(serializers.ModelSerializer): - tags = PickleField() - - class Meta: - model = ChangeAttachment + model = Attachment fields = () diff --git a/greenmine/scrum/urls.py b/greenmine/scrum/urls.py index e96b5f83..7454b495 100644 --- a/greenmine/scrum/urls.py +++ b/greenmine/scrum/urls.py @@ -10,10 +10,8 @@ urlpatterns = format_suffix_patterns(patterns('', url(r'^milestones/(?P[0-9]+)/$', api.MilestoneDetail.as_view(), name='milestone-detail'), url(r'^user_stories/$', api.UserStoryList.as_view(), name='user-story-list'), url(r'^user_stories/(?P[0-9]+)/$', api.UserStoryDetail.as_view(), name='user-story-detail'), - url(r'^changes/$', api.ChangeList.as_view(), name='change-list'), - url(r'^changes/(?P[0-9]+)/$', api.ChangeDetail.as_view(), name='change-detail'), - url(r'^change_attachments/$', api.ChangeAttachmentList.as_view(), name='change-attachment-list'), - url(r'^change_attachments/(?P[0-9]+)/$', api.ChangeAttachmentDetail.as_view(), name='change-attachment-detail'), + url(r'^attachments/$', api.AttachmentList.as_view(), name='attachment-list'), + url(r'^attachments/(?P[0-9]+)/$', api.AttachmentDetail.as_view(), name='attachment-detail'), url(r'^issues/$', api.IssueList.as_view(), name='issue-list'), url(r'^issues/(?P[0-9]+)/$', api.IssueDetail.as_view(), name='issue-detail'), url(r'^tasks/$', api.TaskList.as_view(), name='task-list'),