Skip to content

Challeng #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/

# my gitignore
.idea

Empty file added my_coffee/admin/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions my_coffee/admin/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
Empty file.
3 changes: 3 additions & 0 deletions my_coffee/admin/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.db import models

# Create your models here.
3 changes: 3 additions & 0 deletions my_coffee/admin/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
3 changes: 3 additions & 0 deletions my_coffee/admin/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.shortcuts import render

# Create your views here.
Empty file added my_coffee/customers/__init__.py
Empty file.
15 changes: 15 additions & 0 deletions my_coffee/customers/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from django.contrib import admin

from .models import Order


class OrderModelAdmin(admin.ModelAdmin):
list_display = ["id", "status", "location"]
list_display_links = ["id"]

class Meta:
module = Order


admin.site.register(Order, OrderModelAdmin)

Empty file.
21 changes: 21 additions & 0 deletions my_coffee/customers/api/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from rest_framework.permissions import BasePermission

from ..models import Order


class IsWaitingOrder(BasePermission):
message = "This status order changed."

def has_object_permission(self, request, view, obj):
order = Order.objects.get(owner=request.user)

if order.status == "W":
return True
return False


class IsOwner(BasePermission):
message = 'You must be the owner of this object.'

def has_object_permission(self, request, view, obj):
return obj.owner == request.user
150 changes: 150 additions & 0 deletions my_coffee/customers/api/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
from rest_framework import serializers
from rest_framework.serializers import (
CharField,
EmailField,
HyperlinkedIdentityField,
ModelSerializer,
SerializerMethodField,
ValidationError
)

from productions.api.serializers import MenuSerializer
from productions.models import Menu
from ..models import Order

from django.contrib.auth import get_user_model


class OrderListSerializer(serializers.ModelSerializer):
ordered_productions = MenuSerializer(many=True, read_only=True)

class Meta:
model = Order
fields = [
'location',
'address',
'created_at',
'updated_at',
'ordered_productions',
'status',
'id'
]
read_only_fields = [
'status',
]


class OrderCreateUpdateSerializer(serializers.ModelSerializer):
ordered_productions = MenuSerializer(many=True)

def create(self, validated_data):
ordered_productions_data = validated_data.pop("ordered_productions")
order = Order.objects.create(**validated_data)
for order_p_data in ordered_productions_data:
Menu.objects.create(order=order, **order_p_data)
return order

class Meta:
model = Order
fields = [
'location',
'address',
'created_at',
'updated_at',
'ordered_productions',
'status',
'id'
]
read_only_fields = [
'status',
]


User = get_user_model()


class UserDetailSerializer(ModelSerializer):
class Meta:
model = User
fields = [
'username',
'email',
'first_name',
'last_name',
]


class UserCreateSerializer(ModelSerializer):
email = EmailField(label='Email Address')
email2 = EmailField(label='Confirm Email')

class Meta:
model = User
fields = [
'username',
'email',
'email2',
'password',

]
extra_kwargs = {"password":
{"write_only": True}
}

def validate(self, data):
return data

def validate_email(self, value):
data = self.get_initial()
email1 = data.get("email2")
email2 = value
if email1 != email2:
raise ValidationError("Emails must match.")

user_qs = User.objects.filter(email=email2)
if user_qs.exists():
raise ValidationError("This user has already registered.")

return value

def validate_email2(self, value):
data = self.get_initial()
email1 = data.get("email")
email2 = value
if email1 != email2:
raise ValidationError("Emails must match.")
return value

def create(self, validated_data):
username = validated_data['username']
email = validated_data['email']
password = validated_data['password']
user_obj = User(
username=username,
email=email
)
user_obj.set_password(password)
user_obj.save()
return validated_data


class UserLoginSerializer(ModelSerializer):
token = CharField(allow_blank=True, read_only=True)
username = CharField()
email = EmailField(label='Email Address')

class Meta:
model = User
fields = [
'username',
'email',
'password',
'token',

]
extra_kwargs = {"password":
{"write_only": True}
}

def validate(self, data):
return data
17 changes: 17 additions & 0 deletions my_coffee/customers/api/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django.conf.urls import url
from views import OrderCreateAPIView, OrderListAPIView\
, OrderUpdateAPIView, OrderDeleteAPIView, UserLoginAPIView\
, UserCreateAPIView


urlpatterns = [
url(r'^$', OrderListAPIView.as_view(), name="order"),
url(r'^order/$', OrderListAPIView.as_view(), name="order"),
url(r'^order/create/$', OrderCreateAPIView.as_view(), name="order-create"),
url(r'^order/(?P<id>\d+)/edit/$'
, OrderUpdateAPIView.as_view(), name='order-update'),
url(r'^order/(?P<id>\d+)/delete/$'
, OrderDeleteAPIView.as_view(), name='order-delete'),
url(r'^login/$', UserLoginAPIView.as_view(), name='login'),
url(r'^register/$', UserCreateAPIView.as_view(), name='register'),
]
Loading