mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-10 03:49:24 +00:00
All: Apply Black coding rules
This commit is contained in:
@ -21,4 +21,3 @@
|
||||
# Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
#
|
||||
|
||||
|
@ -10,140 +10,400 @@ from django.conf import settings
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('subscription', '0001_initial'),
|
||||
("subscription", "0001_initial"),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('core', '0001_initial'),
|
||||
('club', '0002_auto_20160824_2152'),
|
||||
("core", "0001_initial"),
|
||||
("club", "0002_auto_20160824_2152"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Counter',
|
||||
name="Counter",
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)),
|
||||
('name', models.CharField(max_length=30, verbose_name='name')),
|
||||
('type', models.CharField(choices=[('BAR', 'Bar'), ('OFFICE', 'Office'), ('EBOUTIC', 'Eboutic')], max_length=255, verbose_name='counter type')),
|
||||
('club', models.ForeignKey(to='club.Club', related_name='counters')),
|
||||
('edit_groups', models.ManyToManyField(to='core.Group', blank=True, related_name='editable_counters')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
("name", models.CharField(max_length=30, verbose_name="name")),
|
||||
(
|
||||
"type",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("BAR", "Bar"),
|
||||
("OFFICE", "Office"),
|
||||
("EBOUTIC", "Eboutic"),
|
||||
],
|
||||
max_length=255,
|
||||
verbose_name="counter type",
|
||||
),
|
||||
),
|
||||
("club", models.ForeignKey(to="club.Club", related_name="counters")),
|
||||
(
|
||||
"edit_groups",
|
||||
models.ManyToManyField(
|
||||
to="core.Group", blank=True, related_name="editable_counters"
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"verbose_name": "counter"},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="Customer",
|
||||
fields=[
|
||||
(
|
||||
"user",
|
||||
models.OneToOneField(
|
||||
primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL
|
||||
),
|
||||
),
|
||||
(
|
||||
"account_id",
|
||||
models.CharField(
|
||||
unique=True, max_length=10, verbose_name="account id"
|
||||
),
|
||||
),
|
||||
(
|
||||
"amount",
|
||||
accounting.models.CurrencyField(
|
||||
decimal_places=2, max_digits=12, verbose_name="amount"
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'counter',
|
||||
"verbose_name": "customer",
|
||||
"ordering": ["account_id"],
|
||||
"verbose_name_plural": "customers",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Customer',
|
||||
name="Permanency",
|
||||
fields=[
|
||||
('user', models.OneToOneField(primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
|
||||
('account_id', models.CharField(unique=True, max_length=10, verbose_name='account id')),
|
||||
('amount', accounting.models.CurrencyField(decimal_places=2, max_digits=12, verbose_name='amount')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
("start", models.DateTimeField(verbose_name="start date")),
|
||||
("end", models.DateTimeField(verbose_name="end date")),
|
||||
(
|
||||
"counter",
|
||||
models.ForeignKey(
|
||||
to="counter.Counter", related_name="permanencies"
|
||||
),
|
||||
),
|
||||
(
|
||||
"user",
|
||||
models.ForeignKey(
|
||||
to=settings.AUTH_USER_MODEL, related_name="permanencies"
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'customer',
|
||||
'ordering': ['account_id'],
|
||||
'verbose_name_plural': 'customers',
|
||||
},
|
||||
options={"verbose_name": "permanency"},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Permanency',
|
||||
name="Product",
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)),
|
||||
('start', models.DateTimeField(verbose_name='start date')),
|
||||
('end', models.DateTimeField(verbose_name='end date')),
|
||||
('counter', models.ForeignKey(to='counter.Counter', related_name='permanencies')),
|
||||
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='permanencies')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
("name", models.CharField(max_length=64, verbose_name="name")),
|
||||
(
|
||||
"description",
|
||||
models.TextField(blank=True, verbose_name="description"),
|
||||
),
|
||||
(
|
||||
"code",
|
||||
models.CharField(max_length=16, blank=True, verbose_name="code"),
|
||||
),
|
||||
(
|
||||
"purchase_price",
|
||||
accounting.models.CurrencyField(
|
||||
decimal_places=2, max_digits=12, verbose_name="purchase price"
|
||||
),
|
||||
),
|
||||
(
|
||||
"selling_price",
|
||||
accounting.models.CurrencyField(
|
||||
decimal_places=2, max_digits=12, verbose_name="selling price"
|
||||
),
|
||||
),
|
||||
(
|
||||
"special_selling_price",
|
||||
accounting.models.CurrencyField(
|
||||
decimal_places=2,
|
||||
max_digits=12,
|
||||
verbose_name="special selling price",
|
||||
),
|
||||
),
|
||||
(
|
||||
"icon",
|
||||
models.ImageField(
|
||||
upload_to="products", null=True, verbose_name="icon", blank=True
|
||||
),
|
||||
),
|
||||
("limit_age", models.IntegerField(default=0, verbose_name="limit age")),
|
||||
("tray", models.BooleanField(verbose_name="tray price", default=False)),
|
||||
(
|
||||
"buying_groups",
|
||||
models.ManyToManyField(
|
||||
related_name="products",
|
||||
to="core.Group",
|
||||
verbose_name="buying groups",
|
||||
),
|
||||
),
|
||||
(
|
||||
"club",
|
||||
models.ForeignKey(
|
||||
verbose_name="club", to="club.Club", related_name="products"
|
||||
),
|
||||
),
|
||||
(
|
||||
"parent_product",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
null=True,
|
||||
related_name="children_products",
|
||||
verbose_name="parent product",
|
||||
to="counter.Product",
|
||||
blank=True,
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'permanency',
|
||||
},
|
||||
options={"verbose_name": "product"},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Product',
|
||||
name="ProductType",
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)),
|
||||
('name', models.CharField(max_length=64, verbose_name='name')),
|
||||
('description', models.TextField(blank=True, verbose_name='description')),
|
||||
('code', models.CharField(max_length=16, blank=True, verbose_name='code')),
|
||||
('purchase_price', accounting.models.CurrencyField(decimal_places=2, max_digits=12, verbose_name='purchase price')),
|
||||
('selling_price', accounting.models.CurrencyField(decimal_places=2, max_digits=12, verbose_name='selling price')),
|
||||
('special_selling_price', accounting.models.CurrencyField(decimal_places=2, max_digits=12, verbose_name='special selling price')),
|
||||
('icon', models.ImageField(upload_to='products', null=True, verbose_name='icon', blank=True)),
|
||||
('limit_age', models.IntegerField(default=0, verbose_name='limit age')),
|
||||
('tray', models.BooleanField(verbose_name='tray price', default=False)),
|
||||
('buying_groups', models.ManyToManyField(related_name='products', to='core.Group', verbose_name='buying groups')),
|
||||
('club', models.ForeignKey(verbose_name='club', to='club.Club', related_name='products')),
|
||||
('parent_product', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, null=True, related_name='children_products', verbose_name='parent product', to='counter.Product', blank=True)),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
("name", models.CharField(max_length=30, verbose_name="name")),
|
||||
(
|
||||
"description",
|
||||
models.TextField(null=True, verbose_name="description", blank=True),
|
||||
),
|
||||
(
|
||||
"icon",
|
||||
models.ImageField(upload_to="products", null=True, blank=True),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'product',
|
||||
},
|
||||
options={"verbose_name": "product type"},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ProductType',
|
||||
name="Refilling",
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)),
|
||||
('name', models.CharField(max_length=30, verbose_name='name')),
|
||||
('description', models.TextField(null=True, verbose_name='description', blank=True)),
|
||||
('icon', models.ImageField(upload_to='products', null=True, blank=True)),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
(
|
||||
"amount",
|
||||
accounting.models.CurrencyField(
|
||||
decimal_places=2, max_digits=12, verbose_name="amount"
|
||||
),
|
||||
),
|
||||
("date", models.DateTimeField(verbose_name="date")),
|
||||
(
|
||||
"payment_method",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("CHECK", "Check"),
|
||||
("CASH", "Cash"),
|
||||
("CARD", "Credit card"),
|
||||
],
|
||||
max_length=255,
|
||||
default="CASH",
|
||||
verbose_name="payment method",
|
||||
),
|
||||
),
|
||||
(
|
||||
"bank",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("OTHER", "Autre"),
|
||||
("SOCIETE-GENERALE", "Société générale"),
|
||||
("BANQUE-POPULAIRE", "Banque populaire"),
|
||||
("BNP", "BNP"),
|
||||
("CAISSE-EPARGNE", "Caisse d'épargne"),
|
||||
("CIC", "CIC"),
|
||||
("CREDIT-AGRICOLE", "Crédit Agricole"),
|
||||
("CREDIT-MUTUEL", "Credit Mutuel"),
|
||||
("CREDIT-LYONNAIS", "Credit Lyonnais"),
|
||||
("LA-POSTE", "La Poste"),
|
||||
],
|
||||
max_length=255,
|
||||
default="OTHER",
|
||||
verbose_name="bank",
|
||||
),
|
||||
),
|
||||
(
|
||||
"is_validated",
|
||||
models.BooleanField(verbose_name="is validated", default=False),
|
||||
),
|
||||
(
|
||||
"counter",
|
||||
models.ForeignKey(to="counter.Counter", related_name="refillings"),
|
||||
),
|
||||
(
|
||||
"customer",
|
||||
models.ForeignKey(to="counter.Customer", related_name="refillings"),
|
||||
),
|
||||
(
|
||||
"operator",
|
||||
models.ForeignKey(
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
related_name="refillings_as_operator",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'product type',
|
||||
},
|
||||
options={"verbose_name": "refilling"},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Refilling',
|
||||
name="Selling",
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)),
|
||||
('amount', accounting.models.CurrencyField(decimal_places=2, max_digits=12, verbose_name='amount')),
|
||||
('date', models.DateTimeField(verbose_name='date')),
|
||||
('payment_method', models.CharField(choices=[('CHECK', 'Check'), ('CASH', 'Cash'), ('CARD', 'Credit card')], max_length=255, default='CASH', verbose_name='payment method')),
|
||||
('bank', models.CharField(choices=[('OTHER', 'Autre'), ('SOCIETE-GENERALE', 'Société générale'), ('BANQUE-POPULAIRE', 'Banque populaire'), ('BNP', 'BNP'), ('CAISSE-EPARGNE', "Caisse d'épargne"), ('CIC', 'CIC'), ('CREDIT-AGRICOLE', 'Crédit Agricole'), ('CREDIT-MUTUEL', 'Credit Mutuel'), ('CREDIT-LYONNAIS', 'Credit Lyonnais'), ('LA-POSTE', 'La Poste')], max_length=255, default='OTHER', verbose_name='bank')),
|
||||
('is_validated', models.BooleanField(verbose_name='is validated', default=False)),
|
||||
('counter', models.ForeignKey(to='counter.Counter', related_name='refillings')),
|
||||
('customer', models.ForeignKey(to='counter.Customer', related_name='refillings')),
|
||||
('operator', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='refillings_as_operator')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
("label", models.CharField(max_length=64, verbose_name="label")),
|
||||
(
|
||||
"unit_price",
|
||||
accounting.models.CurrencyField(
|
||||
decimal_places=2, max_digits=12, verbose_name="unit price"
|
||||
),
|
||||
),
|
||||
("quantity", models.IntegerField(verbose_name="quantity")),
|
||||
("date", models.DateTimeField(verbose_name="date")),
|
||||
(
|
||||
"payment_method",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("SITH_ACCOUNT", "Sith account"),
|
||||
("CARD", "Credit card"),
|
||||
],
|
||||
max_length=255,
|
||||
default="SITH_ACCOUNT",
|
||||
verbose_name="payment method",
|
||||
),
|
||||
),
|
||||
(
|
||||
"is_validated",
|
||||
models.BooleanField(verbose_name="is validated", default=False),
|
||||
),
|
||||
(
|
||||
"club",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
null=True,
|
||||
to="club.Club",
|
||||
related_name="sellings",
|
||||
),
|
||||
),
|
||||
(
|
||||
"counter",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
null=True,
|
||||
to="counter.Counter",
|
||||
related_name="sellings",
|
||||
),
|
||||
),
|
||||
(
|
||||
"customer",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
null=True,
|
||||
to="counter.Customer",
|
||||
related_name="buyings",
|
||||
),
|
||||
),
|
||||
(
|
||||
"product",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
null=True,
|
||||
to="counter.Product",
|
||||
related_name="sellings",
|
||||
blank=True,
|
||||
),
|
||||
),
|
||||
(
|
||||
"seller",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
null=True,
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
related_name="sellings_as_operator",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'refilling',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Selling',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)),
|
||||
('label', models.CharField(max_length=64, verbose_name='label')),
|
||||
('unit_price', accounting.models.CurrencyField(decimal_places=2, max_digits=12, verbose_name='unit price')),
|
||||
('quantity', models.IntegerField(verbose_name='quantity')),
|
||||
('date', models.DateTimeField(verbose_name='date')),
|
||||
('payment_method', models.CharField(choices=[('SITH_ACCOUNT', 'Sith account'), ('CARD', 'Credit card')], max_length=255, default='SITH_ACCOUNT', verbose_name='payment method')),
|
||||
('is_validated', models.BooleanField(verbose_name='is validated', default=False)),
|
||||
('club', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, null=True, to='club.Club', related_name='sellings')),
|
||||
('counter', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, null=True, to='counter.Counter', related_name='sellings')),
|
||||
('customer', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, null=True, to='counter.Customer', related_name='buyings')),
|
||||
('product', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, null=True, to='counter.Product', related_name='sellings', blank=True)),
|
||||
('seller', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, null=True, to=settings.AUTH_USER_MODEL, related_name='sellings_as_operator')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'selling',
|
||||
},
|
||||
options={"verbose_name": "selling"},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='product',
|
||||
name='product_type',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, null=True, related_name='products', verbose_name='product type', to='counter.ProductType', blank=True),
|
||||
model_name="product",
|
||||
name="product_type",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
null=True,
|
||||
related_name="products",
|
||||
verbose_name="product type",
|
||||
to="counter.ProductType",
|
||||
blank=True,
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='counter',
|
||||
name='products',
|
||||
field=models.ManyToManyField(to='counter.Product', blank=True, related_name='counters'),
|
||||
model_name="counter",
|
||||
name="products",
|
||||
field=models.ManyToManyField(
|
||||
to="counter.Product", blank=True, related_name="counters"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='counter',
|
||||
name='sellers',
|
||||
field=models.ManyToManyField(related_name='counters', to='core.User', blank=True, verbose_name='sellers'),
|
||||
model_name="counter",
|
||||
name="sellers",
|
||||
field=models.ManyToManyField(
|
||||
related_name="counters",
|
||||
to="core.User",
|
||||
blank=True,
|
||||
verbose_name="sellers",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='counter',
|
||||
name='view_groups',
|
||||
field=models.ManyToManyField(to='core.Group', blank=True, related_name='viewable_counters'),
|
||||
model_name="counter",
|
||||
name="view_groups",
|
||||
field=models.ManyToManyField(
|
||||
to="core.Group", blank=True, related_name="viewable_counters"
|
||||
),
|
||||
),
|
||||
]
|
||||
|
@ -10,45 +10,94 @@ class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('counter', '0001_initial'),
|
||||
("counter", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CashRegisterSummary',
|
||||
name="CashRegisterSummary",
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
||||
('date', models.DateTimeField(verbose_name='date')),
|
||||
('comment', models.TextField(null=True, verbose_name='comment', blank=True)),
|
||||
('emptied', models.BooleanField(default=False, verbose_name='emptied')),
|
||||
('counter', models.ForeignKey(to='counter.Counter', related_name='cash_summaries', verbose_name='counter')),
|
||||
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='cash_summaries', verbose_name='user')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
verbose_name="ID",
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
("date", models.DateTimeField(verbose_name="date")),
|
||||
(
|
||||
"comment",
|
||||
models.TextField(null=True, verbose_name="comment", blank=True),
|
||||
),
|
||||
("emptied", models.BooleanField(default=False, verbose_name="emptied")),
|
||||
(
|
||||
"counter",
|
||||
models.ForeignKey(
|
||||
to="counter.Counter",
|
||||
related_name="cash_summaries",
|
||||
verbose_name="counter",
|
||||
),
|
||||
),
|
||||
(
|
||||
"user",
|
||||
models.ForeignKey(
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
related_name="cash_summaries",
|
||||
verbose_name="user",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'cash register summary',
|
||||
},
|
||||
options={"verbose_name": "cash register summary"},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CashRegisterSummaryItem',
|
||||
name="CashRegisterSummaryItem",
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
||||
('value', accounting.models.CurrencyField(max_digits=12, verbose_name='value', decimal_places=2)),
|
||||
('quantity', models.IntegerField(default=0, verbose_name='quantity')),
|
||||
('check', models.BooleanField(default=False, verbose_name='check')),
|
||||
('cash_summary', models.ForeignKey(to='counter.CashRegisterSummary', related_name='items', verbose_name='cash summary')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
verbose_name="ID",
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
(
|
||||
"value",
|
||||
accounting.models.CurrencyField(
|
||||
max_digits=12, verbose_name="value", decimal_places=2
|
||||
),
|
||||
),
|
||||
("quantity", models.IntegerField(default=0, verbose_name="quantity")),
|
||||
("check", models.BooleanField(default=False, verbose_name="check")),
|
||||
(
|
||||
"cash_summary",
|
||||
models.ForeignKey(
|
||||
to="counter.CashRegisterSummary",
|
||||
related_name="items",
|
||||
verbose_name="cash summary",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'cash register summary item',
|
||||
},
|
||||
options={"verbose_name": "cash register summary item"},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='permanency',
|
||||
name='counter',
|
||||
field=models.ForeignKey(to='counter.Counter', related_name='permanencies', verbose_name='counter'),
|
||||
model_name="permanency",
|
||||
name="counter",
|
||||
field=models.ForeignKey(
|
||||
to="counter.Counter",
|
||||
related_name="permanencies",
|
||||
verbose_name="counter",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='permanency',
|
||||
name='user',
|
||||
field=models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='permanencies', verbose_name='user'),
|
||||
model_name="permanency",
|
||||
name="user",
|
||||
field=models.ForeignKey(
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
related_name="permanencies",
|
||||
verbose_name="user",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
@ -8,15 +8,17 @@ from django.utils.timezone import utc
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0002_auto_20160826_1342'),
|
||||
]
|
||||
dependencies = [("counter", "0002_auto_20160826_1342")]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='permanency',
|
||||
name='activity',
|
||||
field=models.DateTimeField(verbose_name='activity time', auto_now=True, default=datetime.datetime(2016, 8, 26, 17, 5, 31, 202824, tzinfo=utc)),
|
||||
model_name="permanency",
|
||||
name="activity",
|
||||
field=models.DateTimeField(
|
||||
verbose_name="activity time",
|
||||
auto_now=True,
|
||||
default=datetime.datetime(2016, 8, 26, 17, 5, 31, 202824, tzinfo=utc),
|
||||
),
|
||||
preserve_default=False,
|
||||
),
|
||||
)
|
||||
]
|
||||
|
@ -6,14 +6,12 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0003_permanency_activity'),
|
||||
]
|
||||
dependencies = [("counter", "0003_permanency_activity")]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='permanency',
|
||||
name='end',
|
||||
field=models.DateTimeField(verbose_name='end date', null=True),
|
||||
),
|
||||
model_name="permanency",
|
||||
name="end",
|
||||
field=models.DateTimeField(verbose_name="end date", null=True),
|
||||
)
|
||||
]
|
||||
|
@ -6,24 +6,31 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0004_auto_20160826_1907'),
|
||||
]
|
||||
dependencies = [("counter", "0004_auto_20160826_1907")]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='counter',
|
||||
name='club',
|
||||
field=models.ForeignKey(verbose_name='club', to='club.Club', related_name='counters'),
|
||||
model_name="counter",
|
||||
name="club",
|
||||
field=models.ForeignKey(
|
||||
verbose_name="club", to="club.Club", related_name="counters"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='counter',
|
||||
name='products',
|
||||
field=models.ManyToManyField(blank=True, related_name='counters', to='counter.Product', verbose_name='products'),
|
||||
model_name="counter",
|
||||
name="products",
|
||||
field=models.ManyToManyField(
|
||||
blank=True,
|
||||
related_name="counters",
|
||||
to="counter.Product",
|
||||
verbose_name="products",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='permanency',
|
||||
name='activity',
|
||||
field=models.DateTimeField(auto_now=True, verbose_name='last activity date'),
|
||||
model_name="permanency",
|
||||
name="activity",
|
||||
field=models.DateTimeField(
|
||||
auto_now=True, verbose_name="last activity date"
|
||||
),
|
||||
),
|
||||
]
|
||||
|
@ -6,14 +6,17 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0005_auto_20160826_2330'),
|
||||
]
|
||||
dependencies = [("counter", "0005_auto_20160826_2330")]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='product',
|
||||
name='buying_groups',
|
||||
field=models.ManyToManyField(related_name='products', verbose_name='buying groups', blank=True, to='core.Group'),
|
||||
),
|
||||
model_name="product",
|
||||
name="buying_groups",
|
||||
field=models.ManyToManyField(
|
||||
related_name="products",
|
||||
verbose_name="buying groups",
|
||||
blank=True,
|
||||
to="core.Group",
|
||||
),
|
||||
)
|
||||
]
|
||||
|
@ -6,14 +6,12 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0006_auto_20160831_1304'),
|
||||
]
|
||||
dependencies = [("counter", "0006_auto_20160831_1304")]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='product',
|
||||
name='archived',
|
||||
field=models.BooleanField(verbose_name='archived', default=False),
|
||||
),
|
||||
model_name="product",
|
||||
name="archived",
|
||||
field=models.BooleanField(verbose_name="archived", default=False),
|
||||
)
|
||||
]
|
||||
|
@ -6,14 +6,14 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0007_product_archived'),
|
||||
]
|
||||
dependencies = [("counter", "0007_product_archived")]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='counter',
|
||||
name='token',
|
||||
field=models.CharField(blank=True, max_length=30, verbose_name='token', null=True),
|
||||
),
|
||||
model_name="counter",
|
||||
name="token",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=30, verbose_name="token", null=True
|
||||
),
|
||||
)
|
||||
]
|
||||
|
@ -6,18 +6,37 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0008_counter_token'),
|
||||
]
|
||||
dependencies = [("counter", "0008_counter_token")]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Eticket',
|
||||
name="Eticket",
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
|
||||
('banner', models.ImageField(null=True, upload_to='etickets', blank=True)),
|
||||
('secret', models.CharField(unique=True, verbose_name='secret', max_length=64)),
|
||||
('product', models.OneToOneField(verbose_name='product', related_name='eticket', to='counter.Product')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
),
|
||||
),
|
||||
(
|
||||
"banner",
|
||||
models.ImageField(null=True, upload_to="etickets", blank=True),
|
||||
),
|
||||
(
|
||||
"secret",
|
||||
models.CharField(unique=True, verbose_name="secret", max_length=64),
|
||||
),
|
||||
(
|
||||
"product",
|
||||
models.OneToOneField(
|
||||
verbose_name="product",
|
||||
related_name="eticket",
|
||||
to="counter.Product",
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
]
|
||||
|
@ -6,19 +6,19 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0009_eticket'),
|
||||
]
|
||||
dependencies = [("counter", "0009_eticket")]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='eticket',
|
||||
name='event_date',
|
||||
field=models.DateField(blank=True, verbose_name='event date', null=True),
|
||||
model_name="eticket",
|
||||
name="event_date",
|
||||
field=models.DateField(blank=True, verbose_name="event date", null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='eticket',
|
||||
name='event_title',
|
||||
field=models.CharField(blank=True, max_length=64, verbose_name='event title', null=True),
|
||||
model_name="eticket",
|
||||
name="event_title",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=64, verbose_name="event title", null=True
|
||||
),
|
||||
),
|
||||
]
|
||||
|
@ -6,14 +6,14 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0010_auto_20161003_1900'),
|
||||
]
|
||||
dependencies = [("counter", "0010_auto_20161003_1900")]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='eticket',
|
||||
name='banner',
|
||||
field=models.ImageField(null=True, verbose_name='banner', blank=True, upload_to='etickets'),
|
||||
),
|
||||
model_name="eticket",
|
||||
name="banner",
|
||||
field=models.ImageField(
|
||||
null=True, verbose_name="banner", blank=True, upload_to="etickets"
|
||||
),
|
||||
)
|
||||
]
|
||||
|
@ -6,14 +6,14 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0011_auto_20161004_2039'),
|
||||
]
|
||||
dependencies = [("counter", "0011_auto_20161004_2039")]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='permanency',
|
||||
name='end',
|
||||
field=models.DateTimeField(db_index=True, verbose_name='end date', null=True),
|
||||
),
|
||||
model_name="permanency",
|
||||
name="end",
|
||||
field=models.DateTimeField(
|
||||
db_index=True, verbose_name="end date", null=True
|
||||
),
|
||||
)
|
||||
]
|
||||
|
@ -12,7 +12,9 @@ from counter.models import Customer, Product, Selling, Counter
|
||||
def balance_ecocups(apps, schema_editor):
|
||||
for customer in Customer.objects.all():
|
||||
customer.recorded_products = 0
|
||||
for selling in customer.buyings.filter(product__id__in=[settings.SITH_ECOCUP_CONS, settings.SITH_ECOCUP_DECO]).all():
|
||||
for selling in customer.buyings.filter(
|
||||
product__id__in=[settings.SITH_ECOCUP_CONS, settings.SITH_ECOCUP_DECO]
|
||||
).all():
|
||||
if selling.product.is_record_product:
|
||||
customer.recorded_products += selling.quantity
|
||||
elif selling.product.is_unrecord_product:
|
||||
@ -20,24 +22,29 @@ def balance_ecocups(apps, schema_editor):
|
||||
if customer.recorded_products < -settings.SITH_ECOCUP_LIMIT:
|
||||
qt = -(customer.recorded_products + settings.SITH_ECOCUP_LIMIT)
|
||||
cons = Product.objects.get(id=settings.SITH_ECOCUP_CONS)
|
||||
Selling(label=_("Ecocup regularization"), product=cons, unit_price=cons.selling_price,
|
||||
club=cons.club, counter=Counter.objects.filter(name='Foyer').first(),
|
||||
quantity=qt, seller=User.objects.get(id=0), customer=customer).save(allow_negative=True)
|
||||
Selling(
|
||||
label=_("Ecocup regularization"),
|
||||
product=cons,
|
||||
unit_price=cons.selling_price,
|
||||
club=cons.club,
|
||||
counter=Counter.objects.filter(name="Foyer").first(),
|
||||
quantity=qt,
|
||||
seller=User.objects.get(id=0),
|
||||
customer=customer,
|
||||
).save(allow_negative=True)
|
||||
customer.recorded_products += qt
|
||||
customer.save()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0012_auto_20170515_2202'),
|
||||
]
|
||||
dependencies = [("counter", "0012_auto_20170515_2202")]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='customer',
|
||||
name='recorded_products',
|
||||
field=models.IntegerField(verbose_name='recorded items', default=0),
|
||||
model_name="customer",
|
||||
name="recorded_products",
|
||||
field=models.IntegerField(verbose_name="recorded items", default=0),
|
||||
),
|
||||
migrations.RunPython(balance_ecocups),
|
||||
]
|
||||
|
@ -6,14 +6,12 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0013_customer_recorded_products'),
|
||||
]
|
||||
dependencies = [("counter", "0013_customer_recorded_products")]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='customer',
|
||||
name='recorded_products',
|
||||
field=models.IntegerField(default=0, verbose_name='recorded product'),
|
||||
),
|
||||
model_name="customer",
|
||||
name="recorded_products",
|
||||
field=models.IntegerField(default=0, verbose_name="recorded product"),
|
||||
)
|
||||
]
|
||||
|
@ -6,14 +6,12 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0013_customer_recorded_products'),
|
||||
]
|
||||
dependencies = [("counter", "0013_customer_recorded_products")]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='customer',
|
||||
name='recorded_products',
|
||||
field=models.IntegerField(verbose_name='recorded product', default=0),
|
||||
),
|
||||
model_name="customer",
|
||||
name="recorded_products",
|
||||
field=models.IntegerField(verbose_name="recorded product", default=0),
|
||||
)
|
||||
]
|
||||
|
@ -7,9 +7,8 @@ from django.db import migrations, models
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0014_auto_20170817_1537'),
|
||||
('counter', '0014_auto_20170816_1521'),
|
||||
("counter", "0014_auto_20170817_1537"),
|
||||
("counter", "0014_auto_20170816_1521"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
]
|
||||
operations = []
|
||||
|
@ -6,14 +6,12 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counter', '0015_merge'),
|
||||
]
|
||||
dependencies = [("counter", "0015_merge")]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='producttype',
|
||||
name='comment',
|
||||
field=models.TextField(verbose_name='comment', blank=True, null=True),
|
||||
),
|
||||
model_name="producttype",
|
||||
name="comment",
|
||||
field=models.TextField(verbose_name="comment", blank=True, null=True),
|
||||
)
|
||||
]
|
||||
|
@ -48,15 +48,16 @@ class Customer(models.Model):
|
||||
This class extends a user to make a customer. It adds some basic customers informations, such as the accound ID, and
|
||||
is used by other accounting classes as reference to the customer, rather than using User
|
||||
"""
|
||||
|
||||
user = models.OneToOneField(User, primary_key=True)
|
||||
account_id = models.CharField(_('account id'), max_length=10, unique=True)
|
||||
amount = CurrencyField(_('amount'))
|
||||
recorded_products = models.IntegerField(_('recorded product'), default=0)
|
||||
account_id = models.CharField(_("account id"), max_length=10, unique=True)
|
||||
amount = CurrencyField(_("amount"))
|
||||
recorded_products = models.IntegerField(_("recorded product"), default=0)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('customer')
|
||||
verbose_name_plural = _('customers')
|
||||
ordering = ['account_id', ]
|
||||
verbose_name = _("customer")
|
||||
verbose_name_plural = _("customers")
|
||||
ordering = ["account_id"]
|
||||
|
||||
def __str__(self):
|
||||
return "%s - %s" % (self.user.username, self.account_id)
|
||||
@ -70,8 +71,12 @@ class Customer(models.Model):
|
||||
|
||||
@property
|
||||
def can_buy(self):
|
||||
return (self.user.subscriptions.last() and
|
||||
(date.today() - self.user.subscriptions.order_by('subscription_end').last().subscription_end) < timedelta(days=90))
|
||||
return self.user.subscriptions.last() and (
|
||||
date.today()
|
||||
- self.user.subscriptions.order_by("subscription_end")
|
||||
.last()
|
||||
.subscription_end
|
||||
) < timedelta(days=90)
|
||||
|
||||
def generate_account_id(number):
|
||||
number = str(number)
|
||||
@ -99,10 +104,10 @@ class Customer(models.Model):
|
||||
self.save()
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('core:user_account', kwargs={'user_id': self.user.pk})
|
||||
return reverse("core:user_account", kwargs={"user_id": self.user.pk})
|
||||
|
||||
def get_full_url(self):
|
||||
return ''.join(['https://', settings.SITH_URL, self.get_absolute_url()])
|
||||
return "".join(["https://", settings.SITH_URL, self.get_absolute_url()])
|
||||
|
||||
|
||||
class ProductType(models.Model):
|
||||
@ -110,13 +115,14 @@ class ProductType(models.Model):
|
||||
This describes a product type
|
||||
Useful only for categorizing, changes are made at the product level for now
|
||||
"""
|
||||
name = models.CharField(_('name'), max_length=30)
|
||||
description = models.TextField(_('description'), null=True, blank=True)
|
||||
comment = models.TextField(_('comment'), null=True, blank=True)
|
||||
icon = models.ImageField(upload_to='products', null=True, blank=True)
|
||||
|
||||
name = models.CharField(_("name"), max_length=30)
|
||||
description = models.TextField(_("description"), null=True, blank=True)
|
||||
comment = models.TextField(_("comment"), null=True, blank=True)
|
||||
icon = models.ImageField(upload_to="products", null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('product type')
|
||||
verbose_name = _("product type")
|
||||
|
||||
def is_owned_by(self, user):
|
||||
"""
|
||||
@ -130,32 +136,49 @@ class ProductType(models.Model):
|
||||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('counter:producttype_list')
|
||||
return reverse("counter:producttype_list")
|
||||
|
||||
|
||||
class Product(models.Model):
|
||||
"""
|
||||
This describes a product, with all its related informations
|
||||
"""
|
||||
name = models.CharField(_('name'), max_length=64)
|
||||
description = models.TextField(_('description'), blank=True)
|
||||
product_type = models.ForeignKey(ProductType, related_name='products', verbose_name=_("product type"), null=True, blank=True,
|
||||
on_delete=models.SET_NULL)
|
||||
code = models.CharField(_('code'), max_length=16, blank=True)
|
||||
purchase_price = CurrencyField(_('purchase price'))
|
||||
selling_price = CurrencyField(_('selling price'))
|
||||
special_selling_price = CurrencyField(_('special selling price'))
|
||||
icon = models.ImageField(upload_to='products', null=True, blank=True, verbose_name=_("icon"))
|
||||
|
||||
name = models.CharField(_("name"), max_length=64)
|
||||
description = models.TextField(_("description"), blank=True)
|
||||
product_type = models.ForeignKey(
|
||||
ProductType,
|
||||
related_name="products",
|
||||
verbose_name=_("product type"),
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
code = models.CharField(_("code"), max_length=16, blank=True)
|
||||
purchase_price = CurrencyField(_("purchase price"))
|
||||
selling_price = CurrencyField(_("selling price"))
|
||||
special_selling_price = CurrencyField(_("special selling price"))
|
||||
icon = models.ImageField(
|
||||
upload_to="products", null=True, blank=True, verbose_name=_("icon")
|
||||
)
|
||||
club = models.ForeignKey(Club, related_name="products", verbose_name=_("club"))
|
||||
limit_age = models.IntegerField(_('limit age'), default=0)
|
||||
tray = models.BooleanField(_('tray price'), default=False)
|
||||
parent_product = models.ForeignKey('self', related_name='children_products', verbose_name=_("parent product"), null=True,
|
||||
blank=True, on_delete=models.SET_NULL)
|
||||
buying_groups = models.ManyToManyField(Group, related_name='products', verbose_name=_("buying groups"), blank=True)
|
||||
limit_age = models.IntegerField(_("limit age"), default=0)
|
||||
tray = models.BooleanField(_("tray price"), default=False)
|
||||
parent_product = models.ForeignKey(
|
||||
"self",
|
||||
related_name="children_products",
|
||||
verbose_name=_("parent product"),
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
buying_groups = models.ManyToManyField(
|
||||
Group, related_name="products", verbose_name=_("buying groups"), blank=True
|
||||
)
|
||||
archived = models.BooleanField(_("archived"), default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('product')
|
||||
verbose_name = _("product")
|
||||
|
||||
@property
|
||||
def is_record_product(self):
|
||||
@ -169,7 +192,9 @@ class Product(models.Model):
|
||||
"""
|
||||
Method to see if that object can be edited by the given user
|
||||
"""
|
||||
if user.is_in_group(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) or user.is_in_group(settings.SITH_GROUP_COUNTER_ADMIN_ID):
|
||||
if user.is_in_group(
|
||||
settings.SITH_GROUP_ACCOUNTING_ADMIN_ID
|
||||
) or user.is_in_group(settings.SITH_GROUP_COUNTER_ADMIN_ID):
|
||||
return True
|
||||
return False
|
||||
|
||||
@ -177,27 +202,39 @@ class Product(models.Model):
|
||||
return "%s (%s)" % (self.name, self.code)
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('counter:product_list')
|
||||
return reverse("counter:product_list")
|
||||
|
||||
|
||||
class Counter(models.Model):
|
||||
name = models.CharField(_('name'), max_length=30)
|
||||
name = models.CharField(_("name"), max_length=30)
|
||||
club = models.ForeignKey(Club, related_name="counters", verbose_name=_("club"))
|
||||
products = models.ManyToManyField(Product, related_name="counters", verbose_name=_("products"), blank=True)
|
||||
type = models.CharField(_('counter type'),
|
||||
max_length=255,
|
||||
choices=[('BAR', _('Bar')), ('OFFICE', _('Office')), ('EBOUTIC', _('Eboutic'))])
|
||||
sellers = models.ManyToManyField(User, verbose_name=_('sellers'), related_name='counters', blank=True)
|
||||
edit_groups = models.ManyToManyField(Group, related_name="editable_counters", blank=True)
|
||||
view_groups = models.ManyToManyField(Group, related_name="viewable_counters", blank=True)
|
||||
token = models.CharField(_('token'), max_length=30, null=True, blank=True)
|
||||
products = models.ManyToManyField(
|
||||
Product, related_name="counters", verbose_name=_("products"), blank=True
|
||||
)
|
||||
type = models.CharField(
|
||||
_("counter type"),
|
||||
max_length=255,
|
||||
choices=[("BAR", _("Bar")), ("OFFICE", _("Office")), ("EBOUTIC", _("Eboutic"))],
|
||||
)
|
||||
sellers = models.ManyToManyField(
|
||||
User, verbose_name=_("sellers"), related_name="counters", blank=True
|
||||
)
|
||||
edit_groups = models.ManyToManyField(
|
||||
Group, related_name="editable_counters", blank=True
|
||||
)
|
||||
view_groups = models.ManyToManyField(
|
||||
Group, related_name="viewable_counters", blank=True
|
||||
)
|
||||
token = models.CharField(_("token"), max_length=30, null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('counter')
|
||||
verbose_name = _("counter")
|
||||
|
||||
def __getattribute__(self, name):
|
||||
if name == "edit_groups":
|
||||
return Group.objects.filter(name=self.club.unix_name + settings.SITH_BOARD_SUFFIX).all()
|
||||
return Group.objects.filter(
|
||||
name=self.club.unix_name + settings.SITH_BOARD_SUFFIX
|
||||
).all()
|
||||
return object.__getattribute__(self, name)
|
||||
|
||||
def __str__(self):
|
||||
@ -205,8 +242,8 @@ class Counter(models.Model):
|
||||
|
||||
def get_absolute_url(self):
|
||||
if self.type == "EBOUTIC":
|
||||
return reverse('eboutic:main')
|
||||
return reverse('counter:details', kwargs={'counter_id': self.id})
|
||||
return reverse("eboutic:main")
|
||||
return reverse("counter:details", kwargs={"counter_id": self.id})
|
||||
|
||||
def is_owned_by(self, user):
|
||||
mem = self.club.get_membership_for(user)
|
||||
@ -217,11 +254,16 @@ class Counter(models.Model):
|
||||
def can_be_viewed_by(self, user):
|
||||
if self.type == "BAR":
|
||||
return True
|
||||
return user.is_in_group(settings.SITH_MAIN_BOARD_GROUP) or user in self.sellers.all()
|
||||
return (
|
||||
user.is_in_group(settings.SITH_MAIN_BOARD_GROUP)
|
||||
or user in self.sellers.all()
|
||||
)
|
||||
|
||||
def gen_token(self):
|
||||
"""Generate a new token for this counter"""
|
||||
self.token = ''.join(random.choice(string.ascii_letters + string.digits) for x in range(30))
|
||||
self.token = "".join(
|
||||
random.choice(string.ascii_letters + string.digits) for x in range(30)
|
||||
)
|
||||
self.save()
|
||||
|
||||
def add_barman(self, user):
|
||||
@ -253,7 +295,9 @@ class Counter(models.Model):
|
||||
pl = Permanency.objects.filter(counter=self, end=None).all()
|
||||
bl = []
|
||||
for p in pl:
|
||||
if timezone.now() - p.activity < timedelta(minutes=settings.SITH_BARMAN_TIMEOUT):
|
||||
if timezone.now() - p.activity < timedelta(
|
||||
minutes=settings.SITH_BARMAN_TIMEOUT
|
||||
):
|
||||
bl.append(p.user)
|
||||
else:
|
||||
p.end = p.activity
|
||||
@ -281,7 +325,10 @@ class Counter(models.Model):
|
||||
"""
|
||||
Returns True if the counter self is inactive from SITH_COUNTER_MINUTE_INACTIVE's value minutes, else False
|
||||
"""
|
||||
return self.is_open() and ((timezone.now() - self.permanencies.order_by('-activity').first().activity) > datetime.timedelta(minutes=settings.SITH_COUNTER_MINUTE_INACTIVE))
|
||||
return self.is_open() and (
|
||||
(timezone.now() - self.permanencies.order_by("-activity").first().activity)
|
||||
> datetime.timedelta(minutes=settings.SITH_COUNTER_MINUTE_INACTIVE)
|
||||
)
|
||||
|
||||
def barman_list(self):
|
||||
"""
|
||||
@ -294,22 +341,33 @@ class Refilling(models.Model):
|
||||
"""
|
||||
Handle the refilling
|
||||
"""
|
||||
|
||||
counter = models.ForeignKey(Counter, related_name="refillings", blank=False)
|
||||
amount = CurrencyField(_('amount'))
|
||||
operator = models.ForeignKey(User, related_name="refillings_as_operator", blank=False)
|
||||
amount = CurrencyField(_("amount"))
|
||||
operator = models.ForeignKey(
|
||||
User, related_name="refillings_as_operator", blank=False
|
||||
)
|
||||
customer = models.ForeignKey(Customer, related_name="refillings", blank=False)
|
||||
date = models.DateTimeField(_('date'))
|
||||
payment_method = models.CharField(_('payment method'), max_length=255,
|
||||
choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='CASH')
|
||||
bank = models.CharField(_('bank'), max_length=255,
|
||||
choices=settings.SITH_COUNTER_BANK, default='OTHER')
|
||||
is_validated = models.BooleanField(_('is validated'), default=False)
|
||||
date = models.DateTimeField(_("date"))
|
||||
payment_method = models.CharField(
|
||||
_("payment method"),
|
||||
max_length=255,
|
||||
choices=settings.SITH_COUNTER_PAYMENT_METHOD,
|
||||
default="CASH",
|
||||
)
|
||||
bank = models.CharField(
|
||||
_("bank"), max_length=255, choices=settings.SITH_COUNTER_BANK, default="OTHER"
|
||||
)
|
||||
is_validated = models.BooleanField(_("is validated"), default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("refilling")
|
||||
|
||||
def __str__(self):
|
||||
return "Refilling: %.2f for %s" % (self.amount, self.customer.user.get_display_name())
|
||||
return "Refilling: %.2f for %s" % (
|
||||
self.amount,
|
||||
self.customer.user.get_display_name(),
|
||||
)
|
||||
|
||||
def is_owned_by(self, user):
|
||||
return user.is_owner(self.counter) and self.payment_method != "CARD"
|
||||
@ -328,11 +386,19 @@ class Refilling(models.Model):
|
||||
self.customer.save()
|
||||
self.is_validated = True
|
||||
if self.customer.user.preferences.notify_on_refill:
|
||||
Notification(user=self.customer.user, url=reverse('core:user_account_detail',
|
||||
kwargs={'user_id': self.customer.user.id, 'year': self.date.year, 'month': self.date.month}),
|
||||
param=str(self.amount),
|
||||
type="REFILLING",
|
||||
).save()
|
||||
Notification(
|
||||
user=self.customer.user,
|
||||
url=reverse(
|
||||
"core:user_account_detail",
|
||||
kwargs={
|
||||
"user_id": self.customer.user.id,
|
||||
"year": self.date.year,
|
||||
"month": self.date.month,
|
||||
},
|
||||
),
|
||||
param=str(self.amount),
|
||||
type="REFILLING",
|
||||
).save()
|
||||
super(Refilling, self).save(*args, **kwargs)
|
||||
|
||||
|
||||
@ -340,25 +406,60 @@ class Selling(models.Model):
|
||||
"""
|
||||
Handle the sellings
|
||||
"""
|
||||
|
||||
label = models.CharField(_("label"), max_length=64)
|
||||
product = models.ForeignKey(Product, related_name="sellings", null=True, blank=True, on_delete=models.SET_NULL)
|
||||
counter = models.ForeignKey(Counter, related_name="sellings", null=True, blank=False, on_delete=models.SET_NULL)
|
||||
club = models.ForeignKey(Club, related_name="sellings", null=True, blank=False, on_delete=models.SET_NULL)
|
||||
unit_price = CurrencyField(_('unit price'))
|
||||
quantity = models.IntegerField(_('quantity'))
|
||||
seller = models.ForeignKey(User, related_name="sellings_as_operator", null=True, blank=False, on_delete=models.SET_NULL)
|
||||
customer = models.ForeignKey(Customer, related_name="buyings", null=True, blank=False, on_delete=models.SET_NULL)
|
||||
date = models.DateTimeField(_('date'))
|
||||
payment_method = models.CharField(_('payment method'), max_length=255,
|
||||
choices=[('SITH_ACCOUNT', _('Sith account')), ('CARD', _('Credit card'))], default='SITH_ACCOUNT')
|
||||
is_validated = models.BooleanField(_('is validated'), default=False)
|
||||
product = models.ForeignKey(
|
||||
Product,
|
||||
related_name="sellings",
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
counter = models.ForeignKey(
|
||||
Counter,
|
||||
related_name="sellings",
|
||||
null=True,
|
||||
blank=False,
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
club = models.ForeignKey(
|
||||
Club, related_name="sellings", null=True, blank=False, on_delete=models.SET_NULL
|
||||
)
|
||||
unit_price = CurrencyField(_("unit price"))
|
||||
quantity = models.IntegerField(_("quantity"))
|
||||
seller = models.ForeignKey(
|
||||
User,
|
||||
related_name="sellings_as_operator",
|
||||
null=True,
|
||||
blank=False,
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
customer = models.ForeignKey(
|
||||
Customer,
|
||||
related_name="buyings",
|
||||
null=True,
|
||||
blank=False,
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
date = models.DateTimeField(_("date"))
|
||||
payment_method = models.CharField(
|
||||
_("payment method"),
|
||||
max_length=255,
|
||||
choices=[("SITH_ACCOUNT", _("Sith account")), ("CARD", _("Credit card"))],
|
||||
default="SITH_ACCOUNT",
|
||||
)
|
||||
is_validated = models.BooleanField(_("is validated"), default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("selling")
|
||||
|
||||
def __str__(self):
|
||||
return "Selling: %d x %s (%f) for %s" % (self.quantity, self.label,
|
||||
self.quantity * self.unit_price, self.customer.user.get_display_name())
|
||||
return "Selling: %d x %s (%f) for %s" % (
|
||||
self.quantity,
|
||||
self.label,
|
||||
self.quantity * self.unit_price,
|
||||
self.customer.user.get_display_name(),
|
||||
)
|
||||
|
||||
def is_owned_by(self, user):
|
||||
return user.is_owner(self.counter) and self.payment_method != "CARD"
|
||||
@ -374,30 +475,25 @@ class Selling(models.Model):
|
||||
|
||||
def send_mail_customer(self):
|
||||
event = self.product.eticket.event_title or _("Unknown event")
|
||||
subject = _('Eticket bought for the event %(event)s') % {'event': event}
|
||||
subject = _("Eticket bought for the event %(event)s") % {"event": event}
|
||||
message_html = _(
|
||||
"You bought an eticket for the event %(event)s.\nYou can download it on this page %(url)s."
|
||||
) % {
|
||||
'event': event,
|
||||
'url': ''.join((
|
||||
'<a href="',
|
||||
self.customer.get_full_url(),
|
||||
'">',
|
||||
self.customer.get_full_url(),
|
||||
'</a>'
|
||||
))
|
||||
"event": event,
|
||||
"url": "".join(
|
||||
(
|
||||
'<a href="',
|
||||
self.customer.get_full_url(),
|
||||
'">',
|
||||
self.customer.get_full_url(),
|
||||
"</a>",
|
||||
)
|
||||
),
|
||||
}
|
||||
message_txt = _(
|
||||
"You bought an eticket for the event %(event)s.\nYou can download it on this page %(url)s."
|
||||
) % {
|
||||
'event': event,
|
||||
'url': self.customer.get_full_url(),
|
||||
}
|
||||
self.customer.user.email_user(
|
||||
subject,
|
||||
message_txt,
|
||||
html_message=message_html
|
||||
)
|
||||
) % {"event": event, "url": self.customer.get_full_url()}
|
||||
self.customer.user.email_user(subject, message_txt, html_message=message_html)
|
||||
|
||||
def save(self, allow_negative=False, *args, **kwargs):
|
||||
"""
|
||||
@ -412,34 +508,52 @@ class Selling(models.Model):
|
||||
self.is_validated = True
|
||||
u = User.objects.filter(id=self.customer.user.id).first()
|
||||
if u.was_subscribed:
|
||||
if self.product and self.product.id == settings.SITH_PRODUCT_SUBSCRIPTION_ONE_SEMESTER:
|
||||
if (
|
||||
self.product
|
||||
and self.product.id == settings.SITH_PRODUCT_SUBSCRIPTION_ONE_SEMESTER
|
||||
):
|
||||
sub = Subscription(
|
||||
member=u,
|
||||
subscription_type='un-semestre',
|
||||
subscription_type="un-semestre",
|
||||
payment_method="EBOUTIC",
|
||||
location="EBOUTIC",
|
||||
)
|
||||
sub.subscription_start = Subscription.compute_start()
|
||||
sub.subscription_start = Subscription.compute_start(
|
||||
duration=settings.SITH_SUBSCRIPTIONS[sub.subscription_type]['duration'])
|
||||
duration=settings.SITH_SUBSCRIPTIONS[sub.subscription_type][
|
||||
"duration"
|
||||
]
|
||||
)
|
||||
sub.subscription_end = Subscription.compute_end(
|
||||
duration=settings.SITH_SUBSCRIPTIONS[sub.subscription_type]['duration'],
|
||||
start=sub.subscription_start)
|
||||
duration=settings.SITH_SUBSCRIPTIONS[sub.subscription_type][
|
||||
"duration"
|
||||
],
|
||||
start=sub.subscription_start,
|
||||
)
|
||||
sub.save()
|
||||
elif self.product and self.product.id == settings.SITH_PRODUCT_SUBSCRIPTION_TWO_SEMESTERS:
|
||||
elif (
|
||||
self.product
|
||||
and self.product.id == settings.SITH_PRODUCT_SUBSCRIPTION_TWO_SEMESTERS
|
||||
):
|
||||
u = User.objects.filter(id=self.customer.user.id).first()
|
||||
sub = Subscription(
|
||||
member=u,
|
||||
subscription_type='deux-semestres',
|
||||
subscription_type="deux-semestres",
|
||||
payment_method="EBOUTIC",
|
||||
location="EBOUTIC",
|
||||
)
|
||||
sub.subscription_start = Subscription.compute_start()
|
||||
sub.subscription_start = Subscription.compute_start(
|
||||
duration=settings.SITH_SUBSCRIPTIONS[sub.subscription_type]['duration'])
|
||||
duration=settings.SITH_SUBSCRIPTIONS[sub.subscription_type][
|
||||
"duration"
|
||||
]
|
||||
)
|
||||
sub.subscription_end = Subscription.compute_end(
|
||||
duration=settings.SITH_SUBSCRIPTIONS[sub.subscription_type]['duration'],
|
||||
start=sub.subscription_start)
|
||||
duration=settings.SITH_SUBSCRIPTIONS[sub.subscription_type][
|
||||
"duration"
|
||||
],
|
||||
start=sub.subscription_start,
|
||||
)
|
||||
sub.save()
|
||||
try:
|
||||
if self.product.eticket:
|
||||
@ -449,8 +563,14 @@ class Selling(models.Model):
|
||||
if self.customer.user.preferences.notify_on_click:
|
||||
Notification(
|
||||
user=self.customer.user,
|
||||
url=reverse('core:user_account_detail',
|
||||
kwargs={'user_id': self.customer.user.id, 'year': self.date.year, 'month': self.date.month}),
|
||||
url=reverse(
|
||||
"core:user_account_detail",
|
||||
kwargs={
|
||||
"user_id": self.customer.user.id,
|
||||
"year": self.date.year,
|
||||
"month": self.date.month,
|
||||
},
|
||||
),
|
||||
param="%d x %s" % (self.quantity, self.label),
|
||||
type="SELLING",
|
||||
).save()
|
||||
@ -461,29 +581,38 @@ class Permanency(models.Model):
|
||||
"""
|
||||
This class aims at storing a traceability of who was barman where and when
|
||||
"""
|
||||
|
||||
user = models.ForeignKey(User, related_name="permanencies", verbose_name=_("user"))
|
||||
counter = models.ForeignKey(Counter, related_name="permanencies", verbose_name=_("counter"))
|
||||
start = models.DateTimeField(_('start date'))
|
||||
end = models.DateTimeField(_('end date'), null=True, db_index=True)
|
||||
activity = models.DateTimeField(_('last activity date'), auto_now=True)
|
||||
counter = models.ForeignKey(
|
||||
Counter, related_name="permanencies", verbose_name=_("counter")
|
||||
)
|
||||
start = models.DateTimeField(_("start date"))
|
||||
end = models.DateTimeField(_("end date"), null=True, db_index=True)
|
||||
activity = models.DateTimeField(_("last activity date"), auto_now=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("permanency")
|
||||
|
||||
def __str__(self):
|
||||
return "%s in %s from %s (last activity: %s) to %s" % (self.user, self.counter,
|
||||
self.start.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
self.activity.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
self.end.strftime("%Y-%m-%d %H:%M:%S") if self.end else "",
|
||||
)
|
||||
return "%s in %s from %s (last activity: %s) to %s" % (
|
||||
self.user,
|
||||
self.counter,
|
||||
self.start.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
self.activity.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
self.end.strftime("%Y-%m-%d %H:%M:%S") if self.end else "",
|
||||
)
|
||||
|
||||
|
||||
class CashRegisterSummary(models.Model):
|
||||
user = models.ForeignKey(User, related_name="cash_summaries", verbose_name=_("user"))
|
||||
counter = models.ForeignKey(Counter, related_name="cash_summaries", verbose_name=_("counter"))
|
||||
date = models.DateTimeField(_('date'))
|
||||
comment = models.TextField(_('comment'), null=True, blank=True)
|
||||
emptied = models.BooleanField(_('emptied'), default=False)
|
||||
user = models.ForeignKey(
|
||||
User, related_name="cash_summaries", verbose_name=_("user")
|
||||
)
|
||||
counter = models.ForeignKey(
|
||||
Counter, related_name="cash_summaries", verbose_name=_("counter")
|
||||
)
|
||||
date = models.DateTimeField(_("date"))
|
||||
comment = models.TextField(_("comment"), null=True, blank=True)
|
||||
emptied = models.BooleanField(_("emptied"), default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("cash register summary")
|
||||
@ -492,37 +621,37 @@ class CashRegisterSummary(models.Model):
|
||||
return "At %s by %s - Total: %s €" % (self.counter, self.user, self.get_total())
|
||||
|
||||
def __getattribute__(self, name):
|
||||
if name[:5] == 'check':
|
||||
checks = self.items.filter(check=True).order_by('value').all()
|
||||
if name == 'ten_cents':
|
||||
if name[:5] == "check":
|
||||
checks = self.items.filter(check=True).order_by("value").all()
|
||||
if name == "ten_cents":
|
||||
return self.items.filter(value=0.1, check=False).first()
|
||||
elif name == 'twenty_cents':
|
||||
elif name == "twenty_cents":
|
||||
return self.items.filter(value=0.2, check=False).first()
|
||||
elif name == 'fifty_cents':
|
||||
elif name == "fifty_cents":
|
||||
return self.items.filter(value=0.5, check=False).first()
|
||||
elif name == 'one_euro':
|
||||
elif name == "one_euro":
|
||||
return self.items.filter(value=1, check=False).first()
|
||||
elif name == 'two_euros':
|
||||
elif name == "two_euros":
|
||||
return self.items.filter(value=2, check=False).first()
|
||||
elif name == 'five_euros':
|
||||
elif name == "five_euros":
|
||||
return self.items.filter(value=5, check=False).first()
|
||||
elif name == 'ten_euros':
|
||||
elif name == "ten_euros":
|
||||
return self.items.filter(value=10, check=False).first()
|
||||
elif name == 'twenty_euros':
|
||||
elif name == "twenty_euros":
|
||||
return self.items.filter(value=20, check=False).first()
|
||||
elif name == 'fifty_euros':
|
||||
elif name == "fifty_euros":
|
||||
return self.items.filter(value=50, check=False).first()
|
||||
elif name == 'hundred_euros':
|
||||
elif name == "hundred_euros":
|
||||
return self.items.filter(value=100, check=False).first()
|
||||
elif name == 'check_1':
|
||||
elif name == "check_1":
|
||||
return checks[0] if 0 < len(checks) else None
|
||||
elif name == 'check_2':
|
||||
elif name == "check_2":
|
||||
return checks[1] if 1 < len(checks) else None
|
||||
elif name == 'check_3':
|
||||
elif name == "check_3":
|
||||
return checks[2] if 2 < len(checks) else None
|
||||
elif name == 'check_4':
|
||||
elif name == "check_4":
|
||||
return checks[3] if 3 < len(checks) else None
|
||||
elif name == 'check_5':
|
||||
elif name == "check_5":
|
||||
return checks[4] if 4 < len(checks) else None
|
||||
else:
|
||||
return object.__getattribute__(self, name)
|
||||
@ -547,14 +676,16 @@ class CashRegisterSummary(models.Model):
|
||||
return super(CashRegisterSummary, self).save(*args, **kwargs)
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('counter:cash_summary_list')
|
||||
return reverse("counter:cash_summary_list")
|
||||
|
||||
|
||||
class CashRegisterSummaryItem(models.Model):
|
||||
cash_summary = models.ForeignKey(CashRegisterSummary, related_name="items", verbose_name=_("cash summary"))
|
||||
cash_summary = models.ForeignKey(
|
||||
CashRegisterSummary, related_name="items", verbose_name=_("cash summary")
|
||||
)
|
||||
value = CurrencyField(_("value"))
|
||||
quantity = models.IntegerField(_('quantity'), default=0)
|
||||
check = models.BooleanField(_('check'), default=False)
|
||||
quantity = models.IntegerField(_("quantity"), default=0)
|
||||
check = models.BooleanField(_("check"), default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("cash register summary item")
|
||||
@ -564,17 +695,24 @@ class Eticket(models.Model):
|
||||
"""
|
||||
Eticket can be linked to a product an allows PDF generation
|
||||
"""
|
||||
product = models.OneToOneField(Product, related_name='eticket', verbose_name=_("product"))
|
||||
banner = models.ImageField(upload_to='etickets', null=True, blank=True, verbose_name=_("banner"))
|
||||
event_date = models.DateField(_('event date'), null=True, blank=True)
|
||||
event_title = models.CharField(_('event title'), max_length=64, null=True, blank=True)
|
||||
secret = models.CharField(_('secret'), max_length=64, unique=True)
|
||||
|
||||
product = models.OneToOneField(
|
||||
Product, related_name="eticket", verbose_name=_("product")
|
||||
)
|
||||
banner = models.ImageField(
|
||||
upload_to="etickets", null=True, blank=True, verbose_name=_("banner")
|
||||
)
|
||||
event_date = models.DateField(_("event date"), null=True, blank=True)
|
||||
event_title = models.CharField(
|
||||
_("event title"), max_length=64, null=True, blank=True
|
||||
)
|
||||
secret = models.CharField(_("secret"), max_length=64, unique=True)
|
||||
|
||||
def __str__(self):
|
||||
return "%s" % (self.product.name)
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('counter:eticket_list')
|
||||
return reverse("counter:eticket_list")
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.id:
|
||||
@ -590,4 +728,7 @@ class Eticket(models.Model):
|
||||
def get_hash(self, string):
|
||||
import hashlib
|
||||
import hmac
|
||||
return hmac.new(bytes(self.secret, 'utf-8'), bytes(string, 'utf-8'), hashlib.sha1).hexdigest()
|
||||
|
||||
return hmac.new(
|
||||
bytes(self.secret, "utf-8"), bytes(string, "utf-8"), hashlib.sha1
|
||||
).hexdigest()
|
||||
|
120
counter/tests.py
120
counter/tests.py
@ -39,46 +39,48 @@ class CounterTest(TestCase):
|
||||
self.mde = Counter.objects.filter(name="MDE").first()
|
||||
|
||||
def test_full_click(self):
|
||||
response = self.client.post(reverse("counter:login", kwargs={"counter_id": self.mde.id}), {
|
||||
"username": self.skia.username,
|
||||
"password": "plop"
|
||||
})
|
||||
response = self.client.post(
|
||||
reverse("counter:login", kwargs={"counter_id": self.mde.id}),
|
||||
{"username": self.skia.username, "password": "plop"},
|
||||
)
|
||||
response = self.client.get(
|
||||
reverse("counter:details", kwargs={"counter_id": self.mde.id}))
|
||||
reverse("counter:details", kwargs={"counter_id": self.mde.id})
|
||||
)
|
||||
|
||||
self.assertTrue(
|
||||
'class="link-button">S' Kia</button>' in str(response.content))
|
||||
'class="link-button">S' Kia</button>' in str(response.content)
|
||||
)
|
||||
|
||||
counter_token = re.search(
|
||||
r'name="counter_token" value="([^"]*)"', str(response.content)).group(1)
|
||||
r'name="counter_token" value="([^"]*)"', str(response.content)
|
||||
).group(1)
|
||||
|
||||
response = self.client.post(reverse("counter:details",
|
||||
kwargs={"counter_id": self.mde.id}), {
|
||||
"code": "4000k",
|
||||
"counter_token": counter_token,
|
||||
})
|
||||
location = response.get('location')
|
||||
response = self.client.post(
|
||||
reverse("counter:details", kwargs={"counter_id": self.mde.id}),
|
||||
{"code": "4000k", "counter_token": counter_token},
|
||||
)
|
||||
location = response.get("location")
|
||||
|
||||
response = self.client.get(response.get('location'))
|
||||
self.assertTrue('>Richard Batsbak</' in str(response.content))
|
||||
response = self.client.get(response.get("location"))
|
||||
self.assertTrue(">Richard Batsbak</" in str(response.content))
|
||||
|
||||
response = self.client.post(location, {
|
||||
'action': 'refill',
|
||||
'amount': '10',
|
||||
'payment_method': 'CASH',
|
||||
'bank': 'OTHER',
|
||||
})
|
||||
response = self.client.post(location, {
|
||||
'action': 'code',
|
||||
'code': 'BARB',
|
||||
})
|
||||
response = self.client.post(location, {
|
||||
'action': 'code',
|
||||
'code': 'fin',
|
||||
})
|
||||
response = self.client.post(
|
||||
location,
|
||||
{
|
||||
"action": "refill",
|
||||
"amount": "10",
|
||||
"payment_method": "CASH",
|
||||
"bank": "OTHER",
|
||||
},
|
||||
)
|
||||
response = self.client.post(location, {"action": "code", "code": "BARB"})
|
||||
response = self.client.post(location, {"action": "code", "code": "fin"})
|
||||
|
||||
response_get = self.client.get(response.get('location'))
|
||||
self.assertTrue('<p>Client : Richard Batsbak - Nouveau montant : 8.30' in str(response_get.content))
|
||||
response_get = self.client.get(response.get("location"))
|
||||
self.assertTrue(
|
||||
"<p>Client : Richard Batsbak - Nouveau montant : 8.30"
|
||||
in str(response_get.content)
|
||||
)
|
||||
|
||||
|
||||
class BarmanConnectionTest(TestCase):
|
||||
@ -93,40 +95,50 @@ class BarmanConnectionTest(TestCase):
|
||||
self.counter = Counter.objects.filter(id=2).first()
|
||||
|
||||
def test_barman_granted(self):
|
||||
self.client.post(reverse('counter:login', args=[self.counter.id]),
|
||||
{'username': "krophil",
|
||||
'password': "plop"})
|
||||
response_get = self.client.get(reverse("counter:details",
|
||||
args=[self.counter.id]))
|
||||
self.client.post(
|
||||
reverse("counter:login", args=[self.counter.id]),
|
||||
{"username": "krophil", "password": "plop"},
|
||||
)
|
||||
response_get = self.client.get(
|
||||
reverse("counter:details", args=[self.counter.id])
|
||||
)
|
||||
|
||||
self.assertTrue(
|
||||
'<p>Entrez un code client : </p>' in str(response_get.content))
|
||||
self.assertTrue("<p>Entrez un code client : </p>" in str(response_get.content))
|
||||
|
||||
def test_counters_list_barmen(self):
|
||||
self.client.post(reverse('counter:login', args=[self.counter.id]),
|
||||
{'username': "krophil",
|
||||
'password': "plop"})
|
||||
response_get = self.client.get(reverse("counter:activity",
|
||||
args=[self.counter.id]))
|
||||
self.client.post(
|
||||
reverse("counter:login", args=[self.counter.id]),
|
||||
{"username": "krophil", "password": "plop"},
|
||||
)
|
||||
response_get = self.client.get(
|
||||
reverse("counter:activity", args=[self.counter.id])
|
||||
)
|
||||
|
||||
self.assertTrue(
|
||||
'<li><a href="/user/10/">Kro Phil'</a></li>' in str(response_get.content))
|
||||
'<li><a href="/user/10/">Kro Phil'</a></li>'
|
||||
in str(response_get.content)
|
||||
)
|
||||
|
||||
def test_barman_denied(self):
|
||||
self.client.post(reverse('counter:login', args=[self.counter.id]),
|
||||
{'username': "skia",
|
||||
'password': "plop"})
|
||||
self.client.post(
|
||||
reverse("counter:login", args=[self.counter.id]),
|
||||
{"username": "skia", "password": "plop"},
|
||||
)
|
||||
response_get = self.client.get(
|
||||
reverse("counter:details", args=[self.counter.id]))
|
||||
reverse("counter:details", args=[self.counter.id])
|
||||
)
|
||||
|
||||
self.assertTrue('<p>Merci de vous identifier</p>' in str(response_get.content))
|
||||
self.assertTrue("<p>Merci de vous identifier</p>" in str(response_get.content))
|
||||
|
||||
def test_counters_list_no_barmen(self):
|
||||
self.client.post(reverse('counter:login', args=[self.counter.id]),
|
||||
{'username': "krophil",
|
||||
'password': "plop"})
|
||||
self.client.post(
|
||||
reverse("counter:login", args=[self.counter.id]),
|
||||
{"username": "krophil", "password": "plop"},
|
||||
)
|
||||
response_get = self.client.get(
|
||||
reverse("counter:activity", args=[self.counter.id]))
|
||||
reverse("counter:activity", args=[self.counter.id])
|
||||
)
|
||||
|
||||
self.assertFalse(
|
||||
'<li><a href="/user/1/">S' Kia</a></li>' in str(response_get.content))
|
||||
'<li><a href="/user/1/">S' Kia</a></li>' in str(response_get.content)
|
||||
)
|
||||
|
135
counter/urls.py
135
counter/urls.py
@ -27,37 +27,106 @@ from django.conf.urls import url
|
||||
from counter.views import *
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^(?P<counter_id>[0-9]+)$', CounterMain.as_view(), name='details'),
|
||||
url(r'^(?P<counter_id>[0-9]+)/click/(?P<user_id>[0-9]+)$', CounterClick.as_view(), name='click'),
|
||||
url(r'^(?P<counter_id>[0-9]+)/last_ops$', CounterLastOperationsView.as_view(), name='last_ops'),
|
||||
url(r'^(?P<counter_id>[0-9]+)/cash_summary$', CounterCashSummaryView.as_view(), name='cash_summary'),
|
||||
url(r'^(?P<counter_id>[0-9]+)/activity$', CounterActivityView.as_view(), name='activity'),
|
||||
url(r'^(?P<counter_id>[0-9]+)/stats$', CounterStatView.as_view(), name='stats'),
|
||||
url(r'^(?P<counter_id>[0-9]+)/login$', CounterLogin.as_view(), name='login'),
|
||||
url(r'^(?P<counter_id>[0-9]+)/logout$', CounterLogout.as_view(), name='logout'),
|
||||
url(r'^eticket/(?P<selling_id>[0-9]+)/pdf$', EticketPDFView.as_view(), name='eticket_pdf'),
|
||||
url(r'^admin/(?P<counter_id>[0-9]+)$', CounterEditView.as_view(), name='admin'),
|
||||
url(r'^admin/(?P<counter_id>[0-9]+)/prop$', CounterEditPropView.as_view(), name='prop_admin'),
|
||||
url(r'^admin$', CounterListView.as_view(), name='admin_list'),
|
||||
url(r'^admin/new$', CounterCreateView.as_view(), name='new'),
|
||||
url(r'^admin/delete/(?P<counter_id>[0-9]+)$', CounterDeleteView.as_view(), name='delete'),
|
||||
url(r'^admin/invoices_call$', InvoiceCallView.as_view(), name='invoices_call'),
|
||||
url(r'^admin/cash_summary/list$', CashSummaryListView.as_view(), name='cash_summary_list'),
|
||||
url(r'^admin/cash_summary/(?P<cashsummary_id>[0-9]+)$', CashSummaryEditView.as_view(), name='cash_summary_edit'),
|
||||
url(r'^admin/product/list$', ProductListView.as_view(), name='product_list'),
|
||||
url(r'^admin/product/list_archived$', ProductArchivedListView.as_view(), name='product_list_archived'),
|
||||
url(r'^admin/product/create$', ProductCreateView.as_view(), name='new_product'),
|
||||
url(r'^admin/product/(?P<product_id>[0-9]+)$', ProductEditView.as_view(), name='product_edit'),
|
||||
url(r'^admin/producttype/list$', ProductTypeListView.as_view(), name='producttype_list'),
|
||||
url(r'^admin/producttype/create$', ProductTypeCreateView.as_view(), name='new_producttype'),
|
||||
url(r'^admin/producttype/(?P<type_id>[0-9]+)$', ProductTypeEditView.as_view(), name='producttype_edit'),
|
||||
url(r'^admin/eticket/list$', EticketListView.as_view(), name='eticket_list'),
|
||||
url(r'^admin/eticket/new$', EticketCreateView.as_view(), name='new_eticket'),
|
||||
url(r'^admin/eticket/(?P<eticket_id>[0-9]+)$', EticketEditView.as_view(), name='edit_eticket'),
|
||||
url(r'^admin/selling/(?P<selling_id>[0-9]+)/delete$', SellingDeleteView.as_view(), name='selling_delete'),
|
||||
url(r'^admin/refilling/(?P<refilling_id>[0-9]+)/delete$', RefillingDeleteView.as_view(), name='refilling_delete'),
|
||||
url(r'^admin/(?P<counter_id>[0-9]+)/refillings$', CounterRefillingListView.as_view(), name='refilling_list'),
|
||||
|
||||
url(r"^(?P<counter_id>[0-9]+)$", CounterMain.as_view(), name="details"),
|
||||
url(
|
||||
r"^(?P<counter_id>[0-9]+)/click/(?P<user_id>[0-9]+)$",
|
||||
CounterClick.as_view(),
|
||||
name="click",
|
||||
),
|
||||
url(
|
||||
r"^(?P<counter_id>[0-9]+)/last_ops$",
|
||||
CounterLastOperationsView.as_view(),
|
||||
name="last_ops",
|
||||
),
|
||||
url(
|
||||
r"^(?P<counter_id>[0-9]+)/cash_summary$",
|
||||
CounterCashSummaryView.as_view(),
|
||||
name="cash_summary",
|
||||
),
|
||||
url(
|
||||
r"^(?P<counter_id>[0-9]+)/activity$",
|
||||
CounterActivityView.as_view(),
|
||||
name="activity",
|
||||
),
|
||||
url(r"^(?P<counter_id>[0-9]+)/stats$", CounterStatView.as_view(), name="stats"),
|
||||
url(r"^(?P<counter_id>[0-9]+)/login$", CounterLogin.as_view(), name="login"),
|
||||
url(r"^(?P<counter_id>[0-9]+)/logout$", CounterLogout.as_view(), name="logout"),
|
||||
url(
|
||||
r"^eticket/(?P<selling_id>[0-9]+)/pdf$",
|
||||
EticketPDFView.as_view(),
|
||||
name="eticket_pdf",
|
||||
),
|
||||
url(r"^admin/(?P<counter_id>[0-9]+)$", CounterEditView.as_view(), name="admin"),
|
||||
url(
|
||||
r"^admin/(?P<counter_id>[0-9]+)/prop$",
|
||||
CounterEditPropView.as_view(),
|
||||
name="prop_admin",
|
||||
),
|
||||
url(r"^admin$", CounterListView.as_view(), name="admin_list"),
|
||||
url(r"^admin/new$", CounterCreateView.as_view(), name="new"),
|
||||
url(
|
||||
r"^admin/delete/(?P<counter_id>[0-9]+)$",
|
||||
CounterDeleteView.as_view(),
|
||||
name="delete",
|
||||
),
|
||||
url(r"^admin/invoices_call$", InvoiceCallView.as_view(), name="invoices_call"),
|
||||
url(
|
||||
r"^admin/cash_summary/list$",
|
||||
CashSummaryListView.as_view(),
|
||||
name="cash_summary_list",
|
||||
),
|
||||
url(
|
||||
r"^admin/cash_summary/(?P<cashsummary_id>[0-9]+)$",
|
||||
CashSummaryEditView.as_view(),
|
||||
name="cash_summary_edit",
|
||||
),
|
||||
url(r"^admin/product/list$", ProductListView.as_view(), name="product_list"),
|
||||
url(
|
||||
r"^admin/product/list_archived$",
|
||||
ProductArchivedListView.as_view(),
|
||||
name="product_list_archived",
|
||||
),
|
||||
url(r"^admin/product/create$", ProductCreateView.as_view(), name="new_product"),
|
||||
url(
|
||||
r"^admin/product/(?P<product_id>[0-9]+)$",
|
||||
ProductEditView.as_view(),
|
||||
name="product_edit",
|
||||
),
|
||||
url(
|
||||
r"^admin/producttype/list$",
|
||||
ProductTypeListView.as_view(),
|
||||
name="producttype_list",
|
||||
),
|
||||
url(
|
||||
r"^admin/producttype/create$",
|
||||
ProductTypeCreateView.as_view(),
|
||||
name="new_producttype",
|
||||
),
|
||||
url(
|
||||
r"^admin/producttype/(?P<type_id>[0-9]+)$",
|
||||
ProductTypeEditView.as_view(),
|
||||
name="producttype_edit",
|
||||
),
|
||||
url(r"^admin/eticket/list$", EticketListView.as_view(), name="eticket_list"),
|
||||
url(r"^admin/eticket/new$", EticketCreateView.as_view(), name="new_eticket"),
|
||||
url(
|
||||
r"^admin/eticket/(?P<eticket_id>[0-9]+)$",
|
||||
EticketEditView.as_view(),
|
||||
name="edit_eticket",
|
||||
),
|
||||
url(
|
||||
r"^admin/selling/(?P<selling_id>[0-9]+)/delete$",
|
||||
SellingDeleteView.as_view(),
|
||||
name="selling_delete",
|
||||
),
|
||||
url(
|
||||
r"^admin/refilling/(?P<refilling_id>[0-9]+)/delete$",
|
||||
RefillingDeleteView.as_view(),
|
||||
name="refilling_delete",
|
||||
),
|
||||
url(
|
||||
r"^admin/(?P<counter_id>[0-9]+)/refillings$",
|
||||
CounterRefillingListView.as_view(),
|
||||
name="refilling_list",
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
|
1335
counter/views.py
1335
counter/views.py
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user