Migrated to rest-framework login and scrum
parent
fa0538bcd1
commit
79d97cfaad
|
@ -1,74 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
import datetime
|
|
||||||
import json
|
|
||||||
|
|
||||||
from django.core.serializers.json import DjangoJSONEncoder
|
|
||||||
from django.views.generic.base import View
|
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
|
||||||
from django.contrib.auth import logout, login, authenticate
|
|
||||||
from django.contrib.auth.models import User
|
|
||||||
from django.utils.functional import Promise
|
|
||||||
from django.utils.encoding import force_text
|
|
||||||
from django.utils.decorators import method_decorator
|
|
||||||
from django.utils import timezone
|
|
||||||
from django import http
|
|
||||||
|
|
||||||
|
|
||||||
class LazyEncoder(DjangoJSONEncoder):
|
|
||||||
"""
|
|
||||||
JSON encoder class for encode correctly traduction strings.
|
|
||||||
Is for ajax response encode.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def default(self, obj):
|
|
||||||
if isinstance(obj, Promise):
|
|
||||||
return force_text(obj)
|
|
||||||
elif isinstance(obj, datetime.datetime):
|
|
||||||
obj = timezone.localtime(obj)
|
|
||||||
return super(LazyEncoder, self).default(obj)
|
|
||||||
|
|
||||||
|
|
||||||
def request_json_to_dict(request):
|
|
||||||
try:
|
|
||||||
body = request.body.decode('utf-8')
|
|
||||||
return json.loads(body)
|
|
||||||
except Exception:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
def to_json(data):
|
|
||||||
return json.dumps(data)
|
|
||||||
|
|
||||||
|
|
||||||
class Login(View):
|
|
||||||
def post(self, request):
|
|
||||||
data = request_json_to_dict(request)
|
|
||||||
|
|
||||||
username = data.get('username', None)
|
|
||||||
password = data.get('password', None)
|
|
||||||
|
|
||||||
try:
|
|
||||||
user = User.objects.get(username=username)
|
|
||||||
if user.check_password(password):
|
|
||||||
user = authenticate(username=username, password=password)
|
|
||||||
login(request, user)
|
|
||||||
return http.HttpResponse(to_json({'token': request.session.session_key}))
|
|
||||||
except User.DoesNotExist:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return http.HttpResponseBadRequest()
|
|
||||||
|
|
||||||
@method_decorator(csrf_exempt)
|
|
||||||
def dispatch(self, *args, **kwargs):
|
|
||||||
return super(Login, self).dispatch(*args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
class Logout(View):
|
|
||||||
def post(self, request):
|
|
||||||
logout(request)
|
|
||||||
return HttpResponse()
|
|
||||||
|
|
||||||
@method_decorator(csrf_exempt)
|
|
||||||
def dispatch(self, *args, **kwargs):
|
|
||||||
return super(Login, self).dispatch(*args, **kwargs)
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
from rest_framework import renderers
|
||||||
|
from rest_framework.decorators import api_view
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework.reverse import reverse
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(('GET',))
|
||||||
|
def api_root(request, format=None):
|
||||||
|
return Response({
|
||||||
|
'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),
|
||||||
|
'tasks': reverse('task-list', request=request, format=format),
|
||||||
|
'severities': reverse('severity-list', request=request, format=format),
|
||||||
|
'issue-status': reverse('issue-status-list', request=request, format=format),
|
||||||
|
'task-status': reverse('task-status-list', request=request, format=format),
|
||||||
|
'user-story-status': reverse('user-story-status-list', request=request, format=format),
|
||||||
|
'priorities': reverse('priority-list', request=request, format=format),
|
||||||
|
'issue-types': reverse('issue-type-list', request=request, format=format),
|
||||||
|
'points': reverse('points-list', request=request, format=format),
|
||||||
|
})
|
|
@ -1,115 +1,134 @@
|
||||||
# myapp/api.py
|
from rest_framework import generics
|
||||||
from tastypie.resources import ModelResource
|
|
||||||
from tastypie.authentication import SessionAuthentication
|
|
||||||
from tastypie.authorization import DjangoAuthorization
|
|
||||||
from tastypie import fields
|
|
||||||
|
|
||||||
from greenmine.scrum import models
|
from greenmine.scrum.serializers import *
|
||||||
|
from greenmine.scrum.models import *
|
||||||
|
|
||||||
|
|
||||||
class ProjectResource(ModelResource):
|
class ProjectList(generics.ListCreateAPIView):
|
||||||
class Meta:
|
model = Project
|
||||||
queryset = models.Project.objects.all()
|
serializer_class = ProjectSerializer
|
||||||
resource_name = 'project'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class MilestoneResource(ModelResource):
|
class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
class Meta:
|
model = Project
|
||||||
queryset = models.Milestone.objects.all()
|
serializer_class = ProjectSerializer
|
||||||
resource_name = 'milestone'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class UserStoryResource(ModelResource):
|
class MilestoneList(generics.ListCreateAPIView):
|
||||||
class Meta:
|
model = Milestone
|
||||||
queryset = models.UserStory.objects.all()
|
serializer_class = MilestoneSerializer
|
||||||
resource_name = 'userstory'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class ChangeResource(ModelResource):
|
class MilestoneDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
class Meta:
|
model = Milestone
|
||||||
queryset = models.Change.objects.all()
|
serializer_class = MilestoneSerializer
|
||||||
resource_name = 'change'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class ChangeAttachmentResource(ModelResource):
|
class UserStoryList(generics.ListCreateAPIView):
|
||||||
class Meta:
|
model = UserStory
|
||||||
queryset = models.ChangeAttachment.objects.all()
|
serializer_class = UserStorySerializer
|
||||||
resource_name = 'changeattachment'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class TaskResource(ModelResource):
|
class UserStoryDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
class Meta:
|
model = UserStory
|
||||||
queryset = models.Task.objects.all()
|
serializer_class = UserStorySerializer
|
||||||
resource_name = 'task'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class SeverityResource(ModelResource):
|
class ChangeList(generics.ListCreateAPIView):
|
||||||
class Meta:
|
model = Change
|
||||||
queryset = models.Severity.objects.all()
|
serializer_class = ChangeSerializer
|
||||||
resource_name = 'choices/severity'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusResource(ModelResource):
|
class ChangeDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
class Meta:
|
model = Change
|
||||||
queryset = models.IssueStatus.objects.all()
|
serializer_class = ChangeSerializer
|
||||||
resource_name = 'choices/issue-status'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
from tastypie.constants import ALL, ALL_WITH_RELATIONS
|
|
||||||
|
|
||||||
class TaskStatusResource(ModelResource):
|
|
||||||
project = fields.ForeignKey(ProjectResource, 'project')
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
queryset = models.TaskStatus.objects.all()
|
|
||||||
resource_name = 'choices/task-status'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
filtering = {
|
|
||||||
"project": ALL_WITH_RELATIONS,
|
|
||||||
}
|
|
||||||
|
|
||||||
class UserStoryStatusResource(ModelResource):
|
|
||||||
class Meta:
|
|
||||||
queryset = models.UserStoryStatus.objects.all()
|
|
||||||
resource_name = 'choices/us-status'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
class PriorityResource(ModelResource):
|
|
||||||
class Meta:
|
|
||||||
queryset = models.Priority.objects.all()
|
|
||||||
resource_name = 'choices/priority'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class IssueTypeResource(ModelResource):
|
class ChangeAttachmentList(generics.ListCreateAPIView):
|
||||||
class Meta:
|
model = ChangeAttachment
|
||||||
queryset = models.IssueType.objects.all()
|
serializer_class = ChangeAttachmentSerializer
|
||||||
resource_name = 'choices/issue-type'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
|
||||||
|
|
||||||
|
|
||||||
class PointsResource(ModelResource):
|
class ChangeAttachmentDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
class Meta:
|
model = ChangeAttachment
|
||||||
queryset = models.Points.objects.all()
|
serializer_class = ChangeAttachmentSerializer
|
||||||
resource_name = 'choices/story-points'
|
|
||||||
authentication = SessionAuthentication()
|
|
||||||
authorization = DjangoAuthorization()
|
class TaskList(generics.ListCreateAPIView):
|
||||||
|
model = Task
|
||||||
|
serializer_class = TaskSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
model = Task
|
||||||
|
serializer_class = TaskSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class SeverityList(generics.ListCreateAPIView):
|
||||||
|
model = Severity
|
||||||
|
serializer_class = SeveritySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class SeverityDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
model = Severity
|
||||||
|
serializer_class = SeveritySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class IssueStatusList(generics.ListCreateAPIView):
|
||||||
|
model = IssueStatus
|
||||||
|
serializer_class = IssueStatusSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class IssueStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
model = IssueStatus
|
||||||
|
serializer_class = IssueStatusSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class TaskStatusList(generics.ListCreateAPIView):
|
||||||
|
model = TaskStatus
|
||||||
|
serializer_class = TaskStatusSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class TaskStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
model = TaskStatus
|
||||||
|
serializer_class = TaskStatusSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class UserStoryStatusList(generics.ListCreateAPIView):
|
||||||
|
model = UserStoryStatus
|
||||||
|
serializer_class = UserStoryStatusSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class UserStoryStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
model = UserStoryStatus
|
||||||
|
serializer_class = UserStoryStatusSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class PriorityList(generics.ListCreateAPIView):
|
||||||
|
model = Priority
|
||||||
|
serializer_class = PrioritySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class PriorityDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
model = Priority
|
||||||
|
serializer_class = PrioritySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class IssueTypeList(generics.ListCreateAPIView):
|
||||||
|
model = IssueType
|
||||||
|
serializer_class = IssueTypeSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class IssueTypeDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
model = IssueType
|
||||||
|
serializer_class = IssueTypeSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class PointsList(generics.ListCreateAPIView):
|
||||||
|
model = Points
|
||||||
|
serializer_class = PointsSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class PointsDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
model = Points
|
||||||
|
serializer_class = PointsSerializer
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from greenmine.scrum.models import *
|
||||||
|
|
||||||
|
class ProjectSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Project
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class MilestoneSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Milestone
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class UserStorySerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = UserStory
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class ChangeSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Change
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class ChangeAttachmentSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = ChangeAttachment
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class TaskSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Task
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class SeveritySerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Severity
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class IssueStatusSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = IssueStatus
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class TaskStatusSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = TaskStatus
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class UserStoryStatusSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = UserStoryStatus
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class PrioritySerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Priority
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class IssueTypeSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = IssueType
|
||||||
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
|
class PointsSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Points
|
||||||
|
fields = ()
|
|
@ -0,0 +1,34 @@
|
||||||
|
from django.conf.urls import patterns, url
|
||||||
|
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'),
|
||||||
|
url(r'^milestones/$', api.MilestoneList.as_view(), name='milestone-list'),
|
||||||
|
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'^tasks/$', api.TaskList.as_view(), name='task-list'),
|
||||||
|
url(r'^tasks/(?P<pk>[0-9]+)/$', api.TaskDetail.as_view(), name='task-detail'),
|
||||||
|
url(r'^severities/$', api.SeverityList.as_view(), name='severity-list'),
|
||||||
|
url(r'^severities/(?P<pk>[0-9]+)/$', api.SeverityDetail.as_view(), name='severity-detail'),
|
||||||
|
url(r'^issue_status/$', api.IssueStatusList.as_view(), name='issue-status-list'),
|
||||||
|
url(r'^issue_status/(?P<pk>[0-9]+)/$', api.IssueStatusDetail.as_view(), name='issue-status-detail'),
|
||||||
|
url(r'^task_status/$', api.TaskStatusList.as_view(), name='task-status-list'),
|
||||||
|
url(r'^task_status/(?P<pk>[0-9]+)/$', api.TaskStatusDetail.as_view(), name='task-status-detail'),
|
||||||
|
url(r'^user_story_status/$', api.UserStoryStatusList.as_view(), name='user-story-status-list'),
|
||||||
|
url(r'^user_story_status/(?P<pk>[0-9]+)/$', api.UserStoryStatusDetail.as_view(), name='user-story-status-detail'),
|
||||||
|
url(r'^priorities/$', api.PriorityList.as_view(), name='priority-list'),
|
||||||
|
url(r'^priorities/(?P<pk>[0-9]+)/$', api.PriorityDetail.as_view(), name='priority-detail'),
|
||||||
|
url(r'^issue_types/$', api.IssueTypeList.as_view(), name='issue-type-list'),
|
||||||
|
url(r'^issue_types/(?P<pk>[0-9]+)/$', api.IssueTypeDetail.as_view(), name='issue-type-detail'),
|
||||||
|
url(r'^points/$', api.PointsList.as_view(), name='points-list'),
|
||||||
|
url(r'^points/(?P<pk>[0-9]+)/$', api.PointsDetail.as_view(), name='points-detail'),
|
||||||
|
))
|
||||||
|
|
|
@ -213,6 +213,7 @@ INSTALLED_APPS = [
|
||||||
'haystack',
|
'haystack',
|
||||||
'reversion',
|
'reversion',
|
||||||
'guardian',
|
'guardian',
|
||||||
|
'rest_framework',
|
||||||
]
|
]
|
||||||
|
|
||||||
WSGI_APPLICATION = 'greenmine.wsgi.application'
|
WSGI_APPLICATION = 'greenmine.wsgi.application'
|
||||||
|
|
|
@ -3,40 +3,11 @@ from django.conf.urls import patterns, include, url
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
admin.autodiscover()
|
admin.autodiscover()
|
||||||
|
|
||||||
from tastypie.api import Api
|
|
||||||
|
|
||||||
from .base.api_actions import Login, Logout
|
|
||||||
from .scrum.api import *
|
|
||||||
from .questions.api import *
|
|
||||||
from .documents.api import *
|
|
||||||
from .profile.api import *
|
|
||||||
from .wiki.api import *
|
|
||||||
|
|
||||||
v1_api = Api(api_name='gm')
|
|
||||||
v1_api.register(ProjectResource())
|
|
||||||
v1_api.register(MilestoneResource())
|
|
||||||
v1_api.register(UserStoryResource())
|
|
||||||
v1_api.register(ChangeResource())
|
|
||||||
v1_api.register(ChangeAttachmentResource())
|
|
||||||
v1_api.register(TaskResource())
|
|
||||||
v1_api.register(QuestionResource())
|
|
||||||
v1_api.register(QuestionResponseResource())
|
|
||||||
v1_api.register(DocumentResource())
|
|
||||||
v1_api.register(ProfileResource())
|
|
||||||
v1_api.register(WikiPageResource())
|
|
||||||
v1_api.register(WikiPageAttachmentResource())
|
|
||||||
v1_api.register(SeverityResource())
|
|
||||||
v1_api.register(IssueStatusResource())
|
|
||||||
v1_api.register(TaskStatusResource())
|
|
||||||
v1_api.register(UserStoryStatusResource())
|
|
||||||
v1_api.register(PriorityResource())
|
|
||||||
v1_api.register(IssueTypeResource())
|
|
||||||
v1_api.register(PointsResource())
|
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
url(r'^api/gm/actions/login/', Login.as_view(), name="login"),
|
url(r'^api/auth/', include('rest_framework.urls',
|
||||||
url(r'^api/gm/actions/logout/', Logout.as_view(), name="logout"),
|
namespace='rest_framework')),
|
||||||
url(r'^api/', include(v1_api.urls)),
|
url(r'^api/$', 'greenmine.base.views.api_root'),
|
||||||
|
url(r'^api/scrum/', include('greenmine.scrum.urls')),
|
||||||
url(r'^admin/', include(admin.site.urls)),
|
url(r'^admin/', include(admin.site.urls)),
|
||||||
url(r'^grappelli/', include('grappelli.urls')),
|
url(r'^grappelli/', include('grappelli.urls')),
|
||||||
)
|
)
|
||||||
|
|
|
@ -10,7 +10,6 @@ django-grappelli==2.4.4
|
||||||
django-guardian==1.1.0.beta
|
django-guardian==1.1.0.beta
|
||||||
django-reversion==1.7
|
django-reversion==1.7
|
||||||
git+git://github.com/toastdriven/django-haystack.git
|
git+git://github.com/toastdriven/django-haystack.git
|
||||||
django-tastypie==0.9.14
|
|
||||||
django-picklefield==0.3.0
|
django-picklefield==0.3.0
|
||||||
kombu==2.5.8
|
kombu==2.5.8
|
||||||
mimeparse==0.1.3
|
mimeparse==0.1.3
|
||||||
|
@ -18,3 +17,4 @@ py-bcrypt==0.3
|
||||||
python-dateutil==2.1
|
python-dateutil==2.1
|
||||||
pytz==2013b
|
pytz==2013b
|
||||||
six==1.3.0
|
six==1.3.0
|
||||||
|
djangorestframework==2.2.5
|
||||||
|
|
Loading…
Reference in New Issue