mirror of https://github.com/nanoy42/coope
Yoann Piétri
6 years ago
25 changed files with 508 additions and 2 deletions
@ -0,0 +1,3 @@ |
|||
from django.contrib import admin |
|||
|
|||
# Register your models here. |
@ -0,0 +1,5 @@ |
|||
from django.apps import AppConfig |
|||
|
|||
|
|||
class GestionConfig(AppConfig): |
|||
name = 'gestion' |
@ -0,0 +1,154 @@ |
|||
# Generated by Django 2.1 on 2018-08-31 12:45 |
|||
|
|||
from django.conf import settings |
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
import gestion.models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
initial = True |
|||
|
|||
dependencies = [ |
|||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
|||
('preferences', '0001_initial'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name='Barrel', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('name', models.CharField(max_length=20)), |
|||
('stockHold', models.IntegerField(default=0)), |
|||
('barcode', models.CharField(max_length=20, unique=True)), |
|||
('amount', models.DecimalField(decimal_places=2, max_digits=5)), |
|||
('capacity', models.IntegerField(default=30)), |
|||
('active', models.BooleanField(default=False)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='ConsumptionHistory', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('quantity', models.PositiveIntegerField(default=0)), |
|||
('date', models.DateTimeField(auto_now_add=True)), |
|||
('amount', models.DecimalField(decimal_places=2, default=0, max_digits=7)), |
|||
('coopeman', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='consumption_selled', to=settings.AUTH_USER_MODEL)), |
|||
('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='consumption_taken', to=settings.AUTH_USER_MODEL)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='Menu', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('name', models.CharField(max_length=255)), |
|||
('amount', models.DecimalField(decimal_places=2, max_digits=5)), |
|||
('barcode', models.CharField(max_length=20, unique=True)), |
|||
('is_active', models.BooleanField(default=False)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='MenuHistory', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('quantity', models.PositiveIntegerField(default=0)), |
|||
('date', models.DateTimeField(auto_now_add=True)), |
|||
('amount', models.DecimalField(decimal_places=2, default=0, max_digits=5)), |
|||
('PaymentMethod', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='preferences.PaymentMethod')), |
|||
('coopeman', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='menu_selled', to=settings.AUTH_USER_MODEL)), |
|||
('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='menu_taken', to=settings.AUTH_USER_MODEL)), |
|||
('menu', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='gestion.Menu')), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='Product', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('name', models.CharField(max_length=40)), |
|||
('amount', models.DecimalField(decimal_places=2, max_digits=5)), |
|||
('stockHold', models.IntegerField(default=0)), |
|||
('stockBar', models.IntegerField(default=0)), |
|||
('barcode', models.CharField(max_length=20, unique=True)), |
|||
('category', models.CharField(choices=[('PP', 'Pinte Pression'), ('DP', 'Demi Pression'), ('GP', 'Galopin pression'), ('BT', 'Bouteille'), ('SO', 'Soft'), ('FO', 'Bouffe')], default='FO', max_length=2)), |
|||
('needQuantityButton', models.BooleanField(default=False)), |
|||
('is_active', models.BooleanField(default=True)), |
|||
('is_beer', models.BooleanField(default=False)), |
|||
('volume', models.IntegerField(default=0)), |
|||
('deg', models.DecimalField(decimal_places=2, default=0, max_digits=5)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='Raming', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('date', models.DateTimeField(auto_now_add=True)), |
|||
('barrel', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='gestion.Barrel')), |
|||
('coopeman', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='Refund', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('date', models.DateTimeField(auto_now_add=True)), |
|||
('amount', models.DecimalField(decimal_places=2, max_digits=5)), |
|||
('coopeman', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='refund_realized', to=settings.AUTH_USER_MODEL)), |
|||
('cutsomer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='refund_taken', to=settings.AUTH_USER_MODEL)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='Reload', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('amount', models.DecimalField(decimal_places=2, max_digits=5)), |
|||
('date', models.DateTimeField(auto_now_add=True)), |
|||
('PaymentMethod', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='preferences.PaymentMethod')), |
|||
('coopeman', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='reload_realized', to=settings.AUTH_USER_MODEL)), |
|||
('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='reload_taken', to=settings.AUTH_USER_MODEL)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='Stocking', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('date', models.DateTimeField(auto_now_add=True)), |
|||
], |
|||
), |
|||
migrations.AddField( |
|||
model_name='menu', |
|||
name='articles', |
|||
field=models.ManyToManyField(to='gestion.Product'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='consumptionhistory', |
|||
name='menu', |
|||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='gestion.MenuHistory'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='consumptionhistory', |
|||
name='paymentMethod', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='preferences.PaymentMethod'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='consumptionhistory', |
|||
name='product', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='gestion.Product'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='barrel', |
|||
name='demi', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='futd', to='gestion.Product', validators=[gestion.models.isDemi]), |
|||
), |
|||
migrations.AddField( |
|||
model_name='barrel', |
|||
name='galopin', |
|||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='futg', to='gestion.Product', validators=[gestion.models.isGalopin]), |
|||
), |
|||
migrations.AddField( |
|||
model_name='barrel', |
|||
name='pinte', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='futp', to='gestion.Product', validators=[gestion.models.isPinte]), |
|||
), |
|||
] |
@ -0,0 +1,143 @@ |
|||
from django.db import models |
|||
from django.contrib.auth.models import User |
|||
from preferences.models import PaymentMethod |
|||
class Product(models.Model): |
|||
P_PRESSION = 'PP' |
|||
D_PRESSION = 'DP' |
|||
G_PRESSION = 'GP' |
|||
BOTTLE = 'BT' |
|||
SOFT = 'SO' |
|||
FOOD = 'FO' |
|||
TYPEINPUT_CHOICES_CATEGORIE = ( |
|||
(P_PRESSION, "Pinte Pression"), |
|||
(D_PRESSION, "Demi Pression"), |
|||
(G_PRESSION, "Galopin pression"), |
|||
(BOTTLE, "Bouteille"), |
|||
(SOFT, "Soft"), |
|||
(FOOD, "Bouffe"), |
|||
) |
|||
name = models.CharField(max_length=40) |
|||
amount = models.DecimalField(max_digits=5, decimal_places=2) |
|||
stockHold = models.IntegerField(default=0) |
|||
stockBar = models.IntegerField(default=0) |
|||
barcode= models.CharField(max_length=20, unique=True) |
|||
category = models.CharField(max_length=2, choices=TYPEINPUT_CHOICES_CATEGORIE, default=FOOD) |
|||
needQuantityButton = models.BooleanField(default=False) |
|||
is_active = models.BooleanField(default=True) |
|||
is_beer = models.BooleanField(default=False) |
|||
volume = models.IntegerField(default=0) |
|||
deg = models.DecimalField(default=0,max_digits=5, decimal_places=2) |
|||
|
|||
def __str__(self): |
|||
return self.nom |
|||
|
|||
|
|||
def isPinte(id): |
|||
product = Product.objects.get(id=id) |
|||
if product.category != Product.P_PRESSION: |
|||
raise ValidationError( |
|||
('%(product)s n\'est pas une pinte'), |
|||
params={'product': product}, |
|||
) |
|||
|
|||
|
|||
def isDemi(id): |
|||
product = Product.objects.get(id=id) |
|||
if produit.category != Product.D_PRESSION: |
|||
raise ValidationError( |
|||
('%(product)s n\'est pas un demi'), |
|||
params={'product': product}, |
|||
) |
|||
|
|||
def isGalopin(id): |
|||
product = Product.objects.get(id) |
|||
if product.category != Product.G_PRESSION: |
|||
raise ValidationError( |
|||
('%(product)s n\'est pas un galopin'), |
|||
params={'product': product}, |
|||
) |
|||
|
|||
class Barrel(models.Model): |
|||
name = models.CharField(max_length=20) |
|||
stockHold = models.IntegerField(default=0) |
|||
barcode = models.CharField(max_length=20, unique=True) |
|||
amount = models.DecimalField(max_digits=5, decimal_places=2) |
|||
capacity = models.IntegerField(default=30) |
|||
pinte = models.ForeignKey(Product, on_delete=models.PROTECT, related_name="futp", validators=[isPinte]) |
|||
demi = models.ForeignKey(Product, on_delete=models.PROTECT, related_name="futd", validators=[isDemi]) |
|||
galopin = models.ForeignKey(Product, on_delete=models.PROTECT, related_name="futg", validators=[isGalopin],null=True, blank=True) |
|||
active= models.BooleanField(default=False) |
|||
|
|||
def __str__(self): |
|||
return self.name |
|||
|
|||
class Reload(models.Model): |
|||
customer = models.ForeignKey(User, on_delete=models.PROTECT, related_name="reload_taken") |
|||
amount = models.DecimalField(max_digits=5, decimal_places=2) |
|||
PaymentMethod = models.ForeignKey(PaymentMethod, on_delete=models.PROTECT) |
|||
coopeman = models.ForeignKey(User, on_delete=models.PROTECT, related_name="reload_realized") |
|||
date = models.DateTimeField(auto_now_add=True) |
|||
|
|||
def __str__(self): |
|||
return "Rechargement effectue par {0} le {1} ({2} euros, coopeman : {3})".format(self.customer, self.date, self.amount, self.coopeman) |
|||
|
|||
|
|||
class Raming(models.Model): |
|||
barrel = models.ForeignKey(Barrel, on_delete=models.PROTECT) |
|||
coopeman = models.ForeignKey(User, on_delete=models.PROTECT) |
|||
date = models.DateTimeField(auto_now_add=True) |
|||
|
|||
def __str__(self): |
|||
return "Percussion d'un {0} effectué par {1} le {2}".format(self.barrel, self.coopeman, self.date) |
|||
|
|||
class Stocking(models.Model): |
|||
date = models.DateTimeField(auto_now_add=True) |
|||
|
|||
def __str__(self): |
|||
return "Inventaire fait le {0}".format(self.date) |
|||
|
|||
|
|||
class Refund(models.Model): |
|||
date = models.DateTimeField(auto_now_add=True) |
|||
cutsomer = models.ForeignKey(User, on_delete=models.PROTECT, related_name="refund_taken") |
|||
amount = models.DecimalField(max_digits=5, decimal_places=2) |
|||
coopeman = models.ForeignKey(User, on_delete=models.PROTECT, related_name="refund_realized") |
|||
|
|||
def __str__(self): |
|||
return "{0} remboursé de {1} le {2} (effectué par {3})".format(self.customer, self.amount, self.date, self.coopeman) |
|||
|
|||
|
|||
class Menu(models.Model): |
|||
name = models.CharField(max_length=255) |
|||
amount = models.DecimalField(max_digits=5, decimal_places=2) |
|||
barcode = models.CharField(max_length=20, unique=True) |
|||
articles = models.ManyToManyField(Product) |
|||
is_active = models.BooleanField(default=False) |
|||
|
|||
def __str__(self): |
|||
return self.name |
|||
|
|||
class MenuHistory(models.Model): |
|||
customer = models.ForeignKey(User, on_delete=models.PROTECT, related_name="menu_taken") |
|||
quantity = models.PositiveIntegerField(default=0) |
|||
PaymentMethod = models.ForeignKey(PaymentMethod, on_delete=models.PROTECT) |
|||
date = models.DateTimeField(auto_now_add=True) |
|||
menu = models.ForeignKey(Menu, on_delete=models.PROTECT) |
|||
amount = models.DecimalField(max_digits=5, decimal_places=2, default=0) |
|||
coopeman = models.ForeignKey(User, on_delete=models.PROTECT, related_name="menu_selled") |
|||
|
|||
def __str__(self): |
|||
return "{2} a consommé {0} {1}".format(self.quantite, self.menu, self.client) |
|||
|
|||
class ConsumptionHistory(models.Model): |
|||
customer = models.ForeignKey(User, on_delete=models.PROTECT, related_name="consumption_taken") |
|||
quantity = models.PositiveIntegerField(default=0) |
|||
paymentMethod = models.ForeignKey(PaymentMethod, on_delete=models.PROTECT) |
|||
date = models.DateTimeField(auto_now_add=True) |
|||
product = models.ForeignKey(Product, on_delete=models.PROTECT) |
|||
menu = models.ForeignKey(MenuHistory, on_delete=models.CASCADE, null=True, blank=True) |
|||
amount = models.DecimalField(max_digits=7, decimal_places=2, default=0) |
|||
coopeman = models.ForeignKey(User, on_delete=models.PROTECT, related_name="consumption_selled") |
|||
|
|||
def __str__(self): |
|||
return "{0} {1} consommé par {2} le {3} (encaissé par {4})".format(self.quantity, self.product, self.customer, self.date, self.coopeman) |
@ -0,0 +1,3 @@ |
|||
from django.test import TestCase |
|||
|
|||
# Create your tests here. |
@ -0,0 +1,3 @@ |
|||
from django.shortcuts import render |
|||
|
|||
# Create your views here. |
@ -0,0 +1,3 @@ |
|||
from django.contrib import admin |
|||
|
|||
# Register your models here. |
@ -0,0 +1,5 @@ |
|||
from django.apps import AppConfig |
|||
|
|||
|
|||
class PreferencesConfig(AppConfig): |
|||
name = 'preferences' |
@ -0,0 +1,36 @@ |
|||
# Generated by Django 2.1 on 2018-08-31 12:45 |
|||
|
|||
from django.db import migrations, models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
initial = True |
|||
|
|||
dependencies = [ |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name='GeneralPreferences', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('is_active', models.BooleanField(default=True)), |
|||
('active_message', models.TextField(blank=True)), |
|||
('global_message', models.TextField(blank=True)), |
|||
('president', models.CharField(blank=True, max_length=255)), |
|||
('vice_president', models.CharField(blank=True, max_length=255)), |
|||
('treasurer', models.CharField(blank=True, max_length=255)), |
|||
('secretary', models.CharField(blank=True, max_length=255)), |
|||
('brewer', models.CharField(blank=True, max_length=255)), |
|||
('grocer', models.CharField(blank=True, max_length=255)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='PaymentMethod', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('name', models.CharField(max_length=255)), |
|||
], |
|||
), |
|||
] |
@ -0,0 +1,18 @@ |
|||
from django.db import models |
|||
|
|||
class PaymentMethod(models.Model): |
|||
name = models.CharField(max_length=255) |
|||
|
|||
def __str__(self): |
|||
return self.name |
|||
|
|||
class GeneralPreferences(models.Model): |
|||
is_active = models.BooleanField(default=True) |
|||
active_message = models.TextField(blank=True) |
|||
global_message = models.TextField(blank=True) |
|||
president = models.CharField(max_length=255, blank=True) |
|||
vice_president = models.CharField(max_length=255, blank=True) |
|||
treasurer = models.CharField(max_length=255, blank=True) |
|||
secretary = models.CharField(max_length=255, blank=True) |
|||
brewer = models.CharField(max_length=255, blank=True) |
|||
grocer = models.CharField(max_length=255, blank=True) |
@ -0,0 +1,3 @@ |
|||
from django.test import TestCase |
|||
|
|||
# Create your tests here. |
@ -0,0 +1,3 @@ |
|||
from django.shortcuts import render |
|||
|
|||
# Create your views here. |
@ -0,0 +1,3 @@ |
|||
from django.contrib import admin |
|||
|
|||
# Register your models here. |
@ -0,0 +1,5 @@ |
|||
from django.apps import AppConfig |
|||
|
|||
|
|||
class UsersConfig(AppConfig): |
|||
name = 'users' |
@ -0,0 +1,55 @@ |
|||
# Generated by Django 2.1 on 2018-08-31 12:45 |
|||
|
|||
from django.conf import settings |
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
initial = True |
|||
|
|||
dependencies = [ |
|||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
|||
('preferences', '0001_initial'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name='Cotisation', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('amount', models.DecimalField(decimal_places=2, max_digits=5)), |
|||
('paymentDate', models.DateTimeField(auto_now_add=True)), |
|||
('endDate', models.DateTimeField()), |
|||
('paymentMethod', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='preferences.PaymentMethod')), |
|||
('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='Profile', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('credit', models.DecimalField(decimal_places=2, default=0, max_digits=5)), |
|||
('debit', models.DecimalField(decimal_places=2, default=0, max_digits=5)), |
|||
('cotisationEnd', models.DateTimeField(blank=True, null=True)), |
|||
], |
|||
), |
|||
migrations.CreateModel( |
|||
name='School', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('name', models.CharField(max_length=255)), |
|||
], |
|||
), |
|||
migrations.AddField( |
|||
model_name='profile', |
|||
name='school', |
|||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='users.School'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='profile', |
|||
name='user', |
|||
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), |
|||
), |
|||
] |
@ -0,0 +1,55 @@ |
|||
from django.db import models |
|||
from django.contrib.auth.models import User |
|||
from django.db.models.signals import post_save |
|||
from django.dispatch import receiver |
|||
|
|||
from preferences.models import PaymentMethod |
|||
|
|||
class School(models.Model): |
|||
name = models.CharField(max_length=255) |
|||
|
|||
def __str__(self): |
|||
return self.name |
|||
|
|||
class Cotisation(models.Model): |
|||
user = models.ForeignKey(User, on_delete=models.PROTECT) |
|||
amount = models.DecimalField(max_digits=5, decimal_places=2) |
|||
paymentDate = models.DateTimeField(auto_now_add=True) |
|||
endDate = models.DateTimeField() |
|||
paymentMethod = models.ForeignKey(PaymentMethod, on_delete=models.PROTECT) |
|||
|
|||
class Profile(models.Model): |
|||
user = models.OneToOneField(User, on_delete=models.CASCADE) |
|||
credit = models.DecimalField(max_digits=5, decimal_places=2, default=0) |
|||
debit = models.DecimalField(max_digits=5, decimal_places=2, default=0) |
|||
school = models.ForeignKey(School, on_delete=models.PROTECT, blank=True, null=True) |
|||
cotisationEnd = models.DateTimeField(blank=True, null=True) |
|||
|
|||
@property |
|||
def solde(self): |
|||
return self.credit - self.debit |
|||
|
|||
def soldePositif(self): |
|||
return self.solde() >= 0 |
|||
|
|||
@property |
|||
def classement(self): |
|||
return Compte.objects.filter(debit__gte=self.debit).count() |
|||
|
|||
@property |
|||
def alcool(self): |
|||
consos = Consommation.objects.filter(client=self).select_related('produit') |
|||
alcool = 0 |
|||
for conso in consos: |
|||
produit = conso.produit |
|||
alcool += conso.nombre * float(produit.deg) * produit.volume * 0.79 /10 /1000 |
|||
return alcool |
|||
|
|||
@receiver(post_save, sender=User) |
|||
def create_user_profile(sender, instance, created, **kwargs): |
|||
if created: |
|||
Profile.objects.create(user=instance) |
|||
|
|||
@receiver(post_save, sender=User) |
|||
def save_user_profile(sender, instance, **kwargs): |
|||
instance.profile.save() |
@ -0,0 +1,3 @@ |
|||
from django.test import TestCase |
|||
|
|||
# Create your tests here. |
@ -0,0 +1,3 @@ |
|||
from django.shortcuts import render |
|||
|
|||
# Create your views here. |
Loading…
Reference in new issue