Django 2
This commit is contained in:
parent
2a68819aed
commit
55af847443
|
@ -156,8 +156,9 @@ sudo chmod -R a+rX static/
|
|||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(setq python-shell-interpreter "/docker:hackdev_django_1:/usr/local/bin/python")
|
||||
(setq python-environment-directory "/docker:hackdev_django_1:/")
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS:
|
||||
: /docker:hackdev_django_1:/usr/local/bin/python
|
||||
: /docker:hackdev_django_1:/
|
||||
|
||||
|
|
|
@ -60,8 +60,8 @@ urlpatterns = [
|
|||
name='requests_detail'),
|
||||
url(r'^requests/(?P<pk>\d+)/submit/$', RequestsDetailForm.as_view(template_name='pages/requests-detail.html'), name='requests_detail_form'),
|
||||
|
||||
url(r'^discuss/', include('spirit.urls')),
|
||||
url(r'^api/v1/', include(router.urls, namespace='v1')),
|
||||
url(r'^discuss/', include(('spirit.urls', 'spirit'), namespace='spirit')),
|
||||
url(r'^api/v1/', include((router.urls, 'v1'), namespace='v1')),
|
||||
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
|
||||
url(r'^martor/', include('martor.urls')),
|
||||
url(
|
||||
|
@ -88,8 +88,9 @@ urlpatterns = [
|
|||
url(r'^api/docs/', include_docs_urls(title='Hackspace API')),
|
||||
|
||||
# User management
|
||||
url(r'^users/', include('mhackspace.users.urls', namespace='users')),
|
||||
url(r'^users/', include(('mhackspace.users.urls', 'users'), namespace='users')),
|
||||
url(r'^accounts/', include('allauth.urls')),
|
||||
url('^accounts/', include('django.contrib.auth.urls')),
|
||||
|
||||
# Your stuff: custom urls includes go here
|
||||
url(r'^latest/$', LatestEntriesFeed()),
|
||||
|
@ -98,10 +99,10 @@ urlpatterns = [
|
|||
url(r'membership/cancel/$', subscription.MembershipCancelView.as_view(), name='cancel_membership'),
|
||||
url(r'membership/(?P<provider>[\w\-]+)/success$', subscription.MembershipJoinSuccessView.as_view(), name='join_hackspace_success'),
|
||||
url(r'membership/(?P<provider>\w{0,50})/failure$', subscription.MembershipJoinFailureView.as_view(), name='join_hackspace_failure'),
|
||||
url(r'^admin/password_reset/$', auth_views.password_reset, name='admin_password_reset'),
|
||||
url(r'^admin/password_reset/done/$', auth_views.password_reset_done, name='password_reset_done'),
|
||||
url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$', auth_views.password_reset_confirm, name='password_reset_confirm'),
|
||||
url(r'^reset/done/$', auth_views.password_reset_complete, name='password_reset_complete'),
|
||||
url(r'^admin/password_reset/$', auth_views.PasswordResetView.as_view(), name='admin_password_reset'),
|
||||
url(r'^admin/password_reset/done/$', auth_views.PasswordChangeDoneView.as_view(), name='password_reset_done'),
|
||||
url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
|
||||
url(r'^reset/done/$', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
|
||||
|
||||
url(r'^register/$', RegisterForm.as_view(), name='register_form'),
|
||||
url(r'^register/success$', TemplateView.as_view(template_name='pages/register.html'), name='register_success'),
|
||||
|
|
|
@ -19,37 +19,26 @@ class Category(models.Model):
|
|||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('blog-category', kwargs={'category': self.slug})
|
||||
return reverse("blog-category", kwargs={"category": self.slug})
|
||||
|
||||
|
||||
class Post(models.Model):
|
||||
title = models.CharField(max_length=100, unique=True)
|
||||
slug = models.SlugField(max_length=100, unique=True)
|
||||
categories = models.ManyToManyField(Category)
|
||||
author = models.ForeignKey(User)
|
||||
author = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
image = StdImageField(
|
||||
upload_to=UploadToAutoSlugClassNameDir(populate_from='title'),
|
||||
upload_to=UploadToAutoSlugClassNameDir(populate_from="title"),
|
||||
blank=True,
|
||||
null=True,
|
||||
variations={
|
||||
'home': {
|
||||
"width": 530,
|
||||
"height": 220,
|
||||
"crop": True},
|
||||
'mobilethumb': {
|
||||
"width": 580,
|
||||
"height": 150,
|
||||
"crop": True},
|
||||
'thumbnail': {
|
||||
"width": 250,
|
||||
"height": 150,
|
||||
"crop": True},
|
||||
'full': {
|
||||
"width": 825,
|
||||
"height": 450,
|
||||
"crop": True}},
|
||||
validators=[
|
||||
MinSizeValidator(730, 410)])
|
||||
"home": {"width": 530, "height": 220, "crop": True},
|
||||
"mobilethumb": {"width": 580, "height": 150, "crop": True},
|
||||
"thumbnail": {"width": 250, "height": 150, "crop": True},
|
||||
"full": {"width": 825, "height": 450, "crop": True},
|
||||
},
|
||||
validators=[MinSizeValidator(730, 410)],
|
||||
)
|
||||
|
||||
description = MartorField()
|
||||
excerpt = models.TextField(blank=True, null=True)
|
||||
|
@ -62,8 +51,7 @@ class Post(models.Model):
|
|||
return self.title
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('blog-item', kwargs={'slug': self.slug})
|
||||
return reverse("blog-item", kwargs={"slug": self.slug})
|
||||
|
||||
class Meta:
|
||||
ordering = ('-published_date',)
|
||||
|
||||
ordering = ("-published_date",)
|
||||
|
|
|
@ -8,11 +8,7 @@ from stdimage.models import StdImageField
|
|||
from stdimage.utils import UploadToAutoSlugClassNameDir
|
||||
|
||||
|
||||
image_variations = {
|
||||
'home': {
|
||||
"width": 530,
|
||||
"height": 220,
|
||||
"crop": True}}
|
||||
image_variations = {"home": {"width": 530, "height": 220, "crop": True}}
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
|
@ -23,10 +19,11 @@ class Feed(models.Model):
|
|||
author = models.CharField(max_length=255)
|
||||
tags = models.CharField(max_length=255, blank=True)
|
||||
image = StdImageField(
|
||||
upload_to=UploadToAutoSlugClassNameDir(populate_from='title'),
|
||||
upload_to=UploadToAutoSlugClassNameDir(populate_from="title"),
|
||||
blank=True,
|
||||
null=True,
|
||||
variations=image_variations)
|
||||
variations=image_variations,
|
||||
)
|
||||
enabled = models.BooleanField(default=True)
|
||||
|
||||
def __str__(self):
|
||||
|
@ -35,14 +32,15 @@ class Feed(models.Model):
|
|||
|
||||
class Article(models.Model):
|
||||
url = models.URLField()
|
||||
feed = models.ForeignKey(Feed)
|
||||
feed = models.ForeignKey(Feed, on_delete=models.CASCADE)
|
||||
title = models.CharField(max_length=255)
|
||||
original_image = models.URLField(max_length=255, blank=True, null=True)
|
||||
image = StdImageField(
|
||||
upload_to=UploadToAutoSlugClassNameDir(populate_from='title'),
|
||||
upload_to=UploadToAutoSlugClassNameDir(populate_from="title"),
|
||||
blank=True,
|
||||
null=True,
|
||||
variations=image_variations)
|
||||
variations=image_variations,
|
||||
)
|
||||
|
||||
description = models.TextField()
|
||||
displayed = models.BooleanField(default=True)
|
||||
|
@ -52,4 +50,4 @@ class Article(models.Model):
|
|||
return self.title
|
||||
|
||||
class Meta:
|
||||
ordering = ('pk',)
|
||||
ordering = ("pk",)
|
||||
|
|
|
@ -5,11 +5,17 @@ from mhackspace.register.managers import RegisteredUserManager
|
|||
|
||||
|
||||
class RegisteredUser(models.Model):
|
||||
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+', null=True, blank=True)
|
||||
user = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
related_name="+",
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
name = models.CharField(max_length=100, null=False, blank=False)
|
||||
created_at = models.DateTimeField(default=timezone.now)
|
||||
|
||||
objects = RegisteredUserManager()
|
||||
|
||||
class Meta:
|
||||
ordering = ('-created_at',)
|
||||
ordering = ("-created_at",)
|
||||
|
|
|
@ -11,53 +11,60 @@ from mhackspace.base.tasks import matrix_message
|
|||
|
||||
|
||||
REQUEST_TYPES = (
|
||||
(0, 'Equipment request'),
|
||||
(1, 'Educational request'),
|
||||
(2, 'Training request'))
|
||||
(0, "Equipment request"),
|
||||
(1, "Educational request"),
|
||||
(2, "Training request"),
|
||||
)
|
||||
|
||||
|
||||
class UserRequest(models.Model):
|
||||
user = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
related_name='+'
|
||||
settings.AUTH_USER_MODEL, related_name="+", on_delete=models.CASCADE
|
||||
)
|
||||
title = models.CharField(
|
||||
max_length=255, help_text="Whats being requested ?"
|
||||
)
|
||||
title = models.CharField(max_length=255, help_text='Whats being requested ?')
|
||||
request_type = models.IntegerField(choices=REQUEST_TYPES, null=False)
|
||||
acquired = models.BooleanField(default=False)
|
||||
cost = models.DecimalField(
|
||||
max_digits=6,
|
||||
decimal_places=2,
|
||||
help_text='Leave blank, if no associated cost, or add estimated cost if not sure.'
|
||||
help_text="Leave blank, if no associated cost, or add estimated cost if not sure.",
|
||||
)
|
||||
description = MartorField(
|
||||
help_text="detail of what's being requested and where it can be purchased"
|
||||
)
|
||||
description = MartorField(help_text="detail of what's being requested and where it can be purchased")
|
||||
created_date = models.DateTimeField(default=timezone.now)
|
||||
|
||||
def request_type_string(self):
|
||||
return REQUEST_TYPES[self.request_type][1]
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse(
|
||||
'requests_detail',
|
||||
kwargs={'pk': self.pk})
|
||||
return reverse("requests_detail", kwargs={"pk": self.pk})
|
||||
|
||||
class Meta:
|
||||
ordering = ('acquired', 'created_date',)
|
||||
ordering = ("acquired", "created_date")
|
||||
|
||||
|
||||
class UserRequestsComment(models.Model):
|
||||
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
||||
user = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL, on_delete=models.CASCADE
|
||||
)
|
||||
request = models.ForeignKey(UserRequest, on_delete=models.CASCADE)
|
||||
comment = MartorField(help_text='Your comments')
|
||||
comment = MartorField(help_text="Your comments")
|
||||
created_date = models.DateTimeField(default=timezone.now)
|
||||
|
||||
|
||||
def send_topic_update_email(sender, instance, **kwargs):
|
||||
matrix_message.delay(
|
||||
prefix=' - REQUEST',
|
||||
message='%s - https://%s%s' % (
|
||||
prefix=" - REQUEST",
|
||||
message="%s - https://%s%s"
|
||||
% (
|
||||
instance.title,
|
||||
Site.objects.get_current().domain,
|
||||
instance.get_absolute_url()))
|
||||
instance.get_absolute_url(),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
post_save.connect(send_topic_update_email, sender=UserRequest)
|
||||
|
|
|
@ -29,8 +29,10 @@ class Device(models.Model):
|
|||
class DeviceAuth(models.Model):
|
||||
rfid = models.ForeignKey(
|
||||
Rfid,
|
||||
on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
device = models.ForeignKey(
|
||||
Device,
|
||||
on_delete=models.CASCADE
|
||||
)
|
||||
|
|
|
@ -3,7 +3,7 @@ from __future__ import unicode_literals, absolute_import
|
|||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import AbstractUser
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.urls import reverse
|
||||
from django.db import models
|
||||
from django.utils.encoding import python_2_unicode_compatible
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
@ -22,7 +22,8 @@ class Payments(models.Model):
|
|||
settings.AUTH_USER_MODEL,
|
||||
null=True, blank=True,
|
||||
default=None,
|
||||
related_name='from_user'
|
||||
related_name='from_user',
|
||||
on_delete=models.CASCADE
|
||||
)
|
||||
user_reference = models.CharField(max_length=255)
|
||||
user_email = models.CharField(max_length=255)
|
||||
|
|
|
@ -2,7 +2,7 @@ from django.contrib.messages.storage.fallback import FallbackStorage
|
|||
# from django.contrib.auth.models import Group
|
||||
from django.test import Client
|
||||
from django.test import RequestFactory
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.urls import reverse
|
||||
from test_plus.test import TestCase
|
||||
from mock import patch, Mock
|
||||
from mhackspace.users.models import Membership
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 2.1.1 on 2018-09-04 20:35
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0008_auto_20170917_0948'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='user',
|
||||
name='last_name',
|
||||
field=models.CharField(blank=True, max_length=150, verbose_name='last name'),
|
||||
),
|
||||
]
|
|
@ -3,7 +3,7 @@ from __future__ import unicode_literals, absolute_import
|
|||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import AbstractUser
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.urls import reverse
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from stdimage.models import StdImageField
|
||||
|
@ -12,19 +12,17 @@ from mhackspace.base.tasks import matrix_message
|
|||
|
||||
|
||||
class User(AbstractUser):
|
||||
name = models.CharField(_('Name of User'), blank=True, max_length=255)
|
||||
name = models.CharField(_("Name of User"), blank=True, max_length=255)
|
||||
public = models.BooleanField(
|
||||
default=False, help_text='If the users email is public on post feeds')
|
||||
default=False, help_text="If the users email is public on post feeds"
|
||||
)
|
||||
_image = StdImageField(
|
||||
upload_to='avatars/',
|
||||
upload_to="avatars/",
|
||||
blank=True,
|
||||
null=True,
|
||||
db_column='image',
|
||||
variations={
|
||||
'profile': {
|
||||
"width": 256,
|
||||
"height": 256,
|
||||
"crop": True}})
|
||||
db_column="image",
|
||||
variations={"profile": {"width": 256, "height": 256, "crop": True}},
|
||||
)
|
||||
|
||||
# https://github.com/pennersr/django-allauth/issues/520
|
||||
@property
|
||||
|
@ -39,51 +37,58 @@ class User(AbstractUser):
|
|||
return self.username
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('users:detail', kwargs={'username': self.username})
|
||||
return reverse("users:detail", kwargs={"username": self.username})
|
||||
|
||||
|
||||
class Blurb(models.Model):
|
||||
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='+')
|
||||
user = models.OneToOneField(
|
||||
settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="+"
|
||||
)
|
||||
skills = models.CharField(max_length=255)
|
||||
description = models.TextField()
|
||||
|
||||
|
||||
MEMBERSHIP_ACTIVE = 1
|
||||
MEMBERSHIP_CANCELLED = 4
|
||||
|
||||
MEMBERSHIP_STATUS_CHOICES = (
|
||||
(0, 'Guest user'),
|
||||
(MEMBERSHIP_ACTIVE, 'Active membership'),
|
||||
(3, 'Membership Expired'),
|
||||
(MEMBERSHIP_CANCELLED, 'Membership Cancelled')
|
||||
(0, "Guest user"),
|
||||
(MEMBERSHIP_ACTIVE, "Active membership"),
|
||||
(3, "Membership Expired"),
|
||||
(MEMBERSHIP_CANCELLED, "Membership Cancelled"),
|
||||
)
|
||||
|
||||
MEMBERSHIP_STRING = {
|
||||
0: 'Guest user',
|
||||
MEMBERSHIP_ACTIVE: 'Active membership',
|
||||
3: 'Membership Expired',
|
||||
MEMBERSHIP_CANCELLED: 'Membership Cancelled'
|
||||
0: "Guest user",
|
||||
MEMBERSHIP_ACTIVE: "Active membership",
|
||||
3: "Membership Expired",
|
||||
MEMBERSHIP_CANCELLED: "Membership Cancelled",
|
||||
}
|
||||
|
||||
MEMBERSHIP_STATUS = {
|
||||
'signup': 0, # This means the user has not completed signup
|
||||
'active': MEMBERSHIP_ACTIVE,
|
||||
'expired': 3,
|
||||
'cancelled': MEMBERSHIP_CANCELLED
|
||||
"signup": 0, # This means the user has not completed signup
|
||||
"active": MEMBERSHIP_ACTIVE,
|
||||
"expired": 3,
|
||||
"cancelled": MEMBERSHIP_CANCELLED,
|
||||
}
|
||||
|
||||
|
||||
class Membership(models.Model):
|
||||
user = models.OneToOneField(
|
||||
settings.AUTH_USER_MODEL,
|
||||
null=True, blank=True,
|
||||
null=True,
|
||||
blank=True,
|
||||
default=None,
|
||||
related_name='user',
|
||||
unique=True
|
||||
related_name="user",
|
||||
unique=True,
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
payment = models.DecimalField(max_digits=6, decimal_places=2, default=0.0)
|
||||
date = models.DateTimeField()
|
||||
reference = models.CharField(max_length=255)
|
||||
status = models.PositiveSmallIntegerField(default=0, choices=MEMBERSHIP_STATUS_CHOICES)
|
||||
status = models.PositiveSmallIntegerField(
|
||||
default=0, choices=MEMBERSHIP_STATUS_CHOICES
|
||||
)
|
||||
email = models.CharField(max_length=255, unique=True)
|
||||
|
||||
@property
|
||||
|
@ -107,10 +112,14 @@ class Membership(models.Model):
|
|||
# users rfid card to user mapping, user can have more than one card
|
||||
class Rfid(models.Model):
|
||||
code = models.CharField(max_length=7)
|
||||
description = models.CharField(_('Short rfid description'), blank=True, max_length=255)
|
||||
description = models.CharField(
|
||||
_("Short rfid description"), blank=True, max_length=255
|
||||
)
|
||||
user = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
null=True, blank=True,
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.CASCADE
|
||||
# related_name='rfid_user'
|
||||
)
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from django.core.urlresolvers import reverse, resolve
|
||||
from django.urls import reverse, resolve
|
||||
|
||||
from test_plus.test import TestCase
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
from django.http import Http404
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.urls import reverse
|
||||
from django.views.generic import DetailView, ListView, RedirectView, UpdateView
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
|
||||
|
|
|
@ -2,66 +2,66 @@
|
|||
# like Pillow and psycopg2
|
||||
# See http://bitly.com/wheel-building-fails-CPython-35
|
||||
# Verified bug on Python 3.5.1
|
||||
wheel==0.29.0
|
||||
wheel==0.31.1
|
||||
# Bleeding edge Django
|
||||
django==1.11.4
|
||||
django==2.1.1
|
||||
|
||||
# Configuration
|
||||
django-environ==0.4.3
|
||||
whitenoise==3.2.3
|
||||
django-environ==0.4.5
|
||||
whitenoise==4.0
|
||||
# Static and Media Storage
|
||||
# ------------------------------------------------
|
||||
boto3==1.5.21
|
||||
django-storages==1.6.5
|
||||
boto3==1.8.6
|
||||
django-storages==1.7
|
||||
# django-storages-redux==1.3.2
|
||||
|
||||
|
||||
# Forms
|
||||
django-braces==1.11.0
|
||||
django-crispy-forms==1.6.1
|
||||
django-braces==1.13.0
|
||||
django-crispy-forms==1.7.2
|
||||
|
||||
django-extensions==1.8.0
|
||||
Werkzeug==0.12.2
|
||||
django-extensions==2.1.2
|
||||
Werkzeug==0.14.1
|
||||
|
||||
# Models
|
||||
django-stdimage==2.4.0
|
||||
django-model-utils==3.0.0
|
||||
django-stdimage==3.2.0
|
||||
django-model-utils==3.1.2
|
||||
|
||||
# Images
|
||||
Pillow==4.2.0
|
||||
Pillow==5.2.0
|
||||
|
||||
# For user registration, either via email or social
|
||||
# Well-built with regular release cycles!
|
||||
django-allauth==0.32.0
|
||||
django-allauth==0.37.1
|
||||
|
||||
|
||||
# Python-PostgreSQL Database Adapter
|
||||
psycopg2==2.7.1
|
||||
psycopg2==2.7.5
|
||||
|
||||
# Unicode slugification
|
||||
awesome-slugify==1.6.5
|
||||
|
||||
# Time zones support
|
||||
pytz==2017.2
|
||||
pytz==2018.5
|
||||
|
||||
# Redis support
|
||||
django-redis==4.8.0
|
||||
redis>=2.10.5
|
||||
django-redis==4.9.0
|
||||
redis>=2.10.6
|
||||
|
||||
|
||||
rcssmin==1.0.6
|
||||
django-compressor==2.1.1
|
||||
django-compressor==2.2
|
||||
|
||||
#fix for use with s3 buckets merged in master, so next release we can remove this
|
||||
#django-sass-processor==0.5.7
|
||||
git+https://github.com/jrief/django-sass-processor.git
|
||||
libsass==0.13.2
|
||||
lxml==3.7.3
|
||||
libsass==0.14.5
|
||||
lxml==4.2.4
|
||||
|
||||
# WSGI Handler
|
||||
# ------------------------------------------------
|
||||
gevent==1.2.2
|
||||
gunicorn==19.7.1
|
||||
gevent==1.3.6
|
||||
gunicorn==19.9.0
|
||||
#https://github.com/jonashaag/bjoern
|
||||
#bjoern
|
||||
|
||||
|
@ -69,7 +69,7 @@ gunicorn==19.7.1
|
|||
mock==2.0.0
|
||||
|
||||
gocardless_pro
|
||||
braintree==3.37.2
|
||||
braintree==3.48.0
|
||||
|
||||
django-autofixture==0.12.1
|
||||
|
||||
|
@ -77,30 +77,29 @@ git+https://github.com/olymk2/scaffold.git
|
|||
#git+git://github.com/olymk2/django-wiki.git
|
||||
git+git://github.com/django-wiki/django-wiki.git
|
||||
|
||||
djangorestframework==3.6.3
|
||||
djangorestframework-jwt
|
||||
django-filter==1.0.2
|
||||
djangorestframework==3.8.2
|
||||
djangorestframework-jwt==1.11.0
|
||||
django-filter==2.0
|
||||
coreapi
|
||||
# api libraries end
|
||||
|
||||
martor==1.2.5
|
||||
martor==1.3.2
|
||||
|
||||
#git+git://github.com/olymk2/django-markdown-editor.git
|
||||
|
||||
# django-spirit
|
||||
django-spirit==0.6.0
|
||||
django-djconfig
|
||||
django-haystack
|
||||
git+https://github.com/nitely/Spirit.git
|
||||
django-xforwardedfor-middleware==2.0
|
||||
|
||||
# Application queue celery
|
||||
celery==4.1.0
|
||||
celery==4.2.1
|
||||
django-celery-results==1.0.1
|
||||
django-celery-beat==1.0.1
|
||||
django-celery-beat==1.1.1
|
||||
|
||||
argon2-cffi
|
||||
django-cors-headers
|
||||
python-magic
|
||||
ldap3
|
||||
bcrypt==3.1.4
|
||||
python-twitter==3.4.1
|
||||
python-twitter==3.4.2
|
||||
|
|
Loading…
Reference in New Issue