This should allmost work
This commit is contained in:
1 parent
7787d0abc6
commit
9bbfea8971
21 files changed
+250
-34
No files matched your search
@@ -2,3 +2,5 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
.idea
|
.idea
|
||||||
venv
|
venv
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,19 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from dpdapi.models import Alias, Domain, User
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Alias)
|
||||||
|
class AliasAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ['source', 'destination', 'active', 'domain']
|
||||||
|
list_filter = ['domain']
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Domain)
|
||||||
|
class DomainAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(User)
|
||||||
|
class UserAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Alias',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('updated', models.DateTimeField(auto_now=True)),
|
||||||
|
('source', models.EmailField(max_length=75)),
|
||||||
|
('destination', models.EmailField(max_length=75)),
|
||||||
|
('active', models.BooleanField(default=True)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=(models.Model,),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Domain',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('updated', models.DateTimeField(auto_now=True)),
|
||||||
|
('name', models.CharField(max_length=1000)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=(models.Model,),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='User',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('updated', models.DateTimeField(auto_now=True)),
|
||||||
|
('email', models.EmailField(max_length=75)),
|
||||||
|
('password', models.CharField(max_length=109)),
|
||||||
|
('domain', models.ForeignKey(to='dpdapi.Domain')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=(models.Model,),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='alias',
|
||||||
|
name='domain',
|
||||||
|
field=models.ForeignKey(to='dpdapi.Domain'),
|
||||||
|
preserve_default=True,
|
||||||
|
),
|
||||||
|
]
|
||||||
File renamed without changes.
@@ -0,0 +1,40 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class BaseModel(models.Model):
|
||||||
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
updated = models.DateTimeField(auto_now=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
|
class Alias(BaseModel):
|
||||||
|
source = models.EmailField()
|
||||||
|
destination = models.EmailField()
|
||||||
|
domain = models.ForeignKey('dpdapi.Domain')
|
||||||
|
active = models.BooleanField(default=True)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return "{}={}".format(self.source, self.destination)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name_plural = 'aliases'
|
||||||
|
|
||||||
|
|
||||||
|
class Domain(BaseModel):
|
||||||
|
name = models.CharField(max_length=1000)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class User(BaseModel):
|
||||||
|
email = models.EmailField()
|
||||||
|
password = models.CharField(max_length=109)
|
||||||
|
domain = models.ForeignKey('dpdapi.Domain')
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.email
|
||||||
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from .models import Alias, Domain, User
|
||||||
|
|
||||||
|
|
||||||
|
class AliasSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Alias
|
||||||
|
|
||||||
|
|
||||||
|
class AliasIdSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Alias
|
||||||
|
fields = ['id']
|
||||||
|
|
||||||
|
|
||||||
|
class DomainSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Domain
|
||||||
|
|
||||||
|
|
||||||
|
class UserSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = User
|
||||||
File renamed without changes.
@@ -0,0 +1,10 @@
|
|||||||
|
from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
|
from .views import AliasViewSet, DomainViewSet, UserViewSet
|
||||||
|
|
||||||
|
|
||||||
|
router = DefaultRouter()
|
||||||
|
router.register(r'aliases', AliasViewSet)
|
||||||
|
router.register(r'domains', DomainViewSet)
|
||||||
|
router.register(r'users', UserViewSet)
|
||||||
|
urlpatterns = router.urls
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
from rest_framework.decorators import list_route
|
||||||
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework import status, filters, viewsets
|
||||||
|
|
||||||
|
from .models import Alias, Domain, User
|
||||||
|
from .serializers import AliasSerializer, AliasIdSerializer, DomainSerializer, UserSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class AliasViewSet(viewsets.ModelViewSet):
|
||||||
|
""" Aliases """
|
||||||
|
queryset = Alias.objects.all()
|
||||||
|
serializer_class = AliasSerializer
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
filter_backends = (filters.DjangoFilterBackend,)
|
||||||
|
filter_fields = ('domain', 'domain__name')
|
||||||
|
|
||||||
|
@list_route(methods=['post'])
|
||||||
|
def create_bulk(self, request):
|
||||||
|
serializer = AliasSerializer(data=request.data, many=True)
|
||||||
|
if serializer.is_valid():
|
||||||
|
serializer.save()
|
||||||
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
@list_route(methods=['delete'])
|
||||||
|
def delete_bulk(self, request):
|
||||||
|
# TODO how to lookup instances and delete them by id?
|
||||||
|
serializer = AliasIdSerializer(data=request.data, many=True)
|
||||||
|
if not serializer.is_valid():
|
||||||
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
ids = map(lambda x: x['id'], serializer.initial_data) # FIXME this is not how to do it
|
||||||
|
aliases = Alias.objects.filter(id__in=ids)
|
||||||
|
diff = set(ids).difference(set(aliases.values_list('id', flat=True)))
|
||||||
|
aliases.delete()
|
||||||
|
|
||||||
|
if diff:
|
||||||
|
result = "ID's '{}' could not be found and were not deleted.".format(", ".join(map(str, diff)))
|
||||||
|
return Response({"result": result}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
|
||||||
|
class DomainViewSet(viewsets.ModelViewSet):
|
||||||
|
""" Domains """
|
||||||
|
queryset = Domain.objects.all()
|
||||||
|
serializer_class = DomainSerializer
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
|
||||||
|
class UserViewSet(viewsets.ModelViewSet):
|
||||||
|
""" Users """
|
||||||
|
queryset = User.objects.all()
|
||||||
|
serializer_class = UserSerializer
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
File renamed without changes.
@@ -1,6 +1,4 @@
|
|||||||
"""
|
"""
|
||||||
Django settings for pfrsite project.
|
|
||||||
|
|
||||||
For more information on this file, see
|
For more information on this file, see
|
||||||
https://docs.djangoproject.com/en/1.7/topics/settings/
|
https://docs.djangoproject.com/en/1.7/topics/settings/
|
||||||
|
|
||||||
@@ -38,6 +36,11 @@ INSTALLED_APPS = (
|
|||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
INSTALLED_APPS += (
|
||||||
|
'rest_framework',
|
||||||
|
'dpdapi',
|
||||||
|
)
|
||||||
|
|
||||||
MIDDLEWARE_CLASSES = (
|
MIDDLEWARE_CLASSES = (
|
||||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
'django.middleware.common.CommonMiddleware',
|
'django.middleware.common.CommonMiddleware',
|
||||||
@@ -48,9 +51,9 @@ MIDDLEWARE_CLASSES = (
|
|||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
)
|
)
|
||||||
|
|
||||||
ROOT_URLCONF = 'pfrsite.urls'
|
ROOT_URLCONF = 'dpdapisite.urls'
|
||||||
|
|
||||||
WSGI_APPLICATION = 'pfrsite.wsgi.application'
|
WSGI_APPLICATION = 'dpdapisite.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
# Database
|
# Database
|
||||||
@@ -68,7 +71,7 @@ DATABASES = {
|
|||||||
|
|
||||||
LANGUAGE_CODE = 'en-us'
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
TIME_ZONE = 'UTC'
|
TIME_ZONE = 'Europe/Oslo'
|
||||||
|
|
||||||
USE_I18N = True
|
USE_I18N = True
|
||||||
|
|
||||||
@@ -81,3 +84,15 @@ USE_TZ = True
|
|||||||
# https://docs.djangoproject.com/en/1.7/howto/static-files/
|
# https://docs.djangoproject.com/en/1.7/howto/static-files/
|
||||||
|
|
||||||
STATIC_URL = '/static/'
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
|
REST_FRAMEWORK = {
|
||||||
|
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||||
|
'rest_framework.authentication.BasicAuthentication',
|
||||||
|
'rest_framework.authentication.SessionAuthentication',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
from local_settings import *
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
from django.conf.urls import patterns, include, url
|
||||||
|
from django.contrib import admin
|
||||||
|
from django.views.generic import RedirectView
|
||||||
|
|
||||||
|
urlpatterns = patterns(
|
||||||
|
'',
|
||||||
|
url(r'^api/', include('dpdapi.urls')),
|
||||||
|
url(r'^$', RedirectView.as_view(pattern_name='api-root')),
|
||||||
|
url(r'^admin/', include(admin.site.urls)),
|
||||||
|
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
|
||||||
|
)
|
||||||
@@ -8,7 +8,7 @@ https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pfrsite.settings")
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dpdapisite.settings")
|
||||||
|
|
||||||
from django.core.wsgi import get_wsgi_application
|
from django.core.wsgi import get_wsgi_application
|
||||||
application = get_wsgi_application()
|
application = get_wsgi_application()
|
||||||
@@ -3,7 +3,7 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pfrsite.settings")
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dpdapisite.settings")
|
||||||
|
|
||||||
from django.core.management import execute_from_command_line
|
from django.core.management import execute_from_command_line
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
from django.conf.urls import patterns, include, url
|
|
||||||
from django.contrib import admin
|
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
|
||||||
# Examples:
|
|
||||||
# url(r'^$', 'pfrsite.views.home', name='home'),
|
|
||||||
# url(r'^blog/', include('blog.urls')),
|
|
||||||
|
|
||||||
url(r'^admin/', include(admin.site.urls)),
|
|
||||||
)
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.contrib import admin
|
|
||||||
|
|
||||||
# Register your models here.
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
from django.db import models
|
|
||||||
|
|
||||||
|
|
||||||
#TODO: Domain, User
|
|
||||||
|
|
||||||
class Alias(models.Model):
|
|
||||||
active = models.BooleanField(default=True)
|
|
||||||
src = models.EmailField()
|
|
||||||
# TODO: dst EmailListField
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.shortcuts import render
|
|
||||||
|
|
||||||
# Create your views here.
|
|
||||||
+3
-2
@@ -1,4 +1,5 @@
|
|||||||
Django>=1.7,<1.8
|
Django>=1.7,<1.8
|
||||||
django-extensions==1.4.0
|
django-extensions==1.4.9
|
||||||
djangorestframework==2.4.3
|
django-filter==0.9.1
|
||||||
|
djangorestframework>=3.0,<3.1
|
||||||
|
|
||||||
Reference in new issue
Block a user