Mede some minor fixes

remotes/origin/enhancement/email-actions
David Barragán Merino 2013-04-26 15:30:06 +02:00
parent bce92c42f0
commit 8cb299c218
30 changed files with 111 additions and 54 deletions

View File

@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from greenmine.documents.models import Document
from . import models
class DocumentAdmin(admin.ModelAdmin):
list_display = ["title", "project", "owner"]
admin.site.register(Document, DocumentAdmin)
admin.site.register(models.Document, DocumentAdmin)

View File

@ -1,19 +1,21 @@
# -*- coding: utf-8 -*-
from rest_framework import generics
from greenmine.documents.serializers import DocumentSerializer
from greenmine.documents.models import Document
from greenmine.documents.permissions import DocumentDetailPermission
from . import serializers
from . import models
from . import permissions
class DocumentList(generics.ListCreateAPIView):
model = Document
serializer_class = DocumentSerializer
model = models.Document
serializer_class = serializers.DocumentSerializer
def get_queryset(self):
return self.model.objects.filter(project__members=self.request.user)
return super(DocumentList, self).filter(project__members=self.request.user)
class DocumentDetail(generics.RetrieveUpdateDestroyAPIView):
model = Document
serializer_class = DocumentSerializer
permission_classes = (DocumentDetailPermission,)
model = models.Document
serializer_class = serializers.DocumentSerializer
permission_classes = (permissions.DocumentDetailPermission,)

View File

@ -1,4 +1,5 @@
# -* coding: utf-8 -*-
from django.db import models
from django.utils.translation import ugettext_lazy as _

View File

@ -1,5 +1,8 @@
# -*- coding: utf-8 -*-
from greenmine.base.permissions import BaseDetailPermission
class DocumentDetailPermission(BaseDetailPermission):
get_permission = "can_view_document"
put_permission = "can_change_document"

View File

@ -1,14 +1,17 @@
# -* coding: utf-8 -*-
from haystack import indexes
from .models import Document
from . import models
class DocumentIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True, template_name='search/indexes/document_text.txt')
text = indexes.CharField(document=True, use_template=True,
template_name='search/indexes/document_text.txt')
title = indexes.CharField(model_attr='title')
def get_model(self):
return Document
return models.Document
def index_queryset(self, using=None):
return self.get_model().objects.all()

View File

@ -1,8 +1,11 @@
# -*- coding: utf-8 -*-
from rest_framework import serializers
from greenmine.documents.models import Document
from . import models
class DocumentSerializer(serializers.ModelSerializer):
class Meta:
model = Document
model = models.Document
fields = ()

View File

