diff --git a/.dockerignore b/.dockerignore new file mode 100755 index 0000000..8c84753 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +local_settings.py +.git +.gitignore +githubtoken.txt \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..c42bd5e --- /dev/null +++ b/.gitignore @@ -0,0 +1,135 @@ +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +*.idea +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +*.iml +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +db.sqlite3 + +# Flask stuff: + +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +venvwindows/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +app/package.json +app/package-lock.json +.vscode/ +clearnet.ini + +rsync_svg.txt +setup/ +word_seeds.txt +workspace.code-workspace +app/static/bootstrap +/app/static/images/ +/app/static/fonts/ +/app/static/css/ +/app/static/js/ +/app/static/javascriptaddons/ +.idea +/config.py +instance/config.py +.idea/ +/passwords.py +config.py +crons.txt +getnewitems.py +helperfunctions/ +test.py +tools/ +nginx.txt +app/node_modules/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..9a125d7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.12-bullseye + +ENV PYTHONFAULTHANDLER=1 + +ENV PYTHONUNBUFFERED=1 + +RUN mkdir -p /app + +COPY requirements.txt /app + +WORKDIR /app + +RUN pip3 install -r requirements.txt + +COPY . /app + +CMD ["python", "app.py", "--host", "0.0.0.0"] + diff --git a/app/__init__.py b/app/__init__.py index 9f6f26c..cd17a49 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -180,6 +180,10 @@ app.register_blueprint(delivery_blueprint, url_prefix='/delivery') from .delivery_data import delivery_data as delivery_data_blueprint app.register_blueprint(delivery_data_blueprint, url_prefix='/deliverydata') +from .delivery_status import deliverystatus as delivery_status_blueprint +app.register_blueprint(delivery_status_blueprint, url_prefix='/deliverystatus') + + from .search import search as search_blueprint app.register_blueprint(search_blueprint, url_prefix='/search') diff --git a/app/admin/views.py b/app/admin/views.py index 255f7d0..598098d 100644 --- a/app/admin/views.py +++ b/app/admin/views.py @@ -18,11 +18,13 @@ def create_oil_price(): price_from_supplier = request.json["price_from_supplier"] price_for_customer = request.json["price_for_customer"] price_for_employee = request.json["price_for_employee"] + price_same_day = request.json["price_same_day"] new_admin_oil_price = Pricing_Oil_Oil( price_from_supplier=price_from_supplier, price_for_customer=price_for_customer, price_for_employee=price_for_employee, + price_same_day=price_same_day, date=now, ) @@ -41,11 +43,14 @@ def create_service_price(): Changes general labor rates prices """ now = datetime.utcnow() + price_service_hour = request.json["price_service_hour"] price_emergency_service_hourly_rate = request.json["price_emergency_service_hour"] price_emergency_call = request.json["price_emergency_call"] price_out_of_oil = request.json["price_out_of_oil"] price_prime = request.json["price_prime"] + price_cleaning = request.json["price_cleaning"] + price_service = Pricing_Service_General( price_service_hour=price_service_hour, @@ -53,6 +58,7 @@ def create_service_price(): price_emergency_service_hour=price_emergency_service_hourly_rate, price_prime=price_prime, price_emergency_call=price_emergency_call, + price_cleaning=price_cleaning, date=now, ) diff --git a/app/auth/views.py b/app/auth/views.py index 8f84b41..67cd867 100644 --- a/app/auth/views.py +++ b/app/auth/views.py @@ -94,16 +94,8 @@ def login(): .filter_by(username=username)\ .first() if not bcrypt.check_password_hash(user.password_hash, password): - - current_fails = int(user.fails) - new_fails = current_fails + 1 - user.fails = new_fails - db.session.add(user) - db.session.commit() - return jsonify({"error": True}), 200 - user.locked = 0 - user.fails = 0 + db.session.add(user) db.session.commit() diff --git a/app/classes/delivery.py b/app/classes/delivery.py index c6bab7c..11bebd8 100644 --- a/app/classes/delivery.py +++ b/app/classes/delivery.py @@ -59,7 +59,7 @@ class Delivery_Delivery(db.Model): payment_type = db.Column(db.INTEGER) payment_card_id = db.Column(db.INTEGER) - driver_employee_id = db.Column(db.VARCHAR(140)) + driver_employee_id = db.Column(db.INTEGER) driver_first_name = db.Column(db.VARCHAR(140)) driver_last_name = db.Column(db.VARCHAR(140)) diff --git a/app/classes/pricing.py b/app/classes/pricing.py index c18b501..84e802e 100644 --- a/app/classes/pricing.py +++ b/app/classes/pricing.py @@ -17,7 +17,6 @@ class Pricing_Service_General(db.Model): price_emergency_call = db.Column(db.DECIMAL(50, 2)) price_out_of_oil = db.Column(db.DECIMAL(50, 2)) price_prime = db.Column(db.DECIMAL(50, 2)) - price_same_day = db.Column(db.DECIMAL(50, 2)) price_cleaning = db.Column(db.DECIMAL(50, 2)) date = db.Column(db.TIMESTAMP(), default=datetime.utcnow()) @@ -40,6 +39,8 @@ class Pricing_Oil_Oil(db.Model): price_from_supplier = db.Column(db.DECIMAL(50, 2)) price_for_customer = db.Column(db.DECIMAL(50, 2)) price_for_employee = db.Column(db.DECIMAL(50, 2)) + price_same_day = db.Column(db.DECIMAL(50, 2)) + price_prime = db.Column(db.DECIMAL(50, 2)) date = db.Column(db.TIMESTAMP(), default=datetime.utcnow()) diff --git a/app/customer/views.py b/app/customer/views.py index 4e13bdd..936879b 100644 --- a/app/customer/views.py +++ b/app/customer/views.py @@ -53,7 +53,6 @@ def get_a_customer(customer_id): .query(Customer_Customer) .filter(Customer_Customer.id == customer_id) .first()) - print(get_customer) customer_schema = Customer_Customer_schema(many=False) return jsonify(customer_schema.dump(get_customer)) @@ -186,7 +185,6 @@ def delete_customer(customer_id): db.session.delete(get_customer) db.session.commit() - print("deleted") return jsonify({ "ok": True, 'user': { diff --git a/app/delivery/views.py b/app/delivery/views.py index 916b590..5a430f0 100644 --- a/app/delivery/views.py +++ b/app/delivery/views.py @@ -1,9 +1,8 @@ from flask import request, jsonify from flask_login import current_user -from datetime import date +from datetime import date, datetime, timedelta from app.delivery import delivery from app import db -from datetime import datetime from app.classes.customer import Customer_Customer from app.classes.delivery import (Delivery_Delivery, Delivery_Delivery_schema, @@ -11,6 +10,7 @@ from app.classes.delivery import (Delivery_Delivery, Delivery_Payment, Delivery_Payment_schema, ) +from app.classes.employee import Employee_Employee from app.classes.cards import Card_Card from app.classes.pricing import Pricing_Oil_Oil from app.classes.auth import Auth_User @@ -20,12 +20,10 @@ from app.classes.pricing import Pricing_Service_General def get_a_delivery(delivery_id): """ """ - get_delivery = db.session\ .query(Delivery_Delivery)\ .filter(Delivery_Delivery.id == delivery_id)\ .first() - return jsonify({ "ok": True, 'delivery': { @@ -42,10 +40,14 @@ def get_a_delivery(delivery_id): 'delivery_status': get_delivery.delivery_status, 'payment_type': get_delivery.payment_type, 'payment_card_id': get_delivery.payment_card_id, - + 'driver_employee_id': get_delivery.driver_employee_id, + 'driver_first_name': get_delivery.driver_first_name, + 'driver_last_name': get_delivery.driver_last_name, }, }), 200 + + @delivery.route("/order/", methods=["GET"]) def get_a_specific_delivery(delivery_id): @@ -362,13 +364,16 @@ def edit_a_delivery(delivery_id): delivery_status = request.json["delivery_status"] when_to_deliver = request.json["expected_delivery_date"] dispatcher_notes_taken = request.json["dispatcher_notes_taken"] - customer_wants_fill = request.json["customer_asked_for_fill"] - card_payment = request.json["credit"] cash_payment = request.json["cash"] + delivery_driver_id = request.json["driver_employee_id"] + get_driver = (db.session + .query(Employee_Employee) + .filter(Employee_Employee.id == delivery_driver_id) + .first()) if request.json["credit_card_id"]: card_payment_id = request.json["credit_card_id"] else: @@ -423,6 +428,10 @@ def edit_a_delivery(delivery_id): get_delivery.payment_type = delivery_payment_method get_delivery.payment_card_id = card_id_from_customer + get_delivery.driver_last_name = get_driver.employee_last_name + get_delivery.driver_first_name = get_driver.employee_first_name + get_delivery.driver_employee_id = get_driver.id + db.session.add(get_delivery) db.session.commit() @@ -465,6 +474,18 @@ def create_a_delivery(user_id): card_payment = request.json["credit"] cash_payment = request.json["cash"] + + delivery_driver_id = request.json["driver_employee_id"] + + get_driver = (db.session + .query(Employee_Employee) + .filter(Employee_Employee.id == delivery_driver_id) + .first()) + + driver_l_name = get_driver.employee_last_name + driver_f_name = get_driver.employee_first_name + driver_emp_id = get_driver.id + try: if request.json["credit_card_id"]: card_payment_id = request.json["credit_card_id"] @@ -522,13 +543,13 @@ def create_a_delivery(user_id): precharge_amount = int(gallons_ordered) * get_today_price.price_for_customer if same_day_asked == 1 and prime_asked == 0: - total_precharge_amount = precharge_amount + get_service_prices.price_same_day + total_precharge_amount = precharge_amount + get_today_price.price_same_day elif prime_asked == 1 and same_day_asked == 0: - total_precharge_amount = precharge_amount + get_service_prices.price_prime + total_precharge_amount = precharge_amount + get_today_price.price_prime else: - total_precharge_amount = precharge_amount + get_service_prices.price_prime + get_service_prices.price_same_day + total_precharge_amount = precharge_amount + get_today_price.price_prime + get_today_price.price_same_day new_delivery = Delivery_Delivery( @@ -559,6 +580,9 @@ def create_a_delivery(user_id): pre_charge_amount=total_precharge_amount, total_price=precharge_amount, final_price=0, + driver_last_name = driver_l_name, + driver_first_name = driver_f_name, + driver_employee_id= driver_emp_id, ) diff --git a/app/delivery_status/__init__.py b/app/delivery_status/__init__.py new file mode 100644 index 0000000..0b58f5e --- /dev/null +++ b/app/delivery_status/__init__.py @@ -0,0 +1,7 @@ +# coding=utf-8 + +from flask import Blueprint + +deliverystatus = Blueprint('delivery_status', __name__) + +from . import views \ No newline at end of file diff --git a/app/delivery_status/views.py b/app/delivery_status/views.py new file mode 100644 index 0000000..a4a069f --- /dev/null +++ b/app/delivery_status/views.py @@ -0,0 +1,62 @@ +from flask import request, jsonify +from flask_login import current_user +from datetime import date, timedelta, time +from app.delivery_status import deliverystatus +from app import db +from datetime import datetime +from app.classes.customer import Customer_Customer +from app.classes.delivery import (Delivery_Delivery, + Delivery_Delivery_schema, + Delivery_Notes_Driver, + Delivery_Payment, + Delivery_Payment_schema, + ) +from app.classes.cards import Card_Card +from app.classes.pricing import Pricing_Oil_Oil +from app.classes.auth import Auth_User +from app.classes.pricing import Pricing_Service_General + + +@deliverystatus.route("/today/driver/", methods=["GET"]) +def get_deliveries_driver_day(user_id): + """ + Get deliveries for driver that day + """ + get_delivery = (db.session + .query(Delivery_Delivery) + .filter(Delivery_Delivery.driver_employee_id == user_id) + .filter(Delivery_Delivery.expected_delivery_date == date.today()) + .all()) + + delivery_schema = Delivery_Delivery_schema(many=True) + return jsonify(delivery_schema.dump(get_delivery)) + +@deliverystatus.route("/tommorrow/driver/", methods=["GET"]) +def get_deliveries_driver_tommorrow(user_id): + """ + Get deliveries for driver tommrrow + """ + tomm = datetime.now() + timedelta(days=1) + + get_delivery = (db.session + .query(Delivery_Delivery) + .filter(Delivery_Delivery.driver_employee_id == user_id) + .filter(Delivery_Delivery.expected_delivery_date == tomm) + .all()) + + delivery_schema = Delivery_Delivery_schema(many=True) + return jsonify(delivery_schema.dump(get_delivery)) + +@deliverystatus.route("/waiting/driver/", methods=["GET"]) +def get_deliveries_driver_waiting(user_id): + """ + waiting deliveries scheduled out + """ + get_delivery = (db.session + .query(Delivery_Delivery) + .filter(Delivery_Delivery.driver_employee_id == user_id) + .filter(Delivery_Delivery.delivery_status == 1) + .all()) + + delivery_schema = Delivery_Delivery_schema(many=True) + return jsonify(delivery_schema.dump(get_delivery)) diff --git a/app/employees/views.py b/app/employees/views.py index f569a2d..f956e2e 100644 --- a/app/employees/views.py +++ b/app/employees/views.py @@ -12,6 +12,7 @@ from app.classes.employee import Employee_Employee, Employee_Employee_schema @employees.route("/", methods=["GET"]) @login_required def get_specific_employee(userid): + print(userid) employee = db.session \ .query(Employee_Employee) \ .filter(Employee_Employee.id == userid) \ @@ -27,7 +28,6 @@ def get_specific_employee_user_id(userid): .query(Employee_Employee) \ .filter(Employee_Employee.user_id == userid) \ .first() - # print(employee.id) employee_schema = Employee_Employee_schema(many=False) return jsonify(employee_schema.dump(employee)) @@ -69,9 +69,11 @@ def all_employees(): def all_employees_drivers(): employee_list = db.session \ .query(Employee_Employee) \ - .filter(Employee_Employee.employee_type == 4) \ + .filter(or_(Employee_Employee.employee_type == 4, + Employee_Employee.employee_type == 8)) \ .all() - customer_schema = Employee_Employee_schema(mwany=True) + + customer_schema = Employee_Employee_schema(many=True) return jsonify(customer_schema.dump(employee_list)) @@ -152,7 +154,7 @@ def employee_edit(employee_id): e_type = request.json["employee_type"] e_start_date = request.json["employee_start_date"] e_end_date = request.json["employee_end_date"] - print(request.json["employee_end_date"]) + get_employee = db.session \ .query(Employee_Employee) \ diff --git a/app/info/views.py b/app/info/views.py index 9946af4..f8a6075 100644 --- a/app/info/views.py +++ b/app/info/views.py @@ -24,7 +24,6 @@ def get_service_price(): .first()) return jsonify({"ok": True, - 'same_day': get_price_query.price_same_day, 'price_hourly': get_price_query.price_service_hour, 'emergency_fee': get_price_query.price_emergency_call, 'emergency_rate': get_price_query.price_emergency_service_hour, diff --git a/app/payment/views.py b/app/payment/views.py index ed63fba..bb98f20 100644 --- a/app/payment/views.py +++ b/app/payment/views.py @@ -14,21 +14,15 @@ def set_card_main(user_id): .query(Card_Card) \ .filter(Card_Card.user_id == user_id) \ .count() - print(get_card_count) if get_card_count > 0: - print("true") - get_old_card = db.session \ .query(Card_Card) \ .filter(Card_Card.main_card == True) \ .filter(Card_Card.user_id == user_id) \ .first() - print(get_old_card.id) - get_old_card.main_card = False db.session.add(get_old_card) - db.session.commit() diff --git a/local_settings.py b/local_settings.py new file mode 100755 index 0000000..100b75c --- /dev/null +++ b/local_settings.py @@ -0,0 +1,54 @@ +import redis + + +class ApplicationConfig: + """ + Basic Configuration for a generic User + """ + CURRENT_SETTINGS = 'LOCAL' + # databases info + POSTGRES_USERNAME = 'postgres' + POSTGRES_PW = 'password' + POSTGRES_SERVER = '192.168.1.204:5432' + POSTGRES_DBNAME00 = 'eamco' + SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://{}:{}@{}/{}".format(POSTGRES_USERNAME, + POSTGRES_PW, + POSTGRES_SERVER, + POSTGRES_DBNAME00 + ) + SQLALCHEMY_BINDS = {'eamco': SQLALCHEMY_DATABASE_URI} + # sqlalchemy config + SQLALCHEMY_TRACK_MODIFICATIONS = False + TRAP_HTTP_EXCEPTIONS = True + PROPAGATE_EXCEPTIONS = True + DEBUG = True + UPLOADED_FILES_DEST_ITEM = '/data/item' + + # file uploads + UPLOADED_FILES_ALLOW = ['png', 'jpeg', 'jpg', 'png', 'gif'] + MAX_CONTENT_LENGTH = 5 * 2500 * 2500 + ALLOWED_EXTENSIONS = ['png', 'jpeg', 'jpg', 'png', 'gif'] + + # secret keys + SECRET_KEY = "youwillneverguessthiskeycia" + + # sessions + SESSION_COOKIE_NAME = "eamco_session" + SESSION_COOKIE_SECURE = False + SESSION_COOKIE_HTTPONLY = True + REMEMBER_COOKIE_HTTPONLY = True + SESSION_COOKIE_SAMESITE = "Strict" + SESSION_PERMANENT = False + SESSION_USE_SIGNER = True + + # CORS + + ORIGIN_URL = "*" + CORS_SEND_WILDCARD = False + CORS_SUPPORT_CREDENTIALS = True + CORS_EXPOSE_HEADERS = None + CORS_ALLOW_HEADERS = "*" + CORS_ORIGIN_WHITELIST = ['http://localhost:5173', '*'] + + + diff --git a/runProduction.py b/runProduction.py new file mode 100755 index 0000000..15c64c4 --- /dev/null +++ b/runProduction.py @@ -0,0 +1,11 @@ +# coding=utf-8 +from app import app + +PORT = 6000 +HOST = '0.0.0.0' +if __name__ == '__main__': + app.run( + host=HOST, + port=PORT, + threaded=True + )