Appli QrCode

This commit is contained in:
Jonas 12t 2021-09-29 19:57:49 +04:00
parent b242129b49
commit 3ad6135f60
91 changed files with 365 additions and 2102 deletions

View File

@ -4,7 +4,7 @@ from django.contrib.auth.models import Group
from solo.admin import SingletonModelAdmin
from AuthBillet.models import HumanUser, SuperHumanUser, TermUser
from BaseBillet.models import Configuration, Event, OptionGenerale, Article, Billet, Reservation, LigneArticle, TarifsAdhesion
from BaseBillet.models import Configuration, Event, OptionGenerale, Article, Billet, Reservation, LigneArticle
from django.contrib.auth.admin import UserAdmin
from Customers.models import Client
@ -150,15 +150,6 @@ class ConfigurationAdmin(SingletonModelAdmin):
staff_admin_site.register(Configuration, ConfigurationAdmin)
class TarifsAdhesionAdmin(admin.ModelAdmin):
list_display = (
'name',
'tarif'
)
list_editable = ('tarif',)
ordering = ('tarif',)
staff_admin_site.register(TarifsAdhesion, TarifsAdhesionAdmin)
class EventAdmin(admin.ModelAdmin):

View File

@ -8,6 +8,20 @@ class Command(BaseCommand):
def handle(self, *args, **options):
# create your public tenant
tenant = Client(schema_name='public',
name='Schemas Inc.',
paid_until='2016-12-05',
on_trial=False)
tenant.save()
# Add one or more domains for the tenant
domain = Domain()
domain.domain = f'{os.getenv("DOMAIN")}' # don't add your port or www here! on a local server you'll want to use localhost here
domain.tenant = tenant
domain.is_primary = True
domain.save()
tenant_demo = Client.objects.get_or_create(schema_name="demo",
name="demo",
paid_until='2200-12-05',

View File

@ -1,4 +1,4 @@
# Generated by Django 2.2 on 2021-09-27 12:56
# Generated by Django 2.2 on 2021-09-27 13:39
from django.db import migrations, models
import django.db.models.deletion
@ -12,7 +12,7 @@ class Migration(migrations.Migration):
dependencies = [
('auth', '0011_update_proxy_permissions'),
('Customers', '0003_auto_20210623_1351'),
('Customers', '0001_initial'),
]
operations = [
@ -28,7 +28,7 @@ class Migration(migrations.Migration):
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('uuid_user', models.UUIDField(default=uuid.uuid4, editable=False)),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False)),
('email', models.EmailField(max_length=254, unique=True, verbose_name='email')),
('username', models.CharField(blank=True, max_length=200, null=True)),
('phone', models.CharField(blank=True, max_length=20, null=True)),

View File

@ -48,7 +48,7 @@ class TibilletUser(AbstractUser):
#TODO regarder du coté du dashboard de jet, ça plante avec uuid !
# uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True)
uuid_user = models.UUIDField(default=uuid.uuid4, editable=False)
uuid = models.UUIDField(default=uuid.uuid4, editable=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = [] # removes email from REQUIRED_FIELDS
@ -157,6 +157,7 @@ class TermUser(TibilletUser):
# Si création :
if not self.pk:
self.espece = TibilletUser.TYPE_TERM
self.email = self.email.lower()
super().save(*args, **kwargs)
@ -187,6 +188,7 @@ class HumanUser(TibilletUser):
self.is_staff = False
self.is_superuser = False
self.email = self.email.lower()
super().save(*args, **kwargs)
@ -218,6 +220,7 @@ class SuperHumanUser(TibilletUser):
self.is_staff = True
self.is_superuser = False
self.email = self.email.lower()
super().save(*args, **kwargs)

View File

@ -1,9 +1,11 @@
# Generated by Django 2.2 on 2021-06-23 09:09
# Generated by Django 2.2 on 2021-09-27 13:39
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import stdimage.models
import stdimage.validators
import uuid
class Migration(migrations.Migration):
@ -11,9 +13,35 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('PaiementStripe', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Article',
fields=[
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('name', models.CharField(blank=True, max_length=50, null=True)),
('prix', models.FloatField()),
('stock', models.SmallIntegerField(blank=True, null=True)),
('reservation_par_user_max', models.PositiveSmallIntegerField(default=10)),
('publish', models.BooleanField(default=False)),
('img', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)], verbose_name='Image')),
('categorie_article', models.CharField(choices=[('B', 'Billet'), ('P', "Pack d'objets"), ('R', 'Recharge cashless'), ('T', 'Vetement'), ('M', 'Merchandasing'), ('A', 'Adhésion')], default='B', max_length=3, verbose_name="Type d'article")),
('id_product_stripe', models.CharField(blank=True, max_length=30, null=True)),
('id_price_stripe', models.CharField(blank=True, max_length=30, null=True)),
],
),
migrations.CreateModel(
name='Billet',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(blank=True, max_length=50, null=True)),
('prix', models.FloatField()),
('reservation_par_user_max', models.PositiveSmallIntegerField(default=6)),
],
),
migrations.CreateModel(
name='Event',
fields=[
@ -24,6 +52,8 @@ class Migration(migrations.Migration):
('datetime', models.DateTimeField()),
('img', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)])),
('reservations', models.PositiveSmallIntegerField(default=0)),
('articles', models.ManyToManyField(to='BaseBillet.Article')),
('billets', models.ManyToManyField(to='BaseBillet.Billet')),
],
options={
'verbose_name': 'Evenement',
@ -45,12 +75,48 @@ class Migration(migrations.Migration):
},
),
migrations.CreateModel(
name='reservation',
name='TarifsAdhesion',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('status', models.CharField(choices=[('NAN', 'Annulée'), ('NOV', 'Email non validé'), ('VAL', 'Validée'), ('PAY', 'Payée')], default='NOV', max_length=3, verbose_name='Status de la réservation')),
('qty', models.IntegerField()),
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservation', to='BaseBillet.Event')),
('name', models.CharField(max_length=30)),
('tarif', models.FloatField()),
],
options={
'ordering': ('-tarif',),
},
),
migrations.CreateModel(
name='VAT',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('percent', models.FloatField(verbose_name='Taux de TVA (%)')),
],
options={
'verbose_name': 'TVA',
'verbose_name_plural': 'TVA',
},
),
migrations.CreateModel(
name='Reservation',
fields=[
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False)),
('status', models.CharField(choices=[('NAN', 'Annulée'), ('MNV', 'Email non validé'), ('NPA', 'Non payée'), ('VAL', 'Validée'), ('PAY', 'Payée')], default='NPA', max_length=3, verbose_name='Status de la réservation')),
('event', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='reservation', to='BaseBillet.Event')),
('options', models.ManyToManyField(to='BaseBillet.OptionGenerale')),
('user_commande', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='LigneArticle',
fields=[
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False)),
('qty', models.SmallIntegerField()),
('reste', models.SmallIntegerField()),
('datetime', models.DateTimeField(auto_now=True)),
('article', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Article')),
('billet', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Billet')),
('paiement_stripe', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='PaiementStripe.Paiement_stripe')),
('reservation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation')),
],
),
migrations.CreateModel(
@ -62,13 +128,22 @@ class Migration(migrations.Migration):
('adresse', models.CharField(max_length=250)),
('phone', models.CharField(max_length=20)),
('email', models.EmailField(max_length=254)),
('site_web', models.URLField(blank=True, null=True)),
('twitter', models.URLField(blank=True, null=True)),
('facebook', models.URLField(blank=True, null=True)),
('instagram', models.URLField(blank=True, null=True)),
('img', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/')),
('adhesion_obligatoire', models.BooleanField(default=False)),
('cadeau_adhesion', models.FloatField(default=0, help_text="Recharge cadeau a l'adhésion")),
('carte_restaurant', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)], verbose_name='Carte du restaurant')),
('img', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', verbose_name='Background')),
('mollie_api_key', models.CharField(blank=True, max_length=50, null=True)),
('reservation_par_user_max', models.PositiveSmallIntegerField(default=6)),
('stripe_api_key', models.CharField(blank=True, max_length=110, null=True)),
('stripe_test_api_key', models.CharField(blank=True, max_length=110, null=True)),
('stripe_mode_test', models.BooleanField(default=True)),
('activer_billetterie', models.BooleanField(default=True)),
('jauge_max', models.PositiveSmallIntegerField(default=50)),
('server_cashless', models.URLField(blank=True, max_length=300, null=True, verbose_name='Adresse du serveur Cashless')),
('key_cashless', models.CharField(blank=True, max_length=41, null=True, verbose_name="Clé d'API du serveur cashless")),
('option_generale_checkbox', models.ManyToManyField(blank=True, related_name='checkbox', to='BaseBillet.OptionGenerale')),
('option_generale_radio', models.ManyToManyField(blank=True, related_name='radiobutton', to='BaseBillet.OptionGenerale')),
],
@ -76,4 +151,9 @@ class Migration(migrations.Migration):
'abstract': False,
},
),
migrations.AddField(
model_name='article',
name='vat',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.VAT', verbose_name='TVA'),
),
]