@ -1,7 +1,10 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from greenmine.documents import api
from . import api
urlpatterns = format_suffix_patterns(patterns('',
url(r'^documents/$', api.DocumentList.as_view(), name='document-list'),

View File

@ -1,7 +1,8 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from greenmine.questions.models import Question, QuestionStatus
from . import models
import reversion
@ -9,10 +10,10 @@ import reversion
class QuestionAdmin(reversion.VersionAdmin):
list_display = ["subject", "project", "owner"]
admin.site.register(Question, QuestionAdmin)
admin.site.register(models.Question, QuestionAdmin)
class QuestionStatusAdmin(admin.ModelAdmin):
list_display = ["name", "order", "is_closed", "project"]
admin.site.register(QuestionStatus, QuestionStatusAdmin)
admin.site.register(models.QuestionStatus, QuestionStatusAdmin)

View File

@ -3,29 +3,31 @@
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from greenmine.questions.serializers import QuestionSerializer
from greenmine.questions.models import Question
from greenmine.questions.permissions import QuestionDetailPermission
from . import serializers
from . import models
from . import permissions
import reversion
class QuestionList(generics.ListCreateAPIView):
model = Question
serializer_class = QuestionSerializer
model = models.Question
serializer_class = serializers.QuestionSerializer
filter_fields = ('project',)
permission_classes = (IsAuthenticated,)
def get_queryset(self):
return self.model.objects.filter(project__members=self.request.user)
return super(QuestionList, self).filter(project__members=self.request.user)
def pre_save(self, obj):
obj.owner = self.request.user
class QuestionDetail(generics.RetrieveUpdateDestroyAPIView):
model = Question
serializer_class = QuestionSerializer
permission_classes = (IsAuthenticated, QuestionDetailPermission,)
model = models.Question
serializer_class = serializers.QuestionSerializer
permission_classes = (IsAuthenticated, permissions.QuestionDetailPermission,)
def post_save(self, obj, created=False):
with reversion.create_revision():

View File

@ -102,9 +102,7 @@ class Question(models.Model):
super(Question, self).save(*args, **kwargs)
# Model related signals handlers
@receiver(models.signals.post_save, sender=Project, dispatch_uid='project_post_save_add_question_states')
def project_post_save_add_question_states(sender, instance, created, **kwargs):
"""

View File

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
from greenmine.base.permissions import BaseDetailPermission

View File

@ -1,14 +1,17 @@
# -* coding: utf-8 -*-
from haystack import indexes
from .models import Question
from . import models
class QuestionIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True, template_name='search/indexes/question_text.txt')
text = indexes.CharField(document=True, use_template=True,
template_name='search/indexes/question_text.txt')
title = indexes.CharField(model_attr='subject')
def get_model(self):
return Question
return models.Question
def index_queryset(self, using=None):
return self.get_model().objects.all()

View File

@ -2,10 +2,11 @@
from rest_framework import serializers
from greenmine.questions.models import Question
import reversion
from greenmine.scrum.serializers import PickleField
import reversion
from . import models
class QuestionSerializer(serializers.ModelSerializer):
@ -14,7 +15,7 @@ class QuestionSerializer(serializers.ModelSerializer):
history = serializers.SerializerMethodField('get_history')
class Meta:
model = Question
model = models.Question
fields = ()
def get_comment(self, obj):

View File

@ -1,7 +1,10 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from greenmine.questions import api
from . import api
urlpatterns = format_suffix_patterns(patterns('',
url(r'^questions/$', api.QuestionList.as_view(), name='question-list'),

View File

@ -30,6 +30,7 @@ class UserStoryInline(admin.TabularInline):
else:
return models.UserStory.objects.none()
class ProjectAdmin(reversion.VersionAdmin):
list_display = ["name", "owner"]
inlines = [MembershipInline, MilestoneInline, UserStoryInline]
@ -67,30 +68,39 @@ class MembershipAdmin(admin.ModelAdmin):
list_display = ['project', 'role', 'user']
list_filter = ['project', 'role']
class IssueAdmin(reversion.VersionAdmin):
list_display = ["subject", "type"]
class SeverityAdmin(admin.ModelAdmin):
list_display = ["name", "order", "project"]
class PriorityAdmin(admin.ModelAdmin):
list_display = ["name", "order", "project"]
class PointsAdmin(admin.ModelAdmin):
list_display = ["name", "order", "project"]
class IssueTypeAdmin(admin.ModelAdmin):
list_display = ["name", "order", "project"]
class IssueStatusAdmin(admin.ModelAdmin):
list_display = ["name", "order", "is_closed", "project"]
class TaskStatusAdmin(admin.ModelAdmin):
list_display = ["name", "order", "is_closed", "project"]
class UserStoryStatusAdmin(admin.ModelAdmin):
list_display = ["name", "order", "is_closed", "project"]
admin.site.register(models.Task, TaskAdmin)
admin.site.register(models.Issue, IssueAdmin)

View File

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
import django_filters
from rest_framework import generics

View File

@ -2,6 +2,7 @@
from django.utils.translation import ugettext_lazy as _
PRIORITY_CHOICES = (
(1, _(u'Low')),
(3, _(u'Normal')),

View File

@ -13,6 +13,7 @@ from greenmine.base.models import User, Role
from greenmine.scrum.models import *
from greenmine.questions.models import *
subjects = [
"Fixing templates for Django 1.2.",
"get_actions() does not check for 'delete_selected' in actions",
@ -32,13 +33,13 @@ subjects = [
class Command(BaseCommand):
def create_user(self, counter):
user = User.objects.create(
username='user%d' % (counter),
first_name='user%d' % (counter),
email='foouser%d@domain.com' % (counter),
username='useri{0}'.format(counter),
first_name='user{0}'.format(counter),
email='foouser{0}@domain.com'.format(counter),
token=''.join(random.sample('abcdef0123456789', 10)),
)
user.set_password('user%d' % (counter))
user.set_password('user{0}'.format(counter))
user.save()
return user
@ -54,8 +55,8 @@ class Command(BaseCommand):
for x in xrange(3):
# create project
project = Project(
name='Project Example 1 %s' % (x),
description='Project example %s description' % (x),
name='Project Example 1 {0}'.format(x),
description='Project example {0} description'.format(x),
owner=random.choice(users),
public=True,
)
@ -71,7 +72,7 @@ class Command(BaseCommand):
for y in xrange(2):
milestone = Milestone.objects.create(
project=project,
name='Sprint %s' % (y),
name='Sprint {0}'.format(y),
owner=project.owner,
created_date=now_date,
modified_date=now_date,
@ -102,7 +103,7 @@ class Command(BaseCommand):
for w in xrange(3):
Task.objects.create(
subject="Task %s" % (w),
subject="Task %s".format(w),
description=lorem_ipsum.words(30, common=False),
project=project,
owner=random.choice(users),

View File

@ -376,8 +376,7 @@ class Attachment(models.Model):
def __unicode__(self):
return u'content_type {0} - object_id {1} - attachment {2}'.format(
self.content_type, self.object_id, self.id
)
self.content_type, self.object_id, self.id)
class Task(models.Model):

View File

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
from greenmine.base.permissions import BaseDetailPermission

View File

@ -1,10 +1,12 @@
# -* coding: utf-8 -*-
from haystack import indexes
from greenmine.scrum.models import UserStory, Task
class UserStoryIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True, template_name='search/indexes/userstory_text.txt')
text = indexes.CharField(document=True, use_template=True,
template_name='search/indexes/userstory_text.txt')
title = indexes.CharField(model_attr='subject')
def get_model(self):
@ -15,7 +17,8 @@ class UserStoryIndex(indexes.SearchIndex, indexes.Indexable):
class TaskIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True, template_name='search/indexes/task_text.txt')
text = indexes.CharField(document=True, use_template=True,
template_name='search/indexes/task_text.txt')
title = indexes.CharField(model_attr='subject')
def get_model(self):

View File

@ -7,6 +7,7 @@ from picklefield.fields import dbsafe_encode, dbsafe_decode
import json, reversion
class PickleField(serializers.WritableField):
"""
Pickle objects serializer.

View File

@ -5,6 +5,7 @@ from rest_framework.urlpatterns import format_suffix_patterns
from greenmine.scrum import api
urlpatterns = format_suffix_patterns(patterns('',
url(r'^projects/$', api.ProjectList.as_view(), name='project-list'),
url(r'^projects/(?P<pk>[0-9]+)/$', api.ProjectDetail.as_view(), name='project-detail'),

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from greenmine.wiki.models import WikiPage, WikiPageAttachment

View File

@ -37,8 +37,8 @@ class WikiPageDetail(generics.RetrieveUpdateDestroyAPIView):
# Get the single item from the filtered queryset
obj = queryset.get()
except ObjectDoesNotExist:
raise Http404(_("No %(verbose_name)s found matching the query") %
{'verbose_name': queryset.model._meta.verbose_name})
raise Http404(_("No {verbose_name} found matching the query").format(
verbose_name=queryset.model._meta.verbose_name))
return obj

View File

@ -59,5 +59,5 @@ class WikiPageAttachment(models.Model):
ordering = ['wikipage', 'created_date']
def __unicode__(self):
return u'project {0} - page {1} - attachment {2}'.format(self.wikipage.project_id, self.wikipage.subject, self.id)
return u'project {0} - page {1} - attachment {2}'.format(self.wikipage.project_id,
self.wikipage.subject, self.id)

View File

@ -1,5 +1,8 @@
# -*- coding: utf-8 -*-
from greenmine.base.permissions import BaseDetailPermission
class WikiPageDetailPermission(BaseDetailPermission):
get_permission = "can_view_wikipage"
put_permission = "change_wikipage"
@ -8,6 +11,7 @@ class WikiPageDetailPermission(BaseDetailPermission):
safe_methods = ['HEAD', 'OPTIONS']
path_to_project = ['project']
class WikiPageAttachmentDetailPermission(BaseDetailPermission):
get_permission = "can_view_wikipageattachment"
put_permission = "change_wikipageattachment"

View File

@ -1,4 +1,5 @@
# -* coding: utf-8 -*-
from haystack import indexes
from .models import WikiPage

View File

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
from rest_framework import serializers
from greenmine.wiki.models import WikiPage, WikiPageAttachment

View File

@ -1,8 +1,11 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from greenmine.wiki import api
urlpatterns = format_suffix_patterns(patterns('',
url(r'^pages/$', api.WikiPageList.as_view(), name='wiki-page-list'),
url(r'^pages/(?P<projectid>\d+)-(?P<slug>[\w\-\d]+)/$', api.WikiPageDetail.as_view(), name='wiki-page-detail'),