Initial implementation of users list api call.

remotes/origin/enhancement/email-actions
Andrey Antukh 2013-04-08 10:56:35 +02:00
parent 3036396d8c
commit bc4aa2cb4f
10 changed files with 79 additions and 115 deletions

View File

@ -9,10 +9,13 @@ from rest_framework.parsers import JSONParser
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework import status 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.base.models import User
from greenmine.scrum import models
class ApiRoot(APIView): class ApiRoot(APIView):
@ -23,8 +26,7 @@ class ApiRoot(APIView):
'projects': reverse('project-list', request=request, format=format), 'projects': reverse('project-list', request=request, format=format),
'milestones': reverse('milestone-list', request=request, format=format), 'milestones': reverse('milestone-list', request=request, format=format),
'user-stories': reverse('user-story-list', request=request, format=format), 'user-stories': reverse('user-story-list', request=request, format=format),
'changes': reverse('change-list', request=request, format=format), 'attachments': reverse('attachment-list', request=request, format=format),
'change-attachments': reverse('change-attachment-list', request=request, format=format),
'tasks': reverse('task-list', request=request, format=format), 'tasks': reverse('task-list', request=request, format=format),
'issues': reverse('issue-list', request=request, format=format), 'issues': reverse('issue-list', request=request, format=format),
'severities': reverse('severity-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), 'question_responses': reverse('question-response-list', request=request, format=format),
'wiki_pages': reverse('wiki-page-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), '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): class Login(APIView):
def post(self, request, format=None): def post(self, request, format=None):
username = request.DATA.get('username', None) username = request.DATA.get('username', None)

View File

@ -169,36 +169,6 @@
"questions", "questions",
"questionresponse" "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", "add_issue",
"scrum", "scrum",

View File

@ -1,4 +1,7 @@
# -*- coding: utf-8 -*-
from rest_framework import serializers from rest_framework import serializers
from greenmine.base.models import User
class UserLogged(object): class UserLogged(object):
@ -48,3 +51,10 @@ class LoginSerializer(serializers.Serializer):
instance.colorize_tags = attrs.get('colorize_tags', instance.colorize_tags) instance.colorize_tags = attrs.get('colorize_tags', instance.colorize_tags)
return instance return instance
return UserLogged(**attrs) return UserLogged(**attrs)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
exclude = ('password',)
#fields = ('id', 'username')

View File

@ -1,11 +1,13 @@
from django.conf.urls import patterns, url # -*- coding: utf-8 -*-
from rest_framework.urlpatterns import format_suffix_patterns
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('', urlpatterns = format_suffix_patterns(patterns('',
url(r'^auth/login/$', Login.as_view(), name='login'), url(r'^auth/login/$', api.Login.as_view(), name='login'),
url(r'^auth/logout/$', Logout.as_view(), name='logout'), url(r'^auth/logout/$', api.Logout.as_view(), name='logout'),
url(r'^$', ApiRoot.as_view(), name='api_root'), url(r'^users/$', api.UserList.as_view(), name="user-list"),
url(r'^$', api.ApiRoot.as_view(), name='api_root'),
)) ))

View File

@ -50,16 +50,10 @@ class UserStoryAdmin(reversion.VersionAdmin):
admin.site.register(models.UserStory, UserStoryAdmin) admin.site.register(models.UserStory, UserStoryAdmin)
class ChangeAdmin(reversion.VersionAdmin): class AttachmentAdmin(reversion.VersionAdmin):
list_display = ["id", "change_type", "project", "owner"] list_display = ["id", "owner"]
admin.site.register(models.Change, ChangeAdmin) admin.site.register(models.Attachment, AttachmentAdmin)
class ChangeAttachmentAdmin(reversion.VersionAdmin):
list_display = ["id", "change", "owner"]
admin.site.register(models.ChangeAttachment, ChangeAttachmentAdmin)
class TaskAdmin(reversion.VersionAdmin): class TaskAdmin(reversion.VersionAdmin):

View File