View File

@ -1,73 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:25
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import stdimage.models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('BaseBillet', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Article',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(blank=True, max_length=50, null=True)),
('prix', models.FloatField()),
],
),
migrations.CreateModel(
name='Billet',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(blank=True, max_length=50, null=True)),
('prix', models.FloatField()),
],
),
migrations.RemoveField(
model_name='reservation',
name='id',
),
migrations.RemoveField(
model_name='reservation',
name='qty',
),
migrations.AddField(
model_name='reservation',
name='user_commande',
field=models.ForeignKey(default=False, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
preserve_default=False,
),
migrations.AddField(
model_name='reservation',
name='uuid',
field=models.UUIDField(db_index=True, default=False, primary_key=True, serialize=False, unique=True),
preserve_default=False,
),
migrations.AlterField(
model_name='configuration',
name='img',
field=stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', verbose_name='Background'),
),
migrations.CreateModel(
name='LigneArticle',
fields=[
('uuid', models.UUIDField(db_index=True, primary_key=True, serialize=False, unique=True)),
('qty', models.SmallIntegerField()),
('reste', models.SmallIntegerField()),
('articles', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Article')),
('reservation', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation')),
],
),
migrations.AddField(
model_name='event',
name='articles',
field=models.ManyToManyField(to='BaseBillet.Article', verbose_name='Articles et billets'),
),
]

View File

@ -1,4 +1,4 @@
# Generated by Django 2.2 on 2021-09-25 10:15
# Generated by Django 2.2 on 2021-09-27 13:59
from django.db import migrations
@ -6,12 +6,12 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('QrcodeCashless', '0005_detail_base_url'),
('BaseBillet', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='cartecashless',
name='origine',
model_name='lignearticle',
name='reste',
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:27
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0002_auto_20210629_1625'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,4 +1,4 @@
# Generated by Django 2.2 on 2021-09-24 12:11
# Generated by Django 2.2 on 2021-09-27 14:24
from django.db import migrations
@ -6,11 +6,11 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('PaiementStripe', '0005_auto_20210924_1611'),
('BaseBillet', '0002_remove_lignearticle_reste'),
]
operations = [
migrations.DeleteModel(
name='Configuration_stripe',
name='TarifsAdhesion',
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:27
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0003_auto_20210629_1627'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:29
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0004_auto_20210629_1627'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
migrations.AlterField(
model_name='lignearticle',
name='uuid',
field=models.UUIDField(db_index=True, primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='reservation',
name='uuid',
field=models.UUIDField(db_index=True, primary_key=True, serialize=False),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:29
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0005_auto_20210629_1629'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:33
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0006_auto_20210629_1629'),
]
operations = [
migrations.AddField(
model_name='reservation',
name='options',
field=models.ManyToManyField(to='BaseBillet.OptionGenerale'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:54
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0007_auto_20210629_1633'),
]
operations = [
migrations.AddField(
model_name='event',
name='billets',
field=models.ManyToManyField(to='BaseBillet.Billet'),
),
migrations.AlterField(
model_name='event',
name='articles',
field=models.ManyToManyField(to='BaseBillet.Article'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0008_auto_20210629_1654'),
]
operations = [
migrations.AddField(
model_name='article',
name='stock',
field=models.SmallIntegerField(blank=True, null=True),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 12:58
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0009_auto_20210629_1655'),
]
operations = [
migrations.AddField(
model_name='billet',
name='reservation_par_user_max',
field=models.PositiveSmallIntegerField(default=6),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,28 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 13:13
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0010_auto_20210629_1658'),
]
operations = [
migrations.RemoveField(
model_name='configuration',
name='reservation_par_user_max',
),
migrations.AddField(
model_name='article',
name='reservation_par_user_max',
field=models.PositiveSmallIntegerField(default=10),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 13:29
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0011_auto_20210629_1713'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,30 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 13:33
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0012_auto_20210629_1729'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
migrations.AlterField(
model_name='lignearticle',
name='uuid',
field=models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='reservation',
name='uuid',
field=models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 13:35
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0013_auto_20210629_1733'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='articles',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Article', verbose_name='lignes_article'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 13:38
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0014_auto_20210629_1735'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='articles',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Article'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 13:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0015_auto_20210629_1738'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation', verbose_name='lignes_article'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 14:09
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0016_auto_20210629_1739'),
]
operations = [
migrations.RenameField(
model_name='lignearticle',
old_name='articles',
new_name='article',
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation', verbose_name='lignes_article'),
),
migrations.AlterField(
model_name='reservation',
name='status',
field=models.CharField(choices=[('NAN', 'Annulée'), ('MNV', 'Email non validé'), ('NPA', 'Non payée'), ('VAL', 'Validée'), ('PAY', 'Payée')], default='NPA', max_length=3, verbose_name='Status de la réservation'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 14:11
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0017_auto_20210629_1809'),
]
operations = [
migrations.AddField(
model_name='lignearticle',
name='billet',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Billet'),
),
migrations.AlterField(
model_name='lignearticle',
name='article',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Article'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation', verbose_name='lignes_article'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 14:11
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0018_auto_20210629_1811'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation', verbose_name='lignes_article'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 14:20
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0019_auto_20210629_1811'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='article',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Article'),
),
migrations.AlterField(
model_name='lignearticle',
name='billet',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Billet'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation', verbose_name='lignes_article'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 15:48
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0020_auto_20210629_1820'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation', verbose_name='lignes_article'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-06-29 15:52
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0021_auto_20210629_1948'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation', verbose_name='lignes_article'),
),
migrations.AlterField(
model_name='reservation',
name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='reservation', to='BaseBillet.Event'),
),
]

View File

@ -1,25 +0,0 @@
# Generated by Django 2.2 on 2021-09-23 09:38
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('PaiementStripe', '0002_auto_20210923_1338'),
('BaseBillet', '0022_auto_20210629_1952'),
]
operations = [
migrations.AddField(
model_name='lignearticle',
name='paiement_stripe',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='PaiementStripe.Paiement_stripe'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-23 09:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0023_auto_20210923_1338'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-09-23 10:03
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0024_auto_20210923_1339'),
]
operations = [
migrations.AddField(
model_name='configuration',
name='key_cashless',
field=models.CharField(blank=True, max_length=41, null=True, verbose_name="Clé d'API du serveur cashless"),
),
migrations.AddField(
model_name='configuration',
name='server_cashless',
field=models.URLField(blank=True, max_length=300, null=True, verbose_name='Adresse du serveur Cashless'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,35 +0,0 @@
# Generated by Django 2.2 on 2021-09-23 13:06
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0025_auto_20210923_1403'),
]
operations = [
migrations.CreateModel(
name='VAT',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('percent', models.FloatField(verbose_name='Taux de TVA (%)')),
],
options={
'verbose_name': 'TVA',
'verbose_name_plural': 'TVA',
},
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
migrations.AddField(
model_name='article',
name='vat',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.VAT', verbose_name='TVA'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-09-23 13:28
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0026_auto_20210923_1706'),
]
operations = [
migrations.AddField(
model_name='article',
name='publish',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 11:16
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0027_auto_20210923_1728'),
]
operations = [
migrations.AddField(
model_name='lignearticle',
name='datetime',
field=models.DateTimeField(auto_now=True),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 11:47
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0028_auto_20210924_1516'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 11:53
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0029_auto_20210924_1547'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 12:11
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0030_auto_20210924_1553'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 12:11
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0031_auto_20210924_1611'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 12:14
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0032_auto_20210924_1611'),
]
operations = [
migrations.AddField(
model_name='configuration',
name='stripe_api_key',
field=models.CharField(blank=True, max_length=110, null=True),
),
migrations.AddField(
model_name='configuration',
name='stripe_test_api_key',
field=models.CharField(blank=True, max_length=110, null=True),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 12:21
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0033_auto_20210924_1614'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 12:28
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0034_auto_20210924_1621'),
]
operations = [
migrations.AddField(
model_name='configuration',
name='stripe_mode_test',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 06:27
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0035_auto_20210924_1628'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 07:59
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0036_auto_20210925_1027'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 08:08
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0037_auto_20210925_1159'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 08:24
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0038_auto_20210925_1208'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 09:10
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0039_auto_20210925_1224'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 10:15
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0040_auto_20210925_1310'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 10:17
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0041_auto_20210925_1415'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 10:44
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0042_auto_20210925_1417'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 11:07
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0043_auto_20210925_1444'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 13:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0044_auto_20210925_1507'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-26 07:19
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0045_auto_20210925_1755'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,31 +0,0 @@
# Generated by Django 2.2 on 2021-09-26 09:59
from django.db import migrations, models
import django.db.models.deletion
import stdimage.models
import stdimage.validators
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0046_auto_20210926_1119'),
]
operations = [
migrations.AddField(
model_name='configuration',
name='carte_restaurant',
field=stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)], verbose_name='Background'),
),
migrations.AddField(
model_name='configuration',
name='site_web',
field=models.URLField(blank=True, null=True),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,31 +0,0 @@
# Generated by Django 2.2 on 2021-09-26 11:31
from django.db import migrations, models
import django.db.models.deletion
import stdimage.models
import stdimage.validators
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0047_auto_20210926_1359'),
]
operations = [
migrations.AddField(
model_name='configuration',
name='activer_billetterie',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='configuration',
name='carte_restaurant',
field=stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)], verbose_name='Carte du restaurant'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,32 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 06:47
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0048_auto_20210926_1531'),
]
operations = [
migrations.CreateModel(
name='TarifsAdhesion',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30)),
('tarif', models.FloatField()),
],
),
migrations.AddField(
model_name='configuration',
name='adhesion_obligatoire',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,28 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 07:32
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0049_auto_20210927_1047'),
]
operations = [
migrations.AlterModelOptions(
name='tarifsadhesion',
options={'ordering': ('-tarif',)},
),
migrations.AddField(
model_name='configuration',
name='cadeau_adhesion',
field=models.FloatField(default=0),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 09:34
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0050_auto_20210927_1132'),
]
operations = [
migrations.AddField(
model_name='article',
name='categorie_article',
field=models.CharField(choices=[('B', 'Billet'), ('P', "Pack d'objets"), ('R', 'Recharge cashless'), ('T', 'Vetement'), ('M', 'Merchandasing')], default='B', max_length=3, verbose_name='Status de la réservation'),
),
migrations.AlterField(
model_name='configuration',
name='cadeau_adhesion',
field=models.FloatField(default=0, help_text="Recharge cadeau a l'adhésion"),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 09:35
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0051_auto_20210927_1334'),
]
operations = [
migrations.AddField(
model_name='article',
name='id_stripe',
field=models.CharField(blank=True, max_length=30, null=True),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,26 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 09:48
from django.db import migrations, models
import django.db.models.deletion
import stdimage.models
import stdimage.validators
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0052_auto_20210927_1335'),
]
operations = [
migrations.AddField(
model_name='article',
name='img',
field=stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)], verbose_name='Image'),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 09:50
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0053_auto_20210927_1348'),
]
operations = [
migrations.RemoveField(
model_name='article',
name='id',
),
migrations.AddField(
model_name='article',
name='uuid',
field=models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 10:07
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0054_auto_20210927_1350'),
]
operations = [
migrations.RenameField(
model_name='article',
old_name='id_stripe',
new_name='id_price_stripe',
),
migrations.AlterField(
model_name='article',
name='categorie_article',
field=models.CharField(choices=[('B', 'Billet'), ('P', "Pack d'objets"), ('R', 'Recharge cashless'), ('T', 'Vetement'), ('M', 'Merchandasing'), ('A', 'Adhésion')], default='B', max_length=3, verbose_name="Type d'article"),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 10:07
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0055_auto_20210927_1407'),
]
operations = [
migrations.AddField(
model_name='article',
name='id_product_stripe',
field=models.CharField(blank=True, max_length=30, null=True),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 11:43
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0056_auto_20210927_1407'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 12:34
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0057_auto_20210927_1543'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 12:34
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0058_auto_20210927_1634'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,25 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 13:18
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0059_auto_20210927_1634'),
]
operations = [
migrations.AlterField(
model_name='article',
name='uuid',
field=models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-27 13:18
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('BaseBillet', '0060_auto_20210927_1718'),
]
operations = [
migrations.AlterField(
model_name='lignearticle',
name='reservation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation'),
),
]

View File

@ -40,16 +40,6 @@ def poids_option_generale(sender, instance: OptionGenerale, created, **kwargs):
instance.save()
class TarifsAdhesion(models.Model):
name = models.CharField(max_length=30)
tarif = models.FloatField()
class Meta:
ordering = ('-tarif',)
def __str__(self):
return f"{self.name} {self.tarif}"
class Configuration(SingletonModel):
organisation = models.CharField(max_length=50)
@ -157,7 +147,7 @@ class VAT(models.Model):
class Article(models.Model):
uuid = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4, editable=False)
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True)
name = models.CharField(max_length=50,
blank=True, null=True)
@ -362,12 +352,5 @@ class LigneArticle(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, blank=True, null=True)
billet = models.ForeignKey(Billet, on_delete=models.CASCADE, blank=True, null=True)
qty = models.SmallIntegerField()
reste = models.SmallIntegerField()
paiement_stripe = models.ForeignKey(Paiement_stripe, on_delete=models.PROTECT, blank=True, null=True)
datetime = models.DateTimeField(auto_now=True)
# def __str__(self):
# if self.reservation :
# if self.article :
# return f"{self.reservation.user_commande.email} {self.qty} {self.article}"
# if self.billet :
# return f"{self.reservation.user_commande.email} {self.qty} {self.billet}"

View File

@ -1,7 +1,8 @@
# Generated by Django 2.2 on 2021-06-23 09:09
# Generated by Django 2.2 on 2021-09-27 13:39
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import django_tenants.postgresql_backend.base
@ -18,9 +19,9 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('schema_name', models.CharField(db_index=True, max_length=63, unique=True, validators=[django_tenants.postgresql_backend.base._check_schema_name])),
('name', models.CharField(max_length=100)),
('paid_until', models.DateField()),
('on_trial', models.BooleanField()),
('name', models.CharField(db_index=True, max_length=100, unique=True)),
('paid_until', models.DateField(default=django.utils.timezone.now)),
('on_trial', models.BooleanField(default=True)),
('created_on', models.DateField(auto_now_add=True)),
],
options={

View File

@ -1,46 +0,0 @@
# Generated by Django 2.2.13 on 2021-06-08 10:08
import os
from django.db import migrations
def create_premier_tenant(apps, schema_editor):
# We can't import the Person model directly as it may be a newer
# version than this migration expects. We use the historical version.
Client = apps.get_model('Customers', 'Client')
Domain = apps.get_model('Customers', 'Domain')
DNS = os.getenv('DOMAIN')
tenant_public = Client.objects.get_or_create(schema_name='public',
name='Tibillet Public',
paid_until='2200-12-05',
on_trial=False)[0]
# Add one or more domains for the tenant
domaine_seul = Domain.objects.get_or_create(domain=DNS,
tenant=tenant_public,
is_primary=True,
)
domaine_www = Domain.objects.get_or_create(domain=f'www.{DNS}',
tenant=tenant_public,
is_primary=False,
)
return tenant_public, domaine_seul[0], domaine_www[0]
def reverse(apps, schema_editor):
tenant_public, domaine_seul, domaine_www = create_premier_tenant(apps, schema_editor)
tenant_public.delete()
domaine_seul.delete()
domaine_www.delete()
class Migration(migrations.Migration):
dependencies = [
('Customers', '0001_initial'),
]
operations = [
migrations.RunPython(create_premier_tenant, reverse),
]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2 on 2021-06-23 09:51
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('Customers', '0002_create_tenant_public'),
]
operations = [
migrations.AlterField(
model_name='client',
name='name',
field=models.CharField(db_index=True, max_length=100, unique=True),
),
migrations.AlterField(
model_name='client',
name='on_trial',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='client',
name='paid_until',
field=models.DateField(default=django.utils.timezone.now),
),
]

View File

@ -1,6 +1,9 @@
# Generated by Django 2.2 on 2021-09-23 08:55
# Generated by Django 2.2 on 2021-09-27 13:39
from django.conf import settings
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
import uuid
@ -9,6 +12,7 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@ -16,10 +20,13 @@ class Migration(migrations.Migration):
name='Paiement_stripe',
fields=[
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('id_stripe', models.CharField(blank=True, max_length=20, null=True)),
('detail', models.CharField(blank=True, max_length=50, null=True)),
('id_stripe', models.CharField(blank=True, max_length=80, null=True)),
('metadata_stripe', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)),
('order_date', models.DateTimeField(auto_now=True, verbose_name='Date')),
('status', models.CharField(choices=[('O', 'Envoyée a Stripe'), ('W', 'En attente de paiement'), ('P', 'Payée'), ('V', 'Payée et validée'), ('C', 'Annulée')], default='O', max_length=1, verbose_name='Statut de la commande')),
('email_billet', models.CharField(blank=True, max_length=30, verbose_name='Email de récéption des billets')),
('status', models.CharField(choices=[('N', 'Lien de paiement non crée'), ('O', 'Envoyée a Stripe'), ('W', 'En attente de paiement'), ('E', 'Expiré'), ('P', 'Payée'), ('V', 'Payée et validée'), ('C', 'Annulée')], default='N', max_length=1, verbose_name='Statut de la commande')),
('total', models.FloatField(default=0)),
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 2.2 on 2021-09-23 09:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('PaiementStripe', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='paiement_stripe',
name='status',
field=models.CharField(choices=[('N', 'Lien de paiement non crée'), ('O', 'Envoyée a Stripe'), ('W', 'En attente de paiement'), ('P', 'Payée'), ('V', 'Payée et validée'), ('C', 'Annulée')], default='N', max_length=1, verbose_name='Statut de la commande'),
),
]

View File

@ -1,26 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 11:47
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('PaiementStripe', '0002_auto_20210923_1338'),
]
operations = [
migrations.AddField(
model_name='paiement_stripe',
name='detail',
field=models.CharField(blank=True, max_length=50, null=True),
),
migrations.AddField(
model_name='paiement_stripe',
name='user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 11:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('PaiementStripe', '0003_auto_20210924_1547'),
]
operations = [
migrations.AddField(
model_name='paiement_stripe',
name='total',
field=models.FloatField(default=0),
),
]

View File

@ -1,25 +0,0 @@
# Generated by Django 2.2 on 2021-09-24 12:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('PaiementStripe', '0004_paiement_stripe_total'),
]
operations = [
migrations.CreateModel(
name='Configuration_stripe',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('test_api_key', models.CharField(blank=True, max_length=110, null=True)),
('api_key', models.CharField(blank=True, max_length=110, null=True)),
],
),
migrations.RemoveField(
model_name='paiement_stripe',
name='email_billet',
),
]

View File

@ -1,23 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 06:27
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('PaiementStripe', '0006_delete_configuration_stripe'),
]
operations = [
migrations.AlterField(
model_name='paiement_stripe',
name='id_stripe',
field=models.CharField(blank=True, max_length=80, null=True),
),
migrations.AlterField(
model_name='paiement_stripe',
name='status',
field=models.CharField(choices=[('N', 'Lien de paiement non crée'), ('O', 'Envoyée a Stripe'), ('W', 'En attente de paiement'), ('E', 'Expiré'), ('P', 'Payée'), ('V', 'Payée et validée'), ('C', 'Annulée')], default='N', max_length=1, verbose_name='Statut de la commande'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-26 07:19
import django.contrib.postgres.fields.jsonb
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('PaiementStripe', '0007_auto_20210925_1027'),
]
operations = [
migrations.AddField(
model_name='paiement_stripe',
name='metadata_stripe',
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True),
),
]

View File

@ -3,8 +3,9 @@ from django.contrib.postgres.fields import JSONField
import uuid
# Create your models here.
from TiBillet import settings
# class Configuration_stripe(models.Model):
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
# from QrcodeCashless.views import postPaimentRecharge
class Paiement_stripe(models.Model):
@ -38,5 +39,13 @@ class Paiement_stripe(models.Model):
def __str__(self):
return f"{self.detail} - {self.status}"
''' RECEIVER PRESAVE DANS LE VIEW QRCODECASHELESS
@receiver(pre_save, sender=Paiement_stripe)
def changement_paid_to_valid(sender, instance: Paiement_stripe, update_fields=None, **kwargs):
try:
old_instance = Paiement_stripe.objects.get(pk=instance.pk)
if old_instance.status != Paiement_stripe.PAID :
print(f"on passe de {old_instance.status} à {instance.status}")
if instance.status == Paiement_stripe.PAID:
on lance la recharge vers le serveur cashless
'''

View File

@ -1,6 +1,7 @@
import json
from datetime import datetime
from django.contrib import messages
from django.contrib.auth import get_user_model
from django.db import connection
from django.http import HttpResponse, Http404, HttpResponseRedirect
@ -31,13 +32,14 @@ class creation_checkout_stripe():
) -> None:
self.absolute_domain = absolute_domain
self.configuration = Configuration.get_solo()
self.liste_ligne_article = liste_ligne_article
self.email_paiement = email_paiement
self.metadata = metadata
self.configuration = Configuration.get_solo()
self.user = self._user_paiement()
self.detail = self._detail()
self.total = self._total()
self.liste_ligne_article = liste_ligne_article
self.metadata = metadata
self.metadata_json = json.dumps(self.metadata)
self.paiement_stripe_db = self._paiement_stripe_db()
self.stripe_api_key = self._stripe_api_key()
@ -64,7 +66,7 @@ class creation_checkout_stripe():
total = 0
for ligne in self.liste_ligne_article:
ligne: LigneArticle
total += ligne.qty * ligne.article.prix
total += float(ligne.qty) * float(ligne.article.prix)
return total
def _detail(self):
@ -100,20 +102,23 @@ class creation_checkout_stripe():
line_items.append(
{
"price": f"{ligne.article.get_id_price_stripe()}",
"quantity": ligne.qty,
"quantity": int(ligne.qty),
}
)
return line_items
def _checkout_session(self):
checkout_session = stripe.checkout.Session.create(
customer_email=f'{self.user.email}',
line_items=self.line_items,
payment_method_types=['card'],
mode='payment',
metadata=self.metadata,
success_url=f'{self.absolute_domain}/stripe/return/{self.paiement_stripe_db.uuid}',
cancel_url=f'{self.absolute_domain}/stripe/return/{self.paiement_stripe_db.uuid}',
client_reference_id=f"{self.user.uuid_user}",
payment_method_types=["card"],
customer_email=f'{self.user.email}',
line_items=self.line_items,
mode='payment',
metadata=self.metadata,
client_reference_id=f"{self.user.uuid}",
)
print(checkout_session.id)
@ -146,6 +151,7 @@ class retour_stripe(View):
else:
stripe.api_key = configuration.stripe_api_key
print(paiement_stripe.status)
if paiement_stripe.status != Paiement_stripe.VALID:
checkout_session = stripe.checkout.Session.retrieve(paiement_stripe.id_stripe)
@ -156,9 +162,6 @@ class retour_stripe(View):
paiement_stripe.save()
elif checkout_session.payment_status == "paid":
paiement_stripe.status = Paiement_stripe.PAID
paiement_stripe.save()
# on vérifie si les infos sont cohérente avec la db : Never Trust Input :)
metadata_stripe_json = checkout_session.metadata
metadata_stripe = json.loads(str(metadata_stripe_json))
@ -177,25 +180,26 @@ class retour_stripe(View):
f"metadata ne correspondent pas : {metadata_stripe} {metadata_db}")
raise Http404
# on check si il y a un rechargement de carte cashless dans la commande
if metadata_db.get('recharge_carte_uuid'):
logger.info(
f'{timezone.now()} retour stripe pour rechargement carte : {metadata_db.get("recharge_carte_uuid")}')
print(
f'{timezone.now()} retour stripe pour rechargement carte : {metadata_db.get("recharge_carte_uuid")}')
print('gerer la recharge sur le serveur cashless')
# return postPaimentRecharge(paiement_stripe, request)
paiement_stripe.status = Paiement_stripe.PAID
paiement_stripe.save()
# le .save() lance le process pre_save dans le view QrcodeCashless, qui peut modifier son status
paiement_stripe.refresh_from_db()
if paiement_stripe.status == Paiement_stripe.VALID :
messages.success(request, f"Paiement validé. Merci !")
return HttpResponseRedirect(f"/qr/{metadata_db.get('recharge_carte_uuid')}#success")
else:
paiement_stripe.status = Paiement_stripe.CANCELED
paiement_stripe.save()
return HttpResponse(f'Le paiement annulé.')
return HttpResponse(f'Paiement validé')
if paiement_stripe.status == Paiement_stripe.VALID:
metadata_db_json = paiement_stripe.metadata_stripe
metadata_db = json.loads(metadata_db_json)
if metadata_db.get('recharge_carte_uuid'):
return HttpResponseRedirect(f"/qr/{metadata_db.get('recharge_carte_uuid')}#historique")
else :
return HttpResponse('Un problème de validation de paiement a été detecté. Merci de contacter un responsable.')
# return HttpResponseRedirect("/")
'''

View File

@ -1,7 +1,9 @@
# Generated by Django 2.2 on 2021-09-23 09:39
# Generated by Django 2.2 on 2021-09-27 13:39
from django.db import migrations, models
import django.db.models.deletion
import stdimage.models
import stdimage.validators
class Migration(migrations.Migration):
@ -9,18 +11,29 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('Customers', '0003_auto_20210623_1351'),
('Customers', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Detail',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('img', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)], verbose_name='Recto de la carte')),
('img_url', models.URLField(blank=True, null=True)),
('base_url', models.CharField(blank=True, max_length=60, null=True)),
('generation', models.SmallIntegerField()),
('origine', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='Customers.Client')),
],
),
migrations.CreateModel(
name='CarteCashless',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tag_id', models.CharField(db_index=True, max_length=8, unique=True)),
('uuid_qrcode', models.UUIDField(blank=True, null=True, verbose_name='Uuid')),
('number', models.CharField(blank=True, db_index=True, max_length=8, null=True, unique=True)),
('origine', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='Customers.Client')),
('uuid', models.UUIDField(blank=True, null=True, verbose_name='Uuid')),
('number', models.CharField(db_index=True, max_length=8, unique=True)),
('detail', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='QrcodeCashless.Detail')),
],
),
]

View File

@ -1,24 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 07:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('QrcodeCashless', '0001_initial'),
]
operations = [
migrations.RenameField(
model_name='cartecashless',
old_name='uuid_qrcode',
new_name='uuid',
),
migrations.AlterField(
model_name='cartecashless',
name='number',
field=models.CharField(db_index=True, default=0, max_length=8, unique=True),
preserve_default=False,
),
]

View File

@ -1,27 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 08:08
from django.db import migrations, models
import django.db.models.deletion
import stdimage.models
class Migration(migrations.Migration):
dependencies = [
('QrcodeCashless', '0002_auto_20210925_1159'),
]
operations = [
migrations.CreateModel(
name='Detail',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('img', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', verbose_name='Recto de la carte')),
],
),
migrations.AddField(
model_name='cartecashless',
name='detail',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='QrcodeCashless.Detail'),
),
]

View File

@ -1,20 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 08:24
from django.db import migrations
import stdimage.models
import stdimage.validators
class Migration(migrations.Migration):
dependencies = [
('QrcodeCashless', '0003_auto_20210925_1208'),
]
operations = [
migrations.AlterField(
model_name='detail',
name='img',
field=stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)], verbose_name='Recto de la carte'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 09:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('QrcodeCashless', '0004_auto_20210925_1224'),
]
operations = [
migrations.AddField(
model_name='detail',
name='base_url',
field=models.CharField(blank=True, max_length=60, null=True),
),
]

View File

@ -1,20 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 10:17
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('Customers', '0003_auto_20210623_1351'),
('QrcodeCashless', '0006_remove_cartecashless_origine'),
]
operations = [
migrations.AddField(
model_name='detail',
name='origine',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='Customers.Client'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 10:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('QrcodeCashless', '0007_detail_origine'),
]
operations = [
migrations.AddField(
model_name='detail',
name='img_url',
field=models.URLField(blank=True, null=True),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 2.2 on 2021-09-25 13:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('QrcodeCashless', '0008_detail_img_url'),
]
operations = [
migrations.AddField(
model_name='detail',
name='generation',
field=models.SmallIntegerField(default=1),
preserve_default=False,
),
]

View File

@ -1,67 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Rechargement Online</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<!-- Font Awesome -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css">
<!-- Bootstrap core CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Material Design Bootstrap -->
{# <link href="css/mdb.min.css" rel="stylesheet">#}
<!-- Your custom styles (optional) -->
{# <link href="css/style.css" rel="stylesheet">#}
</head>
<body>
<br>
{% if url_image_carte %}
<div class="container-fluid">
<img src="{{ url_image_carte }}" alt="Product" class="img-fluid img-thumbnail rounded mx-auto d-block" >
</div>
{% endif %}
<br>
<p class="h3 mb-4 text-center">Rechargement Cashless {{ domain.capitalize }}</p>
{% if liste_assets %}
<p class="h5 mb-5 text-center">Disponible sur votre carte :
{% for asset in liste_assets %}
<p class="h6 mb-6 text-center"> {{ asset }} </p>
{% endfor %}
</p>
{% else %}
<p class="h4 mb-4 text-center">Votre carte est vide.</p>
{% endif %}
<form class="border border-light p-5" name="form" method="POST">
{% csrf_token %}
<label for="numero_carte">Merci de vérifier votre numéro de la carte cashless ( au dessous du QRCode ) :</label>
<input type="text" id="numero_carte_cashless" class="form-control" placeholder="Numéro de la carte cashless"
value="{{ numero_carte }}" name="numero_carte_cashless" required="True" readonly>
<br>
<label for="Email">Email :</label>
{% if email %}
<input type="email" id="Email" class="form-control mb-4" placeholder="E-mail" name="email" required="True"
value="{{ email }}">
{% else %}
<input type="email" id="Email" class="form-control mb-4" placeholder="E-mail" name="email" required="True">
{% endif %}
<label for="thune">Somme à recharger (€) :</label>
<input id="thune" class="form-control" type="number" min="1" step="any" name="thune" required="True"/>
<br>
<div class="d-grid gap-2">
<button class="btn btn-primary" type="submit">Payer</button>
</div>
</form>
</body>
</html>

View File

@ -16,8 +16,7 @@
<link rel="stylesheet" href="{% static 'html5up-dimension/assets/css/noscript.css' %}"/>
</noscript>
</head>
< class="is-preload">
<body class="is-preload">
<!-- Wrapper -->
<div id="wrapper">
@ -38,12 +37,15 @@
<nav>
<ul>
<li><a href="#recharger">Recharger</a></li>
{% if history %}
<li><a href="#historique">Historique</a></li>
{% endif %}
{% if carte_resto %}
<li><a href="/media/{{ carte_resto }}">Restaurant</a></li>
{% endif %}
{% if billetterie_bool %}
<li><a href="/">Billetterie</a></li>
{% endif %}
@ -56,6 +58,9 @@
<li><a href="#adherer">Adhérer</a></li>
{% endif %}
{% if email and not a_jour_cotisation %}
<li><a href="#adherer">Adhérer</a></li>
{% endif %}
{# <li><a href="#elements">Elements</a></li>#}
</ul>
@ -75,15 +80,19 @@
<div class="field">
<label for="email">Email</label>
{% if email %}
<input type="email" name="email" id="Email" required="True" value="{{ email }}"/>
<label for="email">Vérifiez votre adresse Email</label>
<input type="email" name="email" id="Email" required="True" value="{{ email }}"
style="text-transform: lowercase;"/>
{% else %}
<input type="email" name="email" id="email" required="True"/>
<label for="email">Entrez votre adresse Email</label>
<input type="email" name="email" id="email" required="True"
style="text-transform: lowercase;"/>
{% endif %}
</div>
<div class="field">
<label for="montant_recharge">Somme à recharger (€)</label>
<input id="montant_recharge" type="number" step="any" name="montant_recharge" required="True"/>
<input id="montant_recharge" type="number" name="montant_recharge" required="True"/>
</div>
</div>
<ul class="actions">
@ -155,8 +164,11 @@
<article id="success">
<h2 class="major">Rechargement OK</h2>
<h4>Vous avez bien rechargé la carte {{ numero_carte }}.</h4>
{% if messages %}
{% for message in messages %}
<h2>{{ message }}</h2>
{% endfor %}
{% endif %}
<div class="table-wrapper">
<table>
<thead>
@ -193,9 +205,17 @@
<form method="post" action="#">
{% csrf_token %}
<div class="fields">
<div class="field">
<label for="email">Entrez votre Email</label>
<input id="email" name="email" required="True" type="email"/>
{% if email %}
<label for="email">Vérifiez votre adresse Email</label>
<input type="email" name="email" id="Email" required="True" value="{{ email }}"
style="text-transform: lowercase;"/>
{% else %}
<label for="email">Entrez votre adresse Email</label>
<input type="email" name="email" id="email" required="True"
style="text-transform: lowercase;"/>
{% endif %}
</div>
</div>
<ul class="actions">
@ -247,7 +267,7 @@
{% for tarif in tarifs_adhesion %}
<ul class="actions">
<li><a id="{{ tarif.name | slugify }}" href="#paiementadhesionenligne"
class="button primary field">{{ tarif.name }} {{ tarif.tarif }}€</a></li>
class="button primary field">{{ tarif.name }} {{ tarif.prix }}€</a></li>
</ul>
{% endfor %}
<h4>Payer à l'acceuil de l'association avec un vrai humain :</h4>
@ -260,11 +280,6 @@
<article id="paiementadhesionenligne">
<h2 class="major">Paiement en ligne</h2>
{% if messages %}
{% for message in messages %}
<h3>{{ message }}</h3>
{% endfor %}
{% endif %}
<h3>Adhésion : <span id="text_name_adhesion"></span> <span id="text_tarif_adhesion"></span></h3>
<form method="post" action="#">
{% csrf_token %}
@ -279,6 +294,8 @@
</div>
<div class="field" style="display: none">
<input id="pk_adhesion" type="text" name="pk_adhesion"
required="True"/>
<input id="montant_adhesion" type="number" step="any" name="montant_adhesion"
required="True"/>
</div>
@ -286,7 +303,7 @@
<div class="field">
<h4>Voulez vous recharger votre carte en même temps ? Laissez vide si non.</h4>
<label for="montant_recharge">Recharge cashless (€) :</label>
<input id="montant_recharge" type="number" step="any" name="montant_recharge" />
<input id="montant_recharge" type="number" name="montant_recharge"/>
</div>
</div>
<ul class="actions">
@ -384,9 +401,10 @@
{% for tarif in tarifs_adhesion %}
document.getElementById('{{ tarif.name | slugify }}').onclick = function () {
console.log('{{ tarif.name | slugify }}')
document.getElementById("montant_adhesion").value = "{{ tarif.tarif }}";
document.getElementById("montant_adhesion").value = "{{ tarif.prix }}";
document.getElementById("pk_adhesion").value = "{{ tarif.pk }}";
document.getElementById("text_name_adhesion").textContent = "{{ tarif.name }}";
document.getElementById("text_tarif_adhesion").textContent = "{{ tarif.tarif }}€";
document.getElementById("text_tarif_adhesion").textContent = "{{ tarif.prix }}€";
}
{% endfor %}

View File

@ -7,18 +7,19 @@ from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import render
from django.utils import timezone
from rest_framework.generics import get_object_or_404
import stripe
# Create your views here.
from django.views import View
from rest_framework import status
from BaseBillet.models import Configuration, Article, TarifsAdhesion, LigneArticle
from BaseBillet.models import Configuration, Article, LigneArticle
from PaiementStripe.models import Paiement_stripe
from PaiementStripe.views import creation_checkout_stripe
from QrcodeCashless.models import CarteCashless
from django.db.models.signals import pre_save
from django.dispatch import receiver
import logging
logger = logging.getLogger(__name__)
@ -30,10 +31,19 @@ def get_domain(request):
raise Http404
def check_carte_local(uuid):
carte = get_object_or_404(CarteCashless, uuid=uuid)
# on vérifie toujours que la carte vienne bien du domain et Client tenant.
if carte.detail.origine != connection.tenant:
logger.error(f"{timezone.now()} "
f"check_carte_local {carte.uuid} : "
f"carte detail origine correspond pas : {carte.detail.origine} != {connection.tenant}")
raise Http404
return carte
class gen_one_bisik(View):
def get(self, request, numero_carte):
print(numero_carte)
@ -74,9 +84,6 @@ class index_scan(View):
def get(self, request, uuid):
carte = check_carte_local(uuid)
if carte.detail.origine != connection.tenant:
raise Http404
# dette technique ...
# pour rediriger les premières générations de qrcode
# m.tibillet.re et raffinerie
@ -97,21 +104,19 @@ class index_scan(View):
reponse_server_cashless = self.check_carte_serveur_cashless(carte.uuid)
if reponse_server_cashless.status_code == 200:
json_reponse = json.loads(reponse_server_cashless.json())
liste_assets = json_reponse.get('liste_assets')
email = json_reponse.get('email')
a_jour_cotisation = json_reponse.get('a_jour_cotisation')
if json_reponse.get('history') :
for his in json_reponse.get('history') :
if json_reponse.get('history'):
for his in json_reponse.get('history'):
his['date'] = datetime.fromisoformat(his['date'])
return render(
request,
self.template_name,
{
'tarifs_adhesion': TarifsAdhesion.objects.all(),
'tarifs_adhesion': Article.objects.filter(categorie_article=Article.ADHESION).order_by('-prix'),
'adhesion_obligatoire': configuration.adhesion_obligatoire,
'assets': json_reponse.get('assets'),
'total_monnaie': json_reponse.get('total_monnaie'),
'history': json_reponse.get('history'),
'carte_resto': configuration.carte_restaurant,
'site_web': configuration.site_web,
@ -119,8 +124,11 @@ class index_scan(View):
'numero_carte': carte.number,
'client_name': carte.detail.origine.name,
'domain': sub_addr,
'informations_carte': reponse_server_cashless.text,
'liste_assets': liste_assets,
# 'informations_carte': reponse_server_cashless.text,
'total_monnaie': json_reponse.get('total_monnaie'),
'assets': json_reponse.get('assets'),
'a_jour_cotisation': a_jour_cotisation,
# 'liste_assets': liste_assets,
'email': email,
'billetterie_bool': configuration.activer_billetterie,
}
@ -130,100 +138,70 @@ class index_scan(View):
elif reponse_server_cashless.status_code == 400:
# Carte non trouvée
return HttpResponse('Carte inconnue', status=status.HTTP_400_BAD_REQUEST)
elif reponse_server_cashless.status_code == 403 :
elif reponse_server_cashless.status_code == 403:
# Clé api HS
logger.error(reponse_server_cashless)
return HttpResponse('Forbidden', status=status.HTTP_403_FORBIDDEN)
else :
return HttpResponse(f'{reponse_server_cashless.status_code}', status=reponse_server_cashless.status_code)
else:
return HttpResponse("Serveur non disponible. Merci de revenir ultérieurement.",
status=status.HTTP_503_SERVICE_UNAVAILABLE)
def post(self, request, uuid):
carte = check_carte_local(uuid)
if carte.detail.origine != connection.tenant:
raise Http404
data = request.POST
print(data)
# c'est une recharge
if data.get('montant_recharge') and data.get('email'):
montant_adhesion = data.get('montant_adhesion')
montant_recharge = data.get('montant_recharge')
# c'est un paiement
if (montant_adhesion or montant_recharge) and data.get('email'):
# montant_recharge = data.get('montant_recharge')
montant_recharge = float("{0:.2f}".format(float(data.get('montant_recharge'))))
if montant_recharge > 0:
# reponse_server_cashless = self.check_carte_serveur_cashless(carte.uuid)
# configuration = Configuration.get_solo()
ligne_articles = []
metadata = {}
metadata['recharge_carte_uuid'] = str(carte.uuid)
if montant_recharge:
art, created = Article.objects.get_or_create(
name="Recharge Carte",
prix=1,
publish=False,
categorie_article=Article.RECHARGE_CASHLESS,
)
ligne_article = LigneArticle.objects.create(
article = art,
qty = montant_recharge,
ligne_article_recharge = LigneArticle.objects.create(
article=art,
qty=montant_recharge,
)
ligne_articles.append(ligne_article_recharge)
metadata = {
'recharge_carte_uuid': str(carte.uuid),
'recharge_carte_montant': str(montant_recharge),
}
metadata['recharge_carte_montant'] = str(montant_recharge)
if montant_adhesion:
art_adhesion = Article.objects.get(pk=data.get('pk_adhesion'))
ligne_article_recharge = LigneArticle.objects.create(
article=art_adhesion,
qty=1,
)
ligne_articles.append(ligne_article_recharge)
metadata['pk_adhesion'] = str(art_adhesion.pk)
if len(ligne_articles) > 0:
new_checkout_session = creation_checkout_stripe(
email_paiement = data.get('email'),
liste_ligne_article = [ligne_article,],
metadata = metadata,
absolute_domain = request.build_absolute_uri().partition('/qr')[0],
email_paiement=data.get('email'),
liste_ligne_article=ligne_articles,
metadata=metadata,
absolute_domain=request.build_absolute_uri().partition('/qr')[0],
)
if new_checkout_session.is_valid() :
if new_checkout_session.is_valid():
print(new_checkout_session.checkout_session.stripe_id)
return new_checkout_session.redirect_to_stripe()
# c'est la première étape de l'adhésion
elif data.get('email') \
and not data.get('prenom') \
and not data.get('prenom') \
and not data.get('tel') :
# Email seul sans montant, c'est une adhésion
elif data.get('email'):
sess = requests.Session()
configuration = Configuration.get_solo()
r = sess.post(
f'{configuration.server_cashless}/api/billetterie_qrcode_adhesion',
headers={
'Authorization': f'Api-Key {configuration.key_cashless}'
},
data={
'email': data.get('email'),
'uuid_carte': carte.uuid,
})
sess.close()
# nouveau membre crée avec uniquqment l'email on demande la suite.
if r.status_code in (201, 204) :
messages.success(request, f"{data.get('email')}", extra_tags='email')
return HttpResponseRedirect(f'#demande_nom_prenom_tel')
#partial information :
elif r.status_code == 206:
partial = json.loads(r.text)
messages.success(request, f"{data.get('email')}", extra_tags='email')
if partial.get('name'):
messages.success(request, f"Email déja connu. Name déja connu", extra_tags='name')
if partial.get('prenom'):
messages.success(request, f"Email déja connu. prenom déja connu", extra_tags='prenom')
if partial.get('tel'):
messages.success(request, f"Email déja connu. tel déja connu", extra_tags='tel')
return HttpResponseRedirect(f'#demande_nom_prenom_tel')
else:
messages.error(request, f'Erreur {r.status_code} {r.text}')
return HttpResponseRedirect(f'#erreur')
# suite de l'adhesion
elif data.get('email') and data.get('name') and data.get('prenom') and data.get('tel'):
sess = requests.Session()
configuration = Configuration.get_solo()
r = sess.post(
@ -241,34 +219,65 @@ class index_scan(View):
sess.close()
# nouveau membre crée, on demande la suite.
if r.status_code == 202 :
messages.success(request, f"Merci ! Membre créé et carte liée.")
# nouveau membre crée avec uniquement l'email on demande la suite.
# HTTP_202_ACCEPTED
# HTTP_201_CREATED
if r.status_code in (201, 204):
messages.success(request, f"{data.get('email')}", extra_tags='email')
return HttpResponseRedirect(f'#demande_nom_prenom_tel')
# partial information :
elif r.status_code == 206:
partial = json.loads(r.text)
messages.success(request, f"{data.get('email')}", extra_tags='email')
if partial.get('name'):
messages.success(request, f"Email déja connu. Name déja connu", extra_tags='name')
if partial.get('prenom'):
messages.success(request, f"Email déja connu. prenom déja connu", extra_tags='prenom')
if partial.get('tel'):
messages.success(request, f"Email déja connu. tel déja connu", extra_tags='tel')
return HttpResponseRedirect(f'#demande_nom_prenom_tel')
# nouveau membre crée, on demande la suite.
elif r.status_code == 202:
messages.success(request, f"Carte liée au membre {data.get('email')}")
return HttpResponseRedirect(f'#adhesionsuccess')
else :
else:
messages.error(request, f'Erreur {r.status_code} {r.text}')
return HttpResponseRedirect(f'#erreur')
def postPaimentRecharge(paiementStripe: Paiement_stripe, request):
@receiver(pre_save, sender=Paiement_stripe)
def changement_paid_to_valid(sender, instance: Paiement_stripe, update_fields=None, **kwargs):
# si l'instance vient d'être créé, ne rien faire :
if instance.pk is None:
pass
else:
paiementStripe = instance
if paiementStripe.status == Paiement_stripe.PAID:
# old_instance = Paiement_stripe.objects.get(pk=paiementStripe.pk)
# print(f"on passe de {old_instance.status} à {paiementStripe.status}")
# on passe de non payé -> payé
metadata_db_json = paiementStripe.metadata_stripe
metadata_db = json.loads(metadata_db_json)
uuid_carte = metadata_db.get('recharge_carte_uuid')
total_rechargement = metadata_db.get('recharge_carte_montant')
if uuid_carte and total_rechargement :
# on vérifie toujours que la carte vienne bien du domain et Client tenant.
recharge_carte_montant = metadata_db.get('recharge_carte_montant')
pk_adhesion = metadata_db.get('pk_adhesion')
if recharge_carte_montant or pk_adhesion:
carte = check_carte_local(uuid_carte)
if carte.detail.origine != connection.tenant:
logger.error(f"{timezone.now()} "
f"postPaimentRecharge {uuid_carte} : "
f"carte detail origine correspond pas : {carte.detail.origine} != {connection.tenant}")
raise Http404
data_pour_serveur_cashless = {
'uuid': carte.uuid,
'uuid_commande': paiementStripe.uuid,
}
if recharge_carte_montant:
data_pour_serveur_cashless['recharge_qty'] = float(recharge_carte_montant)
if pk_adhesion :
adhesion = Article.objects.get(pk=pk_adhesion)
data_pour_serveur_cashless['tarif_adhesion'] = adhesion.prix
sess = requests.Session()
configuration = Configuration.get_solo()
@ -277,26 +286,24 @@ def postPaimentRecharge(paiementStripe: Paiement_stripe, request):
headers={
'Authorization': f'Api-Key {configuration.key_cashless}'
},
data={
'uuid': uuid_carte,
'qty': float(total_rechargement),
'uuid_commande': paiementStripe.uuid,
})
data=data_pour_serveur_cashless,
)
sess.close()
logger.info(f"{timezone.now()} demande au serveur cashless pour un rechargement. réponse : {r.status_code} ")
print (f"{timezone.now()} demande au serveur cashless pour un rechargement. réponse : {r.status_code} ")
print(
f"{timezone.now()} demande au serveur cashless pour un rechargement. réponse : {r.status_code} ")
if r.status_code == 200:
# la commande a été envoyé au serveur cashless, on la met en validée
# la commande a été envoyé au serveur cashless et validé.
paiementStripe.status = Paiement_stripe.VALID
paiementStripe.save()
return HttpResponseRedirect(f'#success')
elif paiementStripe.status == Paiement_stripe.VALID:
messages.success(request, f"Le paiement a déja été validé.")
return HttpResponseRedirect(f'#historique')
return HttpResponseRedirect(f'#erreurpaiement')
'''
# return HttpResponseRedirect(f'#success')
#
# elif paiementStripe.status == Paiement_stripe.VALID:
# messages.success(request, f"Le paiement a déja été validé.")
# return HttpResponseRedirect(f'#historique')
#
# return HttpResponseRedirect(f'#erreurpaiement')
'''