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.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)

View File

@ -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",

View File

@ -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')

View File

@ -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'),
))

View File

@ -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):

View File

@ -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):

View File

@ -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:

View File

@ -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"

View File

@ -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 = ()

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'^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'^changes/$', api.ChangeList.as_view(), name='change-list'),
url(r'^changes/(?P<pk>[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<pk>[0-9]+)/$', api.ChangeAttachmentDetail.as_view(), name='change-attachment-detail'),
url(r'^attachments/$', api.AttachmentList.as_view(), name='attachment-list'),
url(r'^attachments/(?P<pk>[0-9]+)/$', api.AttachmentDetail.as_view(), name='attachment-detail'),
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'^tasks/$', api.TaskList.as_view(), name='task-list'),