@ -7,6 +7,7 @@ from greenmine.scrum.serializers import *
from greenmine.scrum.models import * from greenmine.scrum.models import *
from greenmine.scrum.permissions import * from greenmine.scrum.permissions import *
class UserStoryFilter(django_filters.FilterSet): class UserStoryFilter(django_filters.FilterSet):
no_milestone = django_filters.NumberFilter(name="milestone", lookup_type='isnull') no_milestone = django_filters.NumberFilter(name="milestone", lookup_type='isnull')
@ -99,9 +100,9 @@ class UserStoryDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = (IsAuthenticated, UserStoryDetailPermission,) permission_classes = (IsAuthenticated, UserStoryDetailPermission,)
class ChangeList(generics.ListCreateAPIView): class AttachmentList(generics.ListCreateAPIView):
model = Change model = Attachment
serializer_class = ChangeSerializer serializer_class = AttachmentSerializer
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)
def get_queryset(self): def get_queryset(self):
@ -111,28 +112,10 @@ class ChangeList(generics.ListCreateAPIView):
obj.owner = self.request.user obj.owner = self.request.user
class ChangeDetail(generics.RetrieveUpdateDestroyAPIView): class AttachmentDetail(generics.RetrieveUpdateDestroyAPIView):
model = Change model = Attachment
serializer_class = ChangeSerializer serializer_class = AttachmentSerializer
permission_classes = (IsAuthenticated, ChangeDetailPermission,) permission_classes = (IsAuthenticated, AttachmentDetailPermission,)
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 TaskList(generics.ListCreateAPIView): class TaskList(generics.ListCreateAPIView):

View File

@ -1,7 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.dispatch import receiver from django.dispatch import receiver
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
@ -245,29 +244,18 @@ class UserStory(models.Model):
return self.status.is_closed return self.status.is_closed
class Change(models.Model): class Attachment(models.Model):
change_type = models.IntegerField(choices=TASK_CHANGE_CHOICES) owner = models.ForeignKey("base.User", related_name="change_attachments")
owner = models.ForeignKey('base.User', related_name='changes') project = models.ForeignKey("Project", related_name="attachments")
created_date = models.DateTimeField(auto_now_add=True)
project = models.ForeignKey("Project", related_name="changes")
content_type = models.ForeignKey(ContentType) content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField() object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id') 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) created_date = models.DateTimeField(auto_now_add=True)
attached_file = models.FileField(upload_to="files/msg", max_length=500, attached_file = models.FileField(upload_to="files/msg", max_length=500,
null=True, blank=True) null=True, blank=True)
tags = PickledObjectField()
class Task(models.Model): class Task(models.Model):
@ -300,7 +288,6 @@ class Task(models.Model):
watchers = models.ManyToManyField('base.User', related_name='task_watch', watchers = models.ManyToManyField('base.User', related_name='task_watch',
null=True) null=True)
changes = generic.GenericRelation(Change)
tags = PickledObjectField() tags = PickledObjectField()
class Meta: class Meta:
@ -358,7 +345,6 @@ class Issue(models.Model):
watchers = models.ManyToManyField('base.User', related_name='issue_watch', watchers = models.ManyToManyField('base.User', related_name='issue_watch',
null=True) null=True)
changes = generic.GenericRelation(Change)
tags = PickledObjectField() tags = PickledObjectField()
class Meta: class Meta:

View File

