1
0
mirror of https://gitlab.crans.org/bde/nk20-scripts synced 2025-11-17 19:47:49 +01:00

Compare commits

3 Commits

Author SHA1 Message Date
quark
182bb6c945 Merge branch 'oauth2' into 'master'
python3.11 -> python3.13

See merge request bde/nk20-scripts!13
2025-11-17 19:27:44 +01:00
quark
65a6091461 python3.11 -> python3.13 2025-11-17 19:26:34 +01:00
quark
83fd753200 add price management in steal script 2025-10-21 18:13:55 +02:00
2 changed files with 77 additions and 19 deletions

View File

@@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.models import Sum from django.db.models import Sum
from note.models import RecurrentTransaction, TransactionTemplate from note.models import RecurrentTransaction, TransactionTemplate
@@ -9,25 +10,40 @@ from note.models import RecurrentTransaction, TransactionTemplate
class Command(BaseCommand): class Command(BaseCommand):
help = """ help = """
Syntax of inventory file:\n Syntax of inventory file:
DATE_START=YYYY-MM-DD HH:MM:SS\n DATE_START=YYYY-MM-DD HH:MM:SS
button_id=quantity\n button_id=quantity
# some comment\n "button_name"=quantity
...\n 'button_name'=quantity
DATE_END=YYYY-MM-DD\n # some comment
button_id=quantity\n ...
...\n DATE_END=YYYY-MM-DD
GROCERY\n button_id=quantity
button_id=quantity\n ...
...\n GROCERY
button_id=quantity
...
Syntax of price file:
button_id;price_ht;TVA
"button_name";price_ht;TVA
'button_name';price_ht;TVA
# some comment
button_name
You don't need to escape internal " or ' in button_name
"=" and ";" aren't allowed in button_name
TVA in % (i.e 5.5, 20)
price_ht in (i.e 0.928, 1.045)
""" """
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument('file', type=str) parser.add_argument('file', type=str)
parser.add_argument('-t', '--type', choices=["weekend", "weekdays"],
default="", help='Type of prices')
parser.add_argument('-d', '--doit', action='store_true',
help='Actually do it')
def handle(self, *args, **kwargs): def handle(self, *args, **kwargs):
if not kwargs['file']: prices_csv = '/var/inventory/prices.csv'
kwargs['file'] = '/var/inventory/current.inv'
file = open(kwargs['file'], 'r', encoding='utf-8') file = open(kwargs['file'], 'r', encoding='utf-8')
inv_start, inv_end, inv_grocery = {}, {}, {} inv_start, inv_end, inv_grocery = {}, {}, {}
@@ -53,6 +69,8 @@ class Command(BaseCommand):
else: else:
add_to_dict(line, inv_grocery) add_to_dict(line, inv_grocery)
file.close()
delta_real = delta_from_inv(inv_start, inv_end, inv_grocery) delta_real = delta_from_inv(inv_start, inv_end, inv_grocery)
delta_th = delta_from_note(date_start, date_end, delta_real.keys()) delta_th = delta_from_note(date_start, date_end, delta_real.keys())
@@ -69,12 +87,52 @@ class Command(BaseCommand):
else: else:
self.stdout.write(self.style.SUCCESS(text)) self.stdout.write(self.style.SUCCESS(text))
change = False
if kwargs['type']:
change = True
prices_dict = {}
prices = open(prices_csv, 'r', encoding='utf-8')
for line in prices:
if line[0] == '#':
continue
b, p, tva = line.split(';')
if b[0] == "\"" or b[0] == "'":
b = TransactionTemplate.objects.get(name=b[1:-1])
else:
b = TransactionTemplate.objects.get(pk=int(b))
prices_dict[b] = float(p) * (1 + float(tva) / 100)
prices.close()
if kwargs['type'] == 'weekdays':
for b in prices_dict:
# people steal on weekdays
prices_dict[b] = prices_dict[b] * (1 + steal_dict[b] / 100)
if change:
with transaction.atomic():
for b in prices_dict:
# dizaine de centime supérieures
# sauf si les pertes sont inférieures à 1 centimes
# 1.299€ -> 1.30€ | 1.2100€ -> 1.30€ | 1.20999€ -> 1.20€
amount = round(int(100*(prices_dict[b] + 0.05)), -1)
if kwargs['verbosity'] > 0:
self.stdout.write(f"""{b.name}:
-Old amount: {b.amount}c
-New amount: {amount}c""")
b.amount = amount
# we don't want to flood price history each week
b._no_signal = True
if kwargs['doit']:
b.save()
return 0 return 0
def add_to_dict(line, d): def add_to_dict(line, d):
pk, quantity = line.split('=') b, quantity = line.split('=')
button = TransactionTemplate.objects.get(pk=pk) if b[0] == "\"" or b[0] == "'":
button = TransactionTemplate.objects.get(name=b[1:-1])
else:
button = TransactionTemplate.objects.get(pk=int(b))
d[button] = int(quantity) d[button] = int(quantity)
return return

View File

@@ -6,10 +6,10 @@
# Tested with django-oauth2-toolkit version 3.0.1 # Tested with django-oauth2-toolkit version 3.0.1
sed -i -e "s/get_all_scopes()/get_all_scopes(scopes=scopes)/g" /var/www/note_kfet/env/lib/python3.11/site-packages/oauth2_provider/views/base.py sed -i -e "s/get_all_scopes()/get_all_scopes(scopes=scopes)/g" /var/www/note_kfet/env/lib/python3.13/site-packages/oauth2_provider/views/base.py
sed -i -e '/get_all_scopes()/{N;s/\(.*\)\n\(.*\)/\2\n\1/;s/get_all_scopes()/get_all_scopes(scopes=token_scopes)/}' /var/www/note_kfet/env/lib/python3.11/site-packages/oauth2_provider/models.py sed -i -e '/get_all_scopes()/{N;s/\(.*\)\n\(.*\)/\2\n\1/;s/get_all_scopes()/get_all_scopes(scopes=token_scopes)/}' /var/www/note_kfet/env/lib/python3.13/site-packages/oauth2_provider/models.py
sed -i -e '/get_all_scopes()/{N;s/\(.*\)\n\(.*\)/\2\n\1/;s/get_all_scopes()/get_all_scopes(scopes=read_write_scopes)/}' /var/www/note_kfet/env/lib/python3.11/site-packages/oauth2_provider/views/mixins.py sed -i -e '/get_all_scopes()/{N;s/\(.*\)\n\(.*\)/\2\n\1/;s/get_all_scopes()/get_all_scopes(scopes=read_write_scopes)/}' /var/www/note_kfet/env/lib/python3.13/site-packages/oauth2_provider/views/mixins.py
sed -i -e '/get_all_scopes()/{N;s/\(.*\)\n\(.*\)/\2\n\1/;s/get_all_scopes()/get_all_scopes(scopes=read_write_scopes)/}' /var/www/note_kfet/env/lib/python3.11/site-packages/oauth2_provider/decorators.py sed -i -e '/get_all_scopes()/{N;s/\(.*\)\n\(.*\)/\2\n\1/;s/get_all_scopes()/get_all_scopes(scopes=read_write_scopes)/}' /var/www/note_kfet/env/lib/python3.13/site-packages/oauth2_provider/decorators.py