@ -1,5 +1,6 @@
from greenmine.base.permissions import BaseDetailPermission from greenmine.base.permissions import BaseDetailPermission
class ProjectDetailPermission(BaseDetailPermission): class ProjectDetailPermission(BaseDetailPermission):
get_permission = "can_view_project" get_permission = "can_view_project"
put_permission = "change_project" put_permission = "change_project"
@ -8,6 +9,7 @@ class ProjectDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = [] path_to_project = []
class MilestoneDetailPermission(BaseDetailPermission): class MilestoneDetailPermission(BaseDetailPermission):
get_permission = "can_view_milestone" get_permission = "can_view_milestone"
put_permission = "change_milestone" put_permission = "change_milestone"
@ -16,6 +18,7 @@ class MilestoneDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class UserStoryDetailPermission(BaseDetailPermission): class UserStoryDetailPermission(BaseDetailPermission):
get_permission = "can_view_userstory" get_permission = "can_view_userstory"
put_permission = "change_userstory" put_permission = "change_userstory"
@ -24,6 +27,7 @@ class UserStoryDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class TaskDetailPermission(BaseDetailPermission): class TaskDetailPermission(BaseDetailPermission):
get_permission = "can_view_task" get_permission = "can_view_task"
put_permission = "change_task" put_permission = "change_task"
@ -32,6 +36,7 @@ class TaskDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class IssueDetailPermission(BaseDetailPermission): class IssueDetailPermission(BaseDetailPermission):
get_permission = "can_view_issue" get_permission = "can_view_issue"
put_permission = "change_issue" put_permission = "change_issue"
@ -40,15 +45,8 @@ class IssueDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] 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" get_permission = "can_view_changeattachment"
put_permission = "change_changeattachment" put_permission = "change_changeattachment"
patch_permission = "change_changeattachment" patch_permission = "change_changeattachment"
@ -56,6 +54,7 @@ class ChangeAttachmentDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['change', 'project'] path_to_project = ['change', 'project']
class SeverityDetailPermission(BaseDetailPermission): class SeverityDetailPermission(BaseDetailPermission):
get_permission = "can_view_severity" get_permission = "can_view_severity"
put_permission = "can_severity_severity" put_permission = "can_severity_severity"
@ -64,6 +63,7 @@ class SeverityDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class IssueStatusDetailPermission(BaseDetailPermission): class IssueStatusDetailPermission(BaseDetailPermission):
get_permission = "can_view_issuestatus" get_permission = "can_view_issuestatus"
put_permission = "can_severity_issuestatus" put_permission = "can_severity_issuestatus"
@ -72,6 +72,7 @@ class IssueStatusDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class TaskStatusDetailPermission(BaseDetailPermission): class TaskStatusDetailPermission(BaseDetailPermission):
get_permission = "can_view_taskstatus" get_permission = "can_view_taskstatus"
put_permission = "can_severity_taskstatus" put_permission = "can_severity_taskstatus"
@ -80,6 +81,7 @@ class TaskStatusDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class UserStoryStatusDetailPermission(BaseDetailPermission): class UserStoryStatusDetailPermission(BaseDetailPermission):
get_permission = "can_view_userstorystatus" get_permission = "can_view_userstorystatus"
put_permission = "can_severity_userstorystatus" put_permission = "can_severity_userstorystatus"
@ -88,6 +90,7 @@ class UserStoryStatusDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class PriorityDetailPermission(BaseDetailPermission): class PriorityDetailPermission(BaseDetailPermission):
get_permission = "can_view_priority" get_permission = "can_view_priority"
put_permission = "can_severity_priority" put_permission = "can_severity_priority"
@ -96,6 +99,7 @@ class PriorityDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class IssueTypeDetailPermission(BaseDetailPermission): class IssueTypeDetailPermission(BaseDetailPermission):
get_permission = "can_view_issuetype" get_permission = "can_view_issuetype"
put_permission = "can_severity_issuetype" put_permission = "can_severity_issuetype"
@ -104,6 +108,7 @@ class IssueTypeDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS'] safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project'] path_to_project = ['project']
class PointsDetailPermission(BaseDetailPermission): class PointsDetailPermission(BaseDetailPermission):
get_permission = "can_view_points" get_permission = "can_view_points"
put_permission = "can_severity_points" put_permission = "can_severity_points"

View File

@ -48,19 +48,9 @@ class MilestoneSerializer(serializers.ModelSerializer):
fields = () fields = ()
class ChangeSerializer(serializers.ModelSerializer): class AttachmentSerializer(serializers.ModelSerializer):
tags = PickleField()
class Meta: class Meta:
model = Change model = Attachment
fields = ()
class ChangeAttachmentSerializer(serializers.ModelSerializer):
tags = PickleField()
class Meta:
model = ChangeAttachment
fields = () fields = ()

View File

@ -10,10 +10,8 @@ urlpatterns = format_suffix_patterns(patterns('',
url(r'^milestones/(?P<pk>[0-9]+)/$', api.MilestoneDetail.as_view(), name='milestone-detail'), url(r'^milestones/(?P<pk>[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/$', api.UserStoryList.as_view(), name='user-story-list'),
url(r'^user_stories/(?P<pk>[0-9]+)/$', api.UserStoryDetail.as_view(), name='user-story-detail'), url(r'^user_stories/(?P<pk>[0-9]+)/$', api.UserStoryDetail.as_view(), name='user-story-detail'),
url(r'^changes/$', api.ChangeList.as_view(), name='change-list'), url(r'^attachments/$', api.AttachmentList.as_view(), name='attachment-list'),
url(r'^changes/(?P<pk>[0-9]+)/$', api.ChangeDetail.as_view(), name='change-detail'), url(r'^attachments/(?P<pk>[0-9]+)/$', api.AttachmentDetail.as_view(), name='attachment-detail'),
url(r'^change_attachments/$', api.ChangeAttachmentList.as_view(), name='change-attachment-list'),
url(r'^change_attachments/(?P<pk>[0-9]+)/$', api.ChangeAttachmentDetail.as_view(), name='change-attachment-detail'),
url(r'^issues/$', api.IssueList.as_view(), name='issue-list'), url(r'^issues/$', api.IssueList.as_view(), name='issue-list'),
url(r'^issues/(?P<pk>[0-9]+)/$', api.IssueDetail.as_view(), name='issue-detail'), url(r'^issues/(?P<pk>[0-9]+)/$', api.IssueDetail.as_view(), name='issue-detail'),
url(r'^tasks/$', api.TaskList.as_view(), name='task-list'), url(r'^tasks/$', api.TaskList.as_view(), name='task-list'),