From a702c456f68b12f87f7a395f7b6ecd78c572646a Mon Sep 17 00:00:00 2001 From: Connor McMillan Date: Fri, 7 Jul 2023 04:17:10 -0700 Subject: [PATCH] fix(apps): Release-candidate Fixed way too much stuff to feel confident in calling this the first release. --- .gitignore | 5 +- README.md | 172 +++++++++-- app.py | 9 +- apps/__init__.py | 76 +++-- apps/alpr/beautify.py | 14 +- apps/alpr/enums.py | 14 +- apps/alpr/models/alpr_alert.py | 2 +- apps/alpr/models/alpr_group.py | 16 +- apps/alpr/models/cache.py | 201 ++++++------ apps/alpr/models/custom_alert.py | 43 ++- apps/alpr/models/settings.py | 16 +- apps/alpr/models/vehicle.py | 49 ++- apps/alpr/notify.py | 13 +- apps/alpr/queue.py | 213 +++++++------ apps/alpr/routes/alert/routes.py | 12 + apps/alpr/routes/alerts/custom/routes.py | 44 ++- apps/alpr/routes/alerts/routes.py | 1 + apps/alpr/routes/capture/routes.py | 6 + apps/alpr/routes/search/routes.py | 160 +++++++++- apps/alpr/routes/settings/agents/routes.py | 24 +- .../settings/cameras/manufacturers/Dahua.py | 5 +- apps/alpr/routes/settings/cameras/routes.py | 31 +- apps/alpr/routes/settings/general/routes.py | 6 +- .../routes/settings/maintenance/routes.py | 98 +++--- .../settings/maintenance/rq_dashboard/test.py | 9 - apps/alpr/routes/settings/profile/routes.py | 3 + apps/alpr/routes/settings/routes.py | 24 +- apps/alpr/routes/settings/users/routes.py | 24 +- apps/alpr/routes/vehicle/__init__.py | 7 + apps/alpr/routes/vehicle/routes.py | 51 ++++ apps/api/controller/webhook_controller.py | 19 +- apps/api/service/cache_service.py | 69 +++-- apps/config.py | 1 + apps/helpers.py | 35 ++- apps/home/routes.py | 7 +- apps/messages.py | 1 + apps/static/assets/img/brand/dark.svg | 13 - apps/static/assets/img/brand/light.svg | 1 - .../img/favicon/android-chrome-192x192.png | Bin 2625 -> 9267 bytes .../img/favicon/android-chrome-512x512.png | Bin 7380 -> 26389 bytes .../assets/img/favicon/apple-touch-icon.png | Bin 2681 -> 2454 bytes .../assets/img/favicon/browserconfig.xml | 4 +- .../assets/img/favicon/favicon-16x16.png | Bin 314 -> 769 bytes .../assets/img/favicon/favicon-32x32.png | Bin 530 -> 1108 bytes apps/static/assets/img/favicon/favicon.ico | Bin 4286 -> 15086 bytes apps/static/assets/img/favicon/favicon.png | Bin 513 -> 0 bytes apps/static/assets/img/favicon/manifest.json | 20 -- .../assets/img/favicon/mstile-144x144.png | Bin 0 -> 2628 bytes .../assets/img/favicon/mstile-150x150.png | Bin 2627 -> 2608 bytes .../assets/img/favicon/mstile-310x150.png | Bin 0 -> 2868 bytes .../assets/img/favicon/mstile-310x310.png | Bin 0 -> 5539 bytes .../assets/img/favicon/mstile-70x70.png | Bin 0 -> 1880 bytes .../assets/img/favicon/safari-pinned-tab.svg | 38 ++- .../assets/img/favicon/site.webmanifest | 8 +- apps/static/assets/img/marker.svg | 2 - apps/static/assets/img/paypal-logo.svg | 69 ----- apps/static/assets/img/profile-cover.jpg | Bin 163522 -> 0 bytes .../static/assets/img/themesberg-logo-alt.svg | 1 - apps/static/assets/img/themesberg.svg | 1 - apps/templates/accounts/register.html | 2 +- apps/templates/home/alert.html | 69 +++-- apps/templates/home/capture.html | 72 +++-- apps/templates/home/custom-alert.html | 69 +++-- apps/templates/home/custom-alerts.html | 51 ++++ apps/templates/home/index.html | 47 +-- apps/templates/home/search.html | 82 ++++- apps/templates/home/vehicle-print.html | 140 +++++++++ apps/templates/home/vehicle.html | 288 ++++++++++++++++++ apps/templates/includes/sidebar.html | 2 +- apps/templates/layouts/base-print.html | 2 +- apps/templates/layouts/base.html | 12 +- apps/templates/settings/agents.html | 7 +- apps/templates/settings/cameras.html | 2 + apps/templates/settings/maintenance-app.html | 130 ++++++++ apps/templates/settings/notifications.html | 2 +- apps/templates/settings/profile.html | 22 +- apps/workers.py | 121 -------- log.py | 48 +++ media/API_KEY.png | Bin 0 -> 11947 bytes worker_manager.py | 68 +++++ worker_manager_enums.py | 25 ++ worker_manager_server.py | 240 +++++++++++++++ 82 files changed, 2401 insertions(+), 737 deletions(-) delete mode 100644 apps/alpr/routes/settings/maintenance/rq_dashboard/test.py create mode 100644 apps/alpr/routes/vehicle/__init__.py create mode 100644 apps/alpr/routes/vehicle/routes.py delete mode 100644 apps/static/assets/img/brand/dark.svg delete mode 100644 apps/static/assets/img/brand/light.svg delete mode 100644 apps/static/assets/img/favicon/favicon.png delete mode 100644 apps/static/assets/img/favicon/manifest.json create mode 100644 apps/static/assets/img/favicon/mstile-144x144.png create mode 100644 apps/static/assets/img/favicon/mstile-310x150.png create mode 100644 apps/static/assets/img/favicon/mstile-310x310.png create mode 100644 apps/static/assets/img/favicon/mstile-70x70.png delete mode 100644 apps/static/assets/img/marker.svg delete mode 100644 apps/static/assets/img/paypal-logo.svg delete mode 100644 apps/static/assets/img/profile-cover.jpg delete mode 100644 apps/static/assets/img/themesberg-logo-alt.svg delete mode 100644 apps/static/assets/img/themesberg.svg create mode 100644 apps/templates/home/vehicle-print.html create mode 100644 apps/templates/home/vehicle.html create mode 100644 apps/templates/settings/maintenance-app.html delete mode 100644 apps/workers.py create mode 100644 log.py create mode 100644 media/API_KEY.png create mode 100644 worker_manager.py create mode 100644 worker_manager_enums.py create mode 100755 worker_manager_server.py diff --git a/.gitignore b/.gitignore index d990d02..1a048d9 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,7 @@ ipban.ini apps/uploads/* # Synology Drive Client -.sync-exclude.lst \ No newline at end of file +.sync-exclude.lst + +# IPBan Log Directory +log/ \ No newline at end of file diff --git a/README.md b/README.md index 8fab391..f4b2cf1 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,15 @@ It was designed with an emphasis on security to meet organization/business needs # ❗ This project is still in pre-release. # 🐛 Known Bugs -- Worker management needs reimplementation - - Currently working on this +- ~~Worker management needs reimplementation~~ + - ~~Currently working on this~~ - Manually requeuing jobs fail - ~~Searching plates will only work if pagination position is on page 1~~ - ~~This is a grid.js issue [#1314](https://github.com/grid-js/gridjs/issues/1314) [#1344](https://github.com/grid-js/gridjs/pull/1334) [#1311](https://github.com/grid-js/gridjs/issues/1311).~~ # ✨ Upcoming Features - Integrate [Apprise](https://github.com/caronc/apprise) +- Add something similar to [DahuaSunriseSunset](https://github.com/bp2008/DahuaSunriseSunset) - Enhance search functionality - Add - Direction @@ -42,6 +43,20 @@ It was designed with an emphasis on security to meet organization/business needs - Add audit logs for each action - Add support for 2FA/MFA +# Development +- Run/Debug Configuration +Install Redis server and start it.
+Additionally, you can set Redis server to start automatically. See the Bare Server section + - OpenALPR-Webhook + - Set the Script path to `/app.py` + - Parameters should be set to `--host=0.0.0.0 --port=8080` + - Add `DEBUG=True` into Environment variables + - Set the Working directory to `` + - Redis Worker Server + - Add a new Run/Debug Configuration named "Worker Manager Server" + - Set the Script path to `/apps/workers.py` + - Set the Working directory to `/apps` + # Installation @@ -53,73 +68,171 @@ TBD 2. git https://github.com/mibs510/OpenALPR-Webhook 3. cd OpenALPR-Webhook 4. pip3 install -r requirements.txt -5. ./venv/Scripts/activate +5. ./venv/bin/activate 6. ./app.py --host=0.0.0.0 --port=8080 +#### Linux systemd service +You will want to create a service file to automatically start OpenALPR-Webhook upon each reboot. + +`sudo nano /etc/systemd/system/oalpr-wh.service` + + +` +[Unit] +Description=OpenALPR-Webhook +After=network.target + +[Service] +User=user +WorkingDirectory=/home/user/OpenALPR-Webhook +ExecStart=/home/user/OpenALPR-Webhook/app.py --host=0.0.0.0 --port=8080 +Restart=always + +[Install] +WantedBy=multi-user.target +` + +Be sure to modify `User`, `WorkingDirectory`, and `ExecStart` +
+Then execute: +
+`sudo systemctl daemon-reload` +`sudo systemctl enable oalpr-wh` +`sudo systemctl start oalpr-wh` + ### New Instance -Head over to the URL of your server. You will be required to login. Click on 'register' to create a super admin account. +Head over to the URL of your server. You will be required to login. Click 'register' to create a super admin account.
-After creating a super admin account, the register link will disappear as a protective measure against unauthorized account creation. +After creating a super admin account, the register link will throw an 'Access Denied' as a protective measure against unauthorized account creation.
-Accounts will need to be created manually by an administrator under Settings/Users +Accounts will need to be created manually by an administrator under Settings/Users. # Documentation ### Dashboard ___ - -### Alerts/Blacklist +The dashboard displays some simple statistics, recent alerts, and license plate captures. +### Alerts/Custom Alerts ___ -### Alerts/Search +Under Alerts/Custom Alerts, users can view alerts handled by OpenALPR-Webhook. +Each user, including administrators and the super administrator, can only view their own custom alerts. +Administrators and the super administrator can add other users as additional contacts to be notified when a match occurs. + +#### Print +Users can print a report by clicking on the print icon on the upper right hand corner. +Printing also allows the report to be saved as a PDF. + +#### Add a custom alert +To add a custom alert, go to Search->License Plates, click on the record, and then click on bell icon + +#### Region Match +Users have the ability to enable Match Region while adding a custom alert in Search->License Plates or
+Enabling this will tell OpenALPR-Webhook to require a region match of the +license plate for it to send a notification. The non-matched record will still appear in the Past History section under +Alerts/Custom Alerts or Search/License Plates. +### Alerts/Rekor™ Scout ___ +Rekor™ Scout alerts arrive from Rekor as alerts. You cannot modify the alert in OpenALPR-Webhook, to modify these alerts, ### Search ___ +Note: The Vehicle Information section for each report contains specifications of the type of vehicle that includes make, model, year, and body type. +OpenALPR-Webhook does not generate this data. This data is generated by Rekor Watchman Agent. +#### License Plates +View and search license plates grouped with vehicle details. +###### API_KEY +This field displays the last four characters of the API key that was used to submit this record. +This is useful for administrators to perform a reverse search of the user that is responsible for Rekor POSTing data. + + +#### Vehicles +View and search vehicles that did not have a license plate detected. +___ ### Settings/Agents ___ > Available to administrators only. > +Edit agent connection details here. These settings allow OpenALPR-Webhook to download high resolution images directly from the agent. +Users are not allowed to delete or add agents manually. Agents are registered as new agents are discovered by OpenALPR-Webhook. +Administrators can enable them after being registered for OpenALPR-Webhook to utilize. ### Settings/Cameras ___ > Available to administrators only. > +Similar to Settings/Agents. This section allows to specify connection details for each camera. +These settings are used to forcefully focus and zoom a camera at a specified interval. ### Settings/General ___ > Available to administrators only. > -Disable uuid_img download (pulls from agent if available real-time when viewing/printing reports) +#### Report Settings +These settings are used to rebrand generated reports using the print function. +#### IPBan Settings +An extended addon for +#### POST Auth Settings +###### Disable POST +Suspend all POSTing to OpenALPR-Webhook. +###### No Authorization Required +Highly unrecommended. This allows anyone (or thing) to POST data into OpenALPR-Webhook. This is a security issue as it +allows untrusted data into OpenALPR-Webhook. +###### Users & Admin API Tokens +The second-best option. This allows every user to POST data into OpenALPR-Webhook. +###### Admin API Tokens +The default option. Only data from Rekor that contains an admin's `API_KEY` is allowed to POST. +#### General Settings +###### Public URL +Specify the public URL used to access OpenALPR-Webhook. +Although not used by OpenALPR-Webhook at the moment, certain features that are yet to be implemented will require a valid URL. ### Settings/Maintenance/App ___ -Reinitiate cache -
-Redownload all missing uuid_imgs to db/locally -
-Trim database to keep X months of plates -
-Trim database to keep x months of high-res/uuid_imgs -
-Remove all high-res/uuid_imgs from db > Available to administrators only. > +#### Worker Manager Server +The Worker Manager Server is responsible for spawning and terminating Redis workers as needed. One worker is spawned for every agent and camera that is enabled. This allows OpenALPR-Webhook to scale as needed without interruptions. +Because Redis forks workers on the process level, the Worker Manager Server only runs on *nix systems. + + +##### Restart +Restart the server when experiencing issues with worker allocation. This will not restart the webserver. + + +##### Shutdown +Shutting down the server is essential when performing a soft restart on the webserver. This makes sure that no worker turns to a zombie. + + +These actions are not needed when performing a system reboot. ### Settings/Maintenance/Redis ___ > Available to administrators only. > +A front end to Redis server(s). This was made possible with [rq-dashboard](https://github.com/Parallels/rq-dashboard). +For each agent enabled, a worker is spawned and listens on the default queue. +Unlike for agents, a worker is spawned for each enabled camera and listens to a queue named the ID of the camera. +#### Queues +View a list of queues with job status +#### Jobs +View a list of jobs. +Note: It is advisable that no job, other than those of type `download_plate_image()`, be re-queued. +#### Workers +View a list of workers, the current job, and its associated queues ### Settings/Profile ___ Users can edit basic information about themselves such as name, website, email address, phone number, time zone, etc. -
+

Each user has a unique `API_KEY`. The `API_KEY` key used to authorize Rekor Scout to POST data onto the webhook endpoint. -
+

Administrators can set a global setting to limit which `API_KEY`'s can POST data. Refer to Settings/General. +

To begin receiving data into OpenALPR-Webhook, copy your `API_KEY` into [Rekor Scout](cloud.openalpr.com) > Configuration > WebHooks Configuration > Add New Webhook > Custom Data
`API_KEY: vvvvvvvv-wwww-xxxx-yyyy-zzzzzzzzzzzz`
-Be sure to fill in all other fields such as Destination URL, Description, check Send All Plate Reads, check Send Matching Alerts, and check Send Reads missing plate. +Be sure to fill in all other fields such as Destination URL, Description, check Send All Plate Reads, Send Matching Alerts, and Send Reads missing plate. +![Custom Data field](media/API_KEY.png) ### Settings/Notifications ___ > Available to administrators only. > +Specify notification settings for Twilio and SMTP. Valid SMTP settings are required to reset user passwords in Settings/Users. ### Settings/Users ___ > Available to administrators only. @@ -127,4 +240,17 @@ ___ Administrators can create users, edit users, change user roles, and suspend user accounts.
Once an account has been created, it cannot be deleted. This is to preserve accounts and their API tokens for audit -purposes. \ No newline at end of file +purposes (a feature yet to be implemented). + +#### Edit User +###### Status +The super administrator account cannot be suspended. + +###### Administrator +The super administrator account cannot be demoted. + +###### Reset Password +A valid SMTP server is required to reset passwords. A new generated password will be emailed to the user. + +#### Create/Add User +Click on the 'User+' icon located in upper right-hand corner to add a user. diff --git a/app.py b/app.py index 7aeca84..3a371fb 100644 --- a/app.py +++ b/app.py @@ -27,11 +27,12 @@ if DEBUG: - app.logger.info('DEBUG = ' + str(DEBUG)) - app.logger.info('Page Compression = ' + 'FALSE' if DEBUG else 'TRUE') - app.logger.info('DBMS = ' + app_config.SQLALCHEMY_DATABASE_URI) + app.logger.info("DEBUG = {}".format(str(DEBUG))) + app.logger.info("Page Compression = {}".format('FALSE' if DEBUG else 'TRUE')) + app.logger.info("DBMS = {}".format(app_config.SQLALCHEMY_DATABASE_URI)) if __name__ == "__main__": with app.app_context(): - app.run(host="0.0.0.0", port=8080) + # app.run(host="0.0.0.0", port=8080, debug=True, passthrough_errors=True, use_debugger=False, use_reloader=False) + app.run(host="0.0.0.0", port=8080) \ No newline at end of file diff --git a/apps/__init__.py b/apps/__init__.py index c85aea6..fc195c4 100644 --- a/apps/__init__.py +++ b/apps/__init__.py @@ -1,8 +1,11 @@ -import os.path +import logging +import os import platform import subprocess +import time from datetime import datetime +import setproctitle from flask_ipban import IpBan from flask_migrate import Migrate from redis import Redis @@ -13,15 +16,17 @@ from importlib import import_module from flask_mail import Mail +import log import version from apps.alpr.ipban_config import IPBanConfig -from apps.alpr.enums import WorkerType +from worker_manager import WorkerManager +from worker_manager_enums import WorkerType, WMSCommand +setproctitle.setproctitle("OpenALPR-Webhook") mail = Mail() db = SQLAlchemy() migrate = Migrate() default_q = Queue(WorkerType.General.value, connection=Redis()) -camera_q = Queue(WorkerType.Camera.value, connection=Redis()) Base = declarative_base() login_manager = LoginManager() ip_ban_config = IPBanConfig() @@ -41,7 +46,7 @@ def register_blueprints(app): 'alpr.routes.settings.cameras', 'alpr.routes.settings.general', 'alpr.routes.settings.maintenance', 'alpr.routes.settings.maintenance.rq_dashboard', 'alpr.routes.settings.notifications', 'alpr.routes.settings.profile', - 'alpr.routes.settings.users', 'home'): + 'alpr.routes.settings.users', 'alpr.routes.vehicle', 'home'): module = import_module('apps.{}.routes'.format(module_name)) app.register_blueprint(module.blueprint) @@ -57,7 +62,7 @@ def initialize_databases(): pass @app.before_first_request - def initialize_settings(): + def initialize_cache(): # Initiate cache when needed from apps.alpr.models.cache import Cache now = datetime.now() @@ -69,6 +74,8 @@ def initialize_settings(): Cache.filter_by_year(this_year) Cache.filter_by_year(next_year) + @app.before_first_request + def initialize_settings(): # Create default settings when needed from apps.alpr.models.settings import GeneralSettings settings = GeneralSettings.get_settings() @@ -77,23 +84,56 @@ def initialize_settings(): settings = GeneralSettings() settings.save() - # Start redis workers on Linux only - if platform.system() == "Linux": + @app.before_first_request + def start_workers(): + start_redis_workers() + + +def start_redis_workers(): + # Start redis workers on Linux only + if platform.system() == "Linuxx": + # Worker Manager Server + worker_manager_server = WorkerManager(WMSCommand.ACK) + worker_manager_server.debug = True + try: + subprocess.Popen(['python3', os.path.abspath(os.path.dirname(__file__) + "/..") + + '/worker_manager_server.py']) + time.sleep(3) + worker_manager_server.send() + except Exception as ex: + logging.error(ex) + + if worker_manager_server.last_connection(): + # General workers to download UUID images from agents + from apps.alpr.models.settings import AgentSettings + enabled_agents = AgentSettings.get_all_enabled() + for agent in enabled_agents: + worker_manager_server.command = WMSCommand.START_WORKER + worker_manager_server.worker_type = WorkerType.General + worker_manager_server.worker_id = agent.agent_uid + worker_manager_server.send() + # Cameras from apps.alpr.models.settings import CameraSettings - camera_workers = CameraSettings.get_all_enabled_count() - workers_cmd = subprocess.Popen(["python3", os.path.dirname(os.path.realpath(__file__)) + - "/workers.py", "-c", str(camera_workers), "-g", str(camera_workers)], - stderr=subprocess.PIPE, stdout=subprocess.PIPE) - output, error = workers_cmd.communicate() - if workers_cmd.returncode != 0: - app.logger.info("workers_cmd.returncode = {}".format(workers_cmd.returncode)) - app.logger.info("workers_cmd.errorcode = {}".format(str(error, 'utf-8'))) - - app.logger.info("workers_cmd.stdout = {}".format(workers_cmd.stdout)) - app.logger.info("workers_cmd.stderr = {}".format(workers_cmd.stderr)) + from apps.alpr import queue + enabled_cameras = CameraSettings.get_all_enabled() + try: + for camera in enabled_cameras: + worker_manager_server.command = WMSCommand.START_WORKER + worker_manager_server.worker_type = WorkerType.Camera + worker_manager_server.worker_id = camera.camera_id + worker_manager_server.send() + time.sleep(1) + # Add the function to the queue + q = Queue(camera.camera_id, connection=Redis()) + q.enqueue(queue.focus_camera, args=(camera.camera_id,), job_timeout=-1) + except Exception as ex: + logging.exception(ex) + else: + logging.error("Last connection to Worker Manager Server failed. Could not spin up redis workers!") def create_app(config) -> Flask: + log.init("OpenALPR-Webhook.log") app = Flask(__name__) app.config.from_object(config) mail.init_app(app) diff --git a/apps/alpr/beautify.py b/apps/alpr/beautify.py index 9fd2916..9d3a650 100644 --- a/apps/alpr/beautify.py +++ b/apps/alpr/beautify.py @@ -1,4 +1,5 @@ import json +import logging import time import pycountry @@ -68,11 +69,12 @@ def human_format(num: int) -> str: return '{}{}'.format('{:f}'.format(num).rstrip('0').rstrip('.'), ['', 'K', 'M', 'B', 'T'][magnitude]) -# Thanks to @hostingutilities.com at stackoverflow.com -# https://stackoverflow.com/a/43750422 -def human_size(bytes: int, units=[' bytes','KB','MB','GB','TB', 'PB', 'EB']) -> str: - """ Returns a human readable string representation of bytes """ - return str(bytes) + units[0] if bytes < 1024 else human_size(bytes >> 10, units[1:]) +def human_size(num, suffix="B"): + for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: + if abs(num) < 1024.0: + return f"{num:3.1f}{unit}{suffix}" + num /= 1024.0 + return f"{num:.1f}Yi{suffix}" def get_negative_mtm_svg_html_arrow() -> Markup: @@ -103,4 +105,4 @@ def name(ugly_name: str) -> str: def print_json(json_obj: str) -> None: - print(json.dumps(json_obj, ensure_ascii=False, indent=4)) + logging.debug(json.dumps(json_obj, ensure_ascii=False, indent=4)) diff --git a/apps/alpr/enums.py b/apps/alpr/enums.py index 8997b91..141d9fe 100644 --- a/apps/alpr/enums.py +++ b/apps/alpr/enums.py @@ -13,8 +13,9 @@ class AccountVerified(enum.Enum): class ChartType(enum.Enum): ALERT_CHART = "alert-chart" + CUSTOM_ALERT = "custom-alert" PLATES_CAPTURED_CHART = "plates-captured-chart" - TOP_REGION_CHART = "top-region-chart" + TOP_SECOND_REGION_CHART = "top-second-region-chart" class DataType(enum.Enum): @@ -23,18 +24,9 @@ class DataType(enum.Enum): VEHICLE = "vehicle" -class MultiProcessCommand(enum.Enum): - START_WORKER = "start-worker" - STOP_WORKER = "stop-worker" - CLOSE_CONNECTION = "close" - - class UserRole(enum.Enum): ADMIN = "ADMIN" REGULAR = "NONADMIN" -class WorkerType(enum.Enum): - # worker type = queue name - Camera = 'cameras' - General = 'default' + diff --git a/apps/alpr/models/alpr_alert.py b/apps/alpr/models/alpr_alert.py index c56bb68..78bf6e6 100644 --- a/apps/alpr/models/alpr_alert.py +++ b/apps/alpr/models/alpr_alert.py @@ -98,7 +98,7 @@ def filter_by_id_and_beautify(cls, _id: int) -> {}: else: return None - def filter_epoch_time(self) -> "ALPRAlert": + def filter_epoch_time(self) -> ["ALPRAlert"]: self.collection = self.query.filter((ALPRAlert.epoch_time / 1000) >= self.start_of_month_timestamp).filter( (ALPRAlert.epoch_time / 1000) <= self.end_of_month_timestamp).all() return self.collection diff --git a/apps/alpr/models/alpr_group.py b/apps/alpr/models/alpr_group.py index ceed530..6976eb6 100644 --- a/apps/alpr/models/alpr_group.py +++ b/apps/alpr/models/alpr_group.py @@ -71,6 +71,10 @@ def __init__(self, **kwargs): def filter_by_id(cls, _id: int) -> "ALPRGroup": return cls.query.filter_by(id=_id).first() + @classmethod + def filter_by_best_plate_number(cls, best_plate_number: str) -> "[ALPRGroup]": + return cls.query.filter_by(best_plate_number=best_plate_number).order_by(ALPRGroup.id.desc()).all() + @classmethod def filter_by_id_and_beautify(cls, _id: int) -> {}: record = cls.filter_by_id(_id) @@ -96,7 +100,7 @@ def filter_by_id_and_beautify(cls, _id: int) -> {}: 'epoch_start': record.epoch_start, 'epoch_start_datetime': dt.astimezone(record.epoch_start), 'epoch_end': record.epoch_end, - 'epoch_end_datetime': dt.astimezone(record.epoch_start), + 'epoch_end_datetime': dt.astimezone(record.epoch_end), 'best_confidence_percent': record.best_confidence_percent, 'best_region': beautify.country(record.best_region), 'travel_direction_class_tag': beautify.direction(record.travel_direction), @@ -117,17 +121,17 @@ def filter_by_id_and_beautify(cls, _id: int) -> {}: return None @classmethod - def get_latest_agent_label(cls, _agent_uid: int) -> str: + def get_latest_agent_label(cls, _agent_uid: str) -> str: record = cls.query.filter_by(agent_uid=_agent_uid).order_by(ALPRGroup.id.desc()).first() return record.web_server_config['agent_label'] @classmethod - def get_latest_agent_type(cls, _agent_uid: int) -> str: + def get_latest_agent_type(cls, _agent_uid: str) -> str: record = cls.query.filter_by(agent_uid=_agent_uid).order_by(ALPRGroup.id.desc()).first() return record.agent_type @classmethod - def get_latest_agent_version(cls, _agent_uid: int) -> str: + def get_latest_agent_version(cls, _agent_uid: str) -> str: record = cls.query.filter_by(agent_uid=_agent_uid).order_by(ALPRGroup.id.desc()).first() return record.agent_version @@ -151,6 +155,10 @@ def get_latest_camera_gps_longitude(cls, _camera_id: int) -> str: record = cls.query.filter_by(camera_id=_camera_id).order_by(ALPRGroup.id.desc()).first() return record.gps_longitude + @classmethod + def get_latest_by_best_plate_number(cls, best_plate_number: str, limit=2) -> "[ALPRGroup]": + return cls.query.filter_by(best_plate_number=best_plate_number).order_by(ALPRGroup.id.desc()).limit(limit) + @classmethod def get_oldest_agent_epoch_start(cls, _agent_uid: int) -> int: record = cls.query.filter_by(agent_uid=_agent_uid).order_by(ALPRGroup.id.asc()).first() diff --git a/apps/alpr/models/cache.py b/apps/alpr/models/cache.py index 86e2429..6682bf6 100644 --- a/apps/alpr/models/cache.py +++ b/apps/alpr/models/cache.py @@ -1,5 +1,6 @@ import logging import os +import pathlib import platform from datetime import datetime, timedelta @@ -26,20 +27,33 @@ class Cache(db.Model): year = db.Column(db.Integer) all_time_plates_captured = db.Column(db.Integer, default=0) all_time_alerts = db.Column(db.Integer, default=0) + all_time_custom_alerts = db.Column(db.Integer, default=0) all_time_vehicles = db.Column(db.Integer, default=0) month = db.Column(NestedMutableJson, - default=[{"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}, - {"license_plates_captured": 0, "alerts": 0, "vehicles": 0, "cameras": {}, "regions": {}}] + default=[{"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}, + {"license_plates_captured": 0, "alerts": 0, "custom_alerts": 0, "vehicles": 0, + "cameras": {}, "regions": {}}] ) def __init__(self, year=datetime.now().year, month=datetime.now().month): @@ -67,10 +81,24 @@ def get_alert_count(self, year: int, month: int) -> int: return cache.month[month - 1]['alerts'] + def get_combined_alert_count(self, year: int, month: int) -> int: + cache = self.filter_by_year(year) + if cache is None: + return 0 + + return cache.month[month - 1]['alerts'] + cache.month[month - 1]['custom_alerts'] + + def get_custom_alert_count(self, year: int, month: int) -> int: + cache = self.filter_by_year(year) + if cache is None: + return 0 + + return cache.month[month - 1]['custom_alerts'] + def get_all_db_file_sizes(self, raw=False) -> str: if raw: - return str(os.path.getsize("apps/db/alpr_alert.sqlite") + \ - os.path.getsize("apps/db/alpr_group.sqlite") + \ + return str(os.path.getsize("apps/db/alpr_alert.sqlite") + + os.path.getsize("apps/db/alpr_group.sqlite") + os.path.getsize("apps/db/vehicle.sqlite")) return beautify.human_size(os.path.getsize("apps/db/alpr_alert.sqlite") + @@ -116,21 +144,24 @@ def get_chart_series(self, chart: ChartType) -> []: last_month = 12 for i in range(12): - if chart == ChartType.PLATES_CAPTURED_CHART or chart == ChartType.TOP_REGION_CHART: + if chart == ChartType.PLATES_CAPTURED_CHART or chart == ChartType.TOP_SECOND_REGION_CHART: # License Plates Captured this_month_license_plate_count = self.get_license_plate_count(year, last_month) if chart == ChartType.PLATES_CAPTURED_CHART: series.append(this_month_license_plate_count) - elif chart == ChartType.TOP_REGION_CHART: + elif chart == ChartType.TOP_SECOND_REGION_CHART: # Top Region - this_month_top_region_count = self.get_top_region_count(year, last_month) - series.append(this_month_top_region_count) + this_month_top_second_region_count = self.get_top_second_region_count(year, last_month) + series.append(this_month_top_second_region_count) elif chart == ChartType.ALERT_CHART: # Alerts this_month_alert_count = self.get_alert_count(year, last_month) series.append(this_month_alert_count) + elif chart == ChartType.CUSTOM_ALERT: + this_month_custom_alert_count = self.get_custom_alert_count(year, last_month) + series.append(this_month_custom_alert_count) # Move to previous month last_month -= 1 @@ -152,8 +183,8 @@ def get_chart_labels(self, chart=None) -> []: for i in range(12): start_of_month = datetime(year=year, month=month, day=1) - if chart == ChartType.TOP_REGION_CHART: - pretty_region = beautify.country(self.get_top_region(year, month)) + if chart == ChartType.TOP_SECOND_REGION_CHART: + pretty_region = beautify.country(self.get_top_second_region(year, month)) series.append("{} - {}".format(start_of_month.strftime("%b %Y"), pretty_region)) else: series.append(start_of_month.strftime("%b %Y")) @@ -215,31 +246,33 @@ def get_quick_stats(self) -> {}: year -= 1 last_month = 12 - this_month_alert_count = self.get_alert_count(year, month) + this_month_alert_count = self.get_combined_alert_count(year, month) this_month_license_plate_count = self.get_license_plate_count(year, month) # print("this_month_license_plate_count = {}".format(this_month_license_plate_count)) - this_month_top_region = self.get_top_region(year, month) - # print("this_month_top_region = {}".format(this_month_top_region)) - this_month_top_region_count = self.get_top_region_count(year, month) - # print("this_month_top_region_count = {}".format(this_month_top_region_count)) + this_month_top_second_region = self.get_top_second_region(year, month) + # print("this_month_top_second_region = {}".format(this_month_top_second_region)) + this_month_top_second_region_count = self.get_top_second_region_count(year, month) + # print("this_month_top_second_region_count = {}".format(this_month_top_second_region_count)) response['this_month_alert_count'] = this_month_alert_count + response['this_month_rekor_alert_count'] = self.get_alert_count(year, month) + response['this_month_custom_alert_count'] = self.get_custom_alert_count(year, month) response['this_month_license_plate_count'] = this_month_license_plate_count - response['this_month_top_region'] = beautify.country(this_month_top_region) - response['this_month_top_region_count'] = this_month_top_region_count + response['this_month_top_second_region'] = beautify.country(this_month_top_second_region) + response['this_month_top_second_region_count'] = this_month_top_second_region_count last_month_alert_count = self.get_alert_count(year, last_month) last_month_license_plate_count = self.get_license_plate_count(year, last_month) # print("last_month_license_plate_count = {}".format(last_month_license_plate_count)) - last_month_top_region = self.get_top_region(year, last_month) - # print("last_month_top_region = {}".format(last_month_top_region)) - last_month_top_region_count = self.get_region_count(year, last_month, this_month_top_region) - # print("last_month_top_region_count = {}".format(last_month_top_region_count)) + last_month_top_second_region = self.get_top_second_region(year, last_month) + # print("last_month_top_second_region = {}".format(last_month_top_second_region)) + last_month_top_second_region_count = self.get_region_count(year, last_month, this_month_top_second_region) + # print("last_month_top_second_region_count = {}".format(last_month_top_second_region_count)) response['last_month_alert_count'] = last_month_alert_count response['last_month_license_plate_count'] = last_month_license_plate_count - response['last_month_top_region'] = beautify.country(last_month_top_region) - response['last_month_top_region_count'] = last_month_top_region_count + response['last_month_top_second_region'] = beautify.country(last_month_top_second_region) + response['last_month_top_second_region_count'] = last_month_top_second_region_count # Calculate Month-To-Month for the number of plates captured if last_month_license_plate_count != 0: @@ -289,29 +322,37 @@ def get_quick_stats(self) -> {}: response["this_month_alerts_mtm_percent"] = mtm_alerts_percent - # Calculate Month-To-Month for the top region - if last_month_top_region != "N/A" and this_month_top_region != "N/A": - mtm_region_percent = ((this_month_top_region_count / last_month_top_region_count) - 1) * 100 - mtm_region_percent = round(mtm_region_percent, 1) - # Determine the color/class of the percentage - if mtm_region_percent < 0: - response['this_month_top_region_mtm_class'] = "text-danger" - response['this_month_top_region_mtm_svg_html_arrow'] = beautify.get_negative_mtm_svg_html_arrow() - elif mtm_region_percent == 0: - response['this_month_top_region_mtm_class'] = "" - elif mtm_region_percent > 0: - response['this_month_top_region_mtm_class'] = "text-success" - response['this_month_top_region_mtm_svg_html_arrow'] = beautify.get_positive_mtm_svg_html_arrow() - elif last_month_top_region_count == 0 and this_month_top_region_count != 0: + # Calculate Month-To-Month for the top second region + if last_month_top_second_region != "N/A" and this_month_top_second_region != "N/A": + if last_month_top_second_region == this_month_top_second_region: + mtm_region_percent = \ + ((this_month_top_second_region_count / last_month_top_second_region_count) - 1) * 100 + mtm_region_percent = round(mtm_region_percent, 1) + # Determine the color/class of the percentage + if mtm_region_percent < 0: + response['this_month_top_second_region_mtm_class'] = "text-danger" + response['this_month_top_second_region_mtm_svg_html_arrow'] = \ + beautify.get_negative_mtm_svg_html_arrow() + elif mtm_region_percent == 0: + response['this_month_top_second_region_mtm_class'] = "" + elif mtm_region_percent > 0: + response['this_month_top_second_region_mtm_class'] = "text-success" + response['this_month_top_second_region_mtm_svg_html_arrow'] = \ + beautify.get_positive_mtm_svg_html_arrow() + else: + mtm_region_percent = 100 + response['this_month_top_second_region_mtm_class'] = "text-success" + response['this_month_top_second_region_mtm_svg_html_arrow'] = beautify.get_positive_mtm_svg_html_arrow() + elif last_month_top_second_region_count == 0 and this_month_top_second_region_count != 0: mtm_region_percent = 100 - response['this_month_top_region_mtm_class'] = "text-success" - response['this_month_top_region_mtm_svg_html_arrow'] = beautify.get_positive_mtm_svg_html_arrow() + response['this_month_top_second_region_mtm_class'] = "text-success" + response['this_month_top_second_region_mtm_svg_html_arrow'] = beautify.get_positive_mtm_svg_html_arrow() else: mtm_region_percent = 0 - response['this_month_top_region_mtm_class'] = "" - response['this_month_top_region_mtm_svg_html_arrow'] = "" + response['this_month_top_second_region_mtm_class'] = "" + response['this_month_top_second_region_mtm_svg_html_arrow'] = "" - response["this_month_top_region_mtm_percent"] = mtm_region_percent + response["this_month_top_second_region_mtm_percent"] = mtm_region_percent return response @@ -403,7 +444,15 @@ def get_top_region(self, year, month) -> str: return "N/A" length = len(list(cache.month[month - 1]['regions'])) - return str(list(cache.month[month - 1]['regions'].keys())[1]) if length != 0 else "N/A" + return str(list(cache.month[month - 1]['regions'].keys())[0]) if length != 0 else "N/A" + + def get_top_second_region(self, year, month) -> str: + cache = self.filter_by_year(year) + if cache is None: + return "N/A" + + length = len(list(cache.month[month - 1]['regions'])) + return str(list(cache.month[month - 1]['regions'].keys())[1]) if length >= 1 else "N/A" def get_top_region_count(self, year: int, month: int) -> int: cache = self.filter_by_year(year) @@ -411,7 +460,15 @@ def get_top_region_count(self, year: int, month: int) -> int: return 0 length = len(list(cache.month[month - 1]['regions'])) - return int(list(cache.month[month - 1]['regions'].values())[1]) if length != 0 else 0 + return int(list(cache.month[month - 1]['regions'].values())[0]) if length != 0 else 0 + + def get_top_second_region_count(self, year: int, month: int) -> int: + cache = self.filter_by_year(year) + if cache is None: + return 0 + + length = len(list(cache.month[month - 1]['regions'])) + return int(list(cache.month[month - 1]['regions'].values())[1]) if length >= 1 else 0 def init(self): try: @@ -504,7 +561,8 @@ def init(self): agent_cache = AgentCache.filter_by_agent_uid(agent_uid) if agent_settings is None: agent_settings = AgentSettings(agent_uid, alpr_group.get_latest_agent_label(agent_uid)) - agent_settings.created = datetime.fromtimestamp(ALPRGroup.get_oldest_agent_epoch_start(agent_uid) / 1000) + agent_settings.created = \ + datetime.fromtimestamp(ALPRGroup.get_oldest_agent_epoch_start(agent_uid) / 1000) agent_settings.save() if agent_cache is None: agent_cache = AgentCache(agent_uid, alpr_group.get_latest_agent_label(agent_uid)) @@ -514,7 +572,6 @@ def init(self): agent_cache.agent_type = alpr_group.get_latest_agent_type(agent_uid) agent_cache.save() - # Populate cache cache.all_time_plates_captured += this_month_license_plate_count cache.all_time_alerts += this_month_alert_count @@ -651,35 +708,3 @@ def save(self) -> None: db.session.close() error = str(e.__dict__['orig']) raise InvalidUsage(error, 422) - - -class Counter(db.Model): - __bind_key__ = 'cache' - __tablename__ = 'Counter' - - id = db.Column(db.Integer, primary_key=True) - key = db.Column(db.String) - count = db.Column(db.Integer) - - def __init__(self, key: str): - self.key = key - self.count = 0 - - @classmethod - def filter_by_key(cls, key: str) -> "Counter": - return cls.query.filter_by(key=key).first() - - def one_down(self): - self.count -= 1 - - def one_up(self): - self.count += 1 - - def save(self) -> None: - try: - db.session.add(self) - db.session.commit() - except SQLAlchemyError as e: - db.session.rollback() - db.session.close() - logging.exception(e) diff --git a/apps/alpr/models/custom_alert.py b/apps/alpr/models/custom_alert.py index 2d75611..6686a92 100644 --- a/apps/alpr/models/custom_alert.py +++ b/apps/alpr/models/custom_alert.py @@ -1,4 +1,4 @@ -from datetime import datetime +import logging from flask_login import current_user @@ -95,25 +95,38 @@ def filter_by_license_plate(cls, _license_plate: str) -> "CustomAlert": def filter_by_submitted_user_id(cls, _submitted_by_user_id: int) -> ["CustomAlert"]: return cls.query.filter_by(submitted_by_user_id=_submitted_by_user_id).all() - def get_dashboard_records(self, current_user, n=3) -> []: - custom_alerts = self.query.filter_by(submitted_by_user_id=current_user.id).order_by(CustomAlert.id.desc()).limit(n) + def get_dashboard_records(self, n=3) -> []: + custom_alerts = \ + self.query.filter_by(submitted_by_user_id=current_user.id).order_by(CustomAlert.id.desc()).limit(n) data = [] dt = helper.Timezone(current_user) - for record in custom_alerts: - alpr_group = ALPRGroup.filter_by_id(record.alpr_group_id) - data.append({ - 'id': record.id, - 'month': dt.month(alpr_group.epoch_start), - 'day': dt.day(alpr_group.epoch_start), - 'plate_number': record.license_plate, - 'epoch_time_datetime': dt.astimezone(alpr_group.epoch_start), - 'site_name': alpr_group.web_server_config['agent_label'], - 'camera_name': alpr_group.web_server_config['camera_label'], - 'description': helper.shorten_description(record.description) - }) + for alert in custom_alerts: + alpr_group = ALPRGroup.get_latest_by_best_plate_number(alert.license_plate) + for record in alpr_group: + data.append({ + 'id': record.id, + 'month': dt.month(record.epoch_start), + 'day': dt.day(record.epoch_start), + 'plate_number': record.best_plate_number, + 'epoch_time_datetime': dt.astimezone(record.epoch_start), + 'site_name': record.web_server_config['agent_label'], + 'camera_name': record.web_server_config['camera_label'], + 'description': helper.shorten_description(alert.description) + }) return data + def delete(self) -> None: + try: + db.session.delete(self) + db.session.commit() + except SQLAlchemyError as e: + db.session.rollback() + db.session.close() + error = str(e.__dict__['orig']) + raise InvalidUsage(error, 422) + return + def save(self) -> None: try: db.session.add(self) diff --git a/apps/alpr/models/settings.py b/apps/alpr/models/settings.py index 8f0d509..5330c79 100644 --- a/apps/alpr/models/settings.py +++ b/apps/alpr/models/settings.py @@ -51,9 +51,13 @@ def filter_by_id(cls, id: str) -> "AgentSettings": return cls.query.filter_by(id=id).first() @classmethod - def get_all(cls, _agent_uid: str) -> "AgentSettings": + def get_all(cls, _agent_uid: str) -> ["AgentSettings"]: return cls.query.all() + @classmethod + def get_all_enabled(cls) -> ["AgentSettings"]: + return cls.query.filter_by(enabled=True) + def save(self) -> None: try: db.session.add(self) @@ -98,13 +102,9 @@ def filter_by_id(cls, _id: int) -> "CameraSettings": return cls.query.filter_by(id=_id).first() @classmethod - def get_all_enabled(cls) -> []: + def get_all_enabled(cls) -> ["CameraSettings"]: return cls.query.filter_by(enable=True) - @classmethod - def get_all_enabled_count(cls) -> int: - return cls.query.filter_by(enable=True).count() - @classmethod def get_camera_label(cls, _camera_id: int) -> "CameraSettings": camera = cls.query.filter_by(camera_id=_camera_id).first() @@ -142,7 +142,7 @@ class EmailNotificationSettings(db.Model): recipients = db.Column(db.String) @classmethod - def get_recipients(cls) -> []: + def get_recipients(cls) -> [str]: settings = cls.query.filter_by(id=id).first() recipients = settings.recipients @@ -176,7 +176,7 @@ class GeneralSettings(db.Model): logo = db.Column(db.String, default=default_org_logo) org_name = db.Column(db.String, default="OpenALPR-Webhook") post_auth = db.Column(db.Enum(PostAuth), default=PostAuth.ADMINS_ONLY) - public_url = db.Column(db.String) + public_url = db.Column(db.String, default="https://openalpr-webhook") @classmethod def get_settings(cls) -> "GeneralSettings": diff --git a/apps/alpr/models/vehicle.py b/apps/alpr/models/vehicle.py index 8eee21d..d6aef01 100644 --- a/apps/alpr/models/vehicle.py +++ b/apps/alpr/models/vehicle.py @@ -4,6 +4,9 @@ from apps import db, helpers from sqlalchemy.ext.mutable import MutableDict + +from apps.alpr import beautify +from apps.alpr.models.alpr_group import ALPRGroup from apps.exceptions.exception import InvalidUsage @@ -70,7 +73,50 @@ def filter_by_id(cls, _id: int) -> "Vehicle": return cls.query.filter_by(id=_id).first() @classmethod - def filter_epoch_start(self) -> "Vehicle": + def filter_by_id_and_beautify(cls, _id: int) -> {}: + record = cls.filter_by_id(_id) + + if record: + dt = helpers.Timezone(current_user, msecs=True) + return { + 'uuid_jpg': record.uuid_jpg, + 'overview_jpeg': record.overview_jpeg, + 'vehicle_crop_jpeg': record.vehicle_crop_jpeg, + 'agent_label': ALPRGroup.get_latest_agent_label(record.agent_uid), + 'agent_uid': record.agent_uid, + 'agent_version': record.agent_version, + 'agent_type': record.agent_type, + 'camera_label': ALPRGroup.get_latest_camera_label(record.camera_id), + 'camera_id': record.camera_id, + 'gps_latitude': record.gps_latitude, + 'gps_longitude': record.gps_longitude, + 'country': beautify.name(record.country), + 'id': record.id, + 'epoch_start': record.epoch_start, + 'epoch_start_datetime': dt.astimezone(record.epoch_start), + 'epoch_end': record.epoch_end, + 'epoch_end_datetime': dt.astimezone(record.epoch_end), + 'is_vehicle_confidence_percent': round(float(record.vehicle['is_vehicle'][0]['confidence']), 0), + 'travel_direction_class_tag': beautify.direction(record.travel_direction), + 'travel_direction': round(float(record.travel_direction), 0), + 'vehicle_color_name': record.vehicle_color_name, + 'vehicle_color_confidence': record.vehicle_color_confidence, + 'vehicle_year_name': record.vehicle_year_name, + 'vehicle_year_confidence': record.vehicle_year_confidence, + 'vehicle_make_name': record.vehicle_make_name, + 'vehicle_make_confidence': record.vehicle_make_confidence, + 'vehicle_make_model_name': record.vehicle_make_model_name, + 'vehicle_make_model_confidence': record.vehicle_make_model_confidence, + 'vehicle_body_type_name': record.vehicle_body_type_name, + 'vehicle_body_type_confidence': record.vehicle_body_type_confidence, + 'vehicle_signature': record.vehicle_signature + } + + else: + return None + + @classmethod + def filter_epoch_start(self) -> ["Vehicle"]: self.collection = self.query.filter((Vehicle.epoch_start / 1000) >= self.start_of_month_timestamp).filter( (Vehicle.epoch_start / 1000) <= self.end_of_month_timestamp).all() return self.collection @@ -98,6 +144,5 @@ def save(self) -> None: except Exception as e: db.session.rollback() db.session.close() - print(e) error = str(e.__dict__['orig']) raise InvalidUsage(error, 422) diff --git a/apps/alpr/notify.py b/apps/alpr/notify.py index a1e0e4b..4608fe4 100644 --- a/apps/alpr/notify.py +++ b/apps/alpr/notify.py @@ -1,4 +1,5 @@ import enum +import logging import smtplib import ssl from email.mime.text import MIMEText @@ -29,11 +30,11 @@ def __init__(self): self._settings = EmailNotificationSettings.get_settings() self.recipients = self._settings.recipients - def send(self) -> None: + def send(self) -> bool: # Stop if Email is disabled if not self._settings.enabled: - return + return False try: # Split the string to create a list: user1@example.com,user2@example.com -> @@ -47,15 +48,17 @@ def send(self) -> None: msg = MIMEText(self.body) msg['To'] = recipient msg['From'] = self._settings.username_email - msg['Subject'] = "[{}] OpenALPR-Webhook: {}".format(self.tag, self.subject) + msg['Subject'] = "[{}] {} - OpenALPR-Webhook".format(self.tag, self.subject) server.login(self._settings.username_email, self._settings.password) server.send_message(msg) except Exception as ex: - raise ex + logging.exception(ex) + return False + return True def send_test(self) -> None: try: - self.tag = Tag.TEST + self.tag = Tag.TEST.value self.subject = "SMTP Test" self.body = "This is a test 🧪 message from OpenALPR-Web🪝!" self.send() diff --git a/apps/alpr/queue.py b/apps/alpr/queue.py index a045f18..b9f16f7 100644 --- a/apps/alpr/queue.py +++ b/apps/alpr/queue.py @@ -40,27 +40,32 @@ def download_plate_image(agent_uid: str, img_uuid: str, data_type: str, foreign_ # Get agent IP/hostname & port agent = AgentSettings.filter_by_agent_uid(agent_uid) + + download_dir = os.path.abspath(os.path.dirname(__file__) + "../../../") + "/" + download_folder_name + + # Create directory when needed + if not os.path.exists(download_dir): + os.makedirs(download_dir) + + # Email object email = Email() - email.tag = "Agent" + email.tag = Tag.AGENT.value + email.subject = "Plate Image Save Failed" + email.recipients = EmailNotificationSettings.recipients if agent is None: - logging.info("Agent does not exist.") - email.subject = "Unknown Agent" - email.body = "Failed to download high resolution image. Agent does not exist." \ - "\n\nAgent UID: {}\nIMG UID: {}".format(agent_uid, img_uuid) - email.send() - raise Exception("Failed to download a plate image. Agent does not exist.") + logging.info("Agent (ID: {}) does not exist.".format(agent_uid)) + raise Exception("Failed to download a plate image. Agent (ID: {}) does not exist.".format(agent_uid)) elif agent.enabled: + url = "http://{}:{}/img/{}.jpg".format(agent.ip_hostname, agent.port, img_uuid) try: - url = "http://{}:{}/img/{}.jpg".format(agent.ip_hostname, agent.port, img_uuid) logging.info("Downloading: {}".format(url)) # Download it req = requests.get(url, stream=True) if req.status_code == 200: # Create a path to save it to - full_file_path = Path(os.path.abspath(os.path.dirname(__file__) + "../../../") + "/" + - download_folder_name + img_uuid + ".jpg").absolute() + full_file_path = Path(download_dir + img_uuid + ".jpg").absolute() # Write to disk with open(full_file_path, 'wb') as jpg: shutil.copyfileobj(req.raw, jpg) @@ -68,63 +73,74 @@ def download_plate_image(agent_uid: str, img_uuid: str, data_type: str, foreign_ else: logging.info("Failed to download high resolution plate image. HTTP status_code={}".format( req.status_code)) - email.subject = "High Resolution Image Download Failed" - email.body = "Failed to download high resolution image. HTTP status code from agent was not 200.\n\n" \ - "Agent UID: {}\nIMG UID: {}\nHTTP Status: {}".format(agent_uid, img_uuid, - req.status_code) + + email.body = "⚠️ Failed to download high resolution image. " \ + "HTTP status code from agent was not 200.\n\nLabel: {}\nUID: {}\n" \ + "IMG UID: {}\nURL: {}\nHTTP Status: {}".format( + agent.agent_label, agent_uid, img_uuid, url, req.status_code) email.send() - raise Exception("Failed to download the plate image. HTTP status_code={}".format(req.status_code)) + + raise Exception("Failed to download high resolution plate image. HTTP status_code={}".format( + req.status_code)) except Exception as ex: logging.info("Failed to download the plate image") - email.subject = "High Resolution Image Download Failed" - email.body = "Failed to download high resolution image. Incorrect IP/hostname & port? Make sure" \ - "OpenALPR-Webhook can access the agent.\n\nAgent UID: {}\nIMG UID: {}\n" \ - "Exception: {}".format(agent_uid, img_uuid, ex) + + email.body = "⚠️ Failed to download high resolution image. Incorrect IP/hostname & port? Make sure" \ + "OpenALPR-Webhook can access the agent.\n\nLabel: {}\nUID: {}\nIMG UID: {}\n" \ + "URL: {}\nException: {}".format(agent.agent_label, agent_uid, img_uuid, url, ex) email.send() raise Exception(ex) # Find the original record record = None + dt = DataType(data_type) - if data_type == DataType.GROUP: + if dt == DataType.GROUP: record = ALPRGroup.filter_by_id(foreign_id) - elif data_type == DataType.ALERT: + elif dt == DataType.ALERT: record = ALPRAlert.filter_by_id(foreign_id) - elif data_type == DataType.VEHICLE: + elif dt == DataType.VEHICLE: record = Vehicle.filter_by_id(foreign_id) + elif dt is None: + raise Exception("Unknown data_type = {}".format(data_type)) - # Insert the image in the db - try: - # Read it while encoding it into base64 - with open(full_file_path, "rb") as image_file: - encoded_string = base64.b64encode(image_file.read()) - uuid_jpg = encoded_string.decode("utf-8") + if record is not None: + # Insert the image in the db + try: + # Read it while encoding it into base64 + with open(full_file_path, "rb") as image_file: + encoded_string = base64.b64encode(image_file.read()) + uuid_jpg = encoded_string.decode("utf-8") - # Insert into `uuid_jpg column` - record.uuid_jpg = uuid_jpg + # Insert into `uuid_jpg column` + record.uuid_jpg = uuid_jpg - # Save/update the db - record.save() + # Save/update the db + record.save() - # Delete the .jpg afterwards - if os.path.isfile(full_file_path): - os.remove(full_file_path) - return True - except Exception as ex: - logging.exception(ex) - logging.info("Failed to save the plate image") - EmailNotificationSettings.send("App", "Plate Image Save Failed", - "Failed to save plate image into the database." - "\n\nAgent UID: {}\nIMG UID: {}\nException: {}".format(agent_uid, img_uuid, - ex)) - # Delete the jpg if something happens above - # if os.path.isfile(full_file_path): - # os.remove(full_file_path) + # Delete the .jpg afterwards + if os.path.isfile(full_file_path): + os.remove(full_file_path) + return True + except Exception as ex: + logging.exception(ex) + logging.info("Failed to save the plate image") + + email.body = "⚠️ Failed to download high resolution image from agent.\n\n" \ + "Label: {}\nUID: {}\nImage UID: {}\nException: {}\n".format(agent.agent_label, + agent.agent_uid, img_uuid, ex) + email.send() + + # Delete the jpg if something happens above + if os.path.isfile(full_file_path): + os.remove(full_file_path) + raise Exception(ex) + else: + logging.error("Record #{} of type {} not found. dt = {}".format(foreign_id, data_type, dt)) - raise Exception(ex) elif not agent.enabled: - logging.info("Agent is disabled.") + logging.info("Agent (Label: {}) is disabled.".format(agent.agent_label)) def focus_camera(camera_id: int): @@ -133,6 +149,12 @@ def focus_camera(camera_id: int): app = create_app(app_config) app.app_context().push() + # Email + email = Email() + email.tag = Tag.CAMERA.value + email.subject = "Force Focus & Zoom Failed" + email.recipients = EmailNotificationSettings.recipients + # Run in an infinite loop unless if an administrator disables forced focus & zoom checks while True: # Get camera IP/hostname, port, username, password, etc. @@ -154,79 +176,86 @@ def focus_camera(camera_id: int): try: dahua_if.set_focus_and_zoom() except Exception as ex: - logging.error("Could not set camera focus and zoom.\nException: {}".format(ex)) + logging.error("Could not set camera focus and zoom.") + logging.exception(ex) + + # Send to each email address specified in the Notifications settings page + if camera.notify_on_failed_interval_check: + email.body = "⚠️ Failed to force focus and zoom camera.\n\n" \ + "Label: {}\nUID: {}\nException: {}\n".format(camera.camera_label, camera.camera_id, ex) + + email.send() # Sleep - for second in range(camera.focus_zoom_interval_check * 60): - time.sleep(1) + time.sleep(camera.focus_zoom_interval_check) else: raise Exception("Unsupported camera manufacturer '{}' for camera ID# {}.".format(camera.manufacturer, camera.camera_id)) -def send_alert(custom_alert_id: int): +def send_alert(custom_alert_id: int, alpr_group_id: int): # Make the application context available here. This function is forked into a separate process and the database # connections needs to be reintroduced. app = create_app(app_config) app.app_context().push() + # Email + email = Email() + email.tag = Tag.ALERT.value + try: custom_alert = CustomAlert.filter_by_id(custom_alert_id) - alpr_group = ALPRGroup.filter_by_id(custom_alert.alpr_group_id) + custom_alert_alpr_group = ALPRGroup.filter_by_id(custom_alert.alpr_group_id) + alpr_group = ALPRGroup.filter_by_id(alpr_group_id) if custom_alert: - if alpr_group: - report_settings = GeneralSettings.get_settings() - submitted_user = User.find_by_id(custom_alert.submitted_by_user_id) - submitted_user_profile = UserProfile.find_by_user_id(custom_alert.submitted_by_user_id) - - email = Email() - email.tag = Tag.ALERT - email.subject = "{} Match! - OpenALPR-Webhook".format(custom_alert.license_plate) - # Add a publicly accessible URL - email.body = "🚨 Custom Alert: {}\n\n{}\n\nLocation/Agent: {}\n\nCamera: {}\n\nOrganization: {}\n\n" \ - "OpenALPR-Webhook".\ - format(custom_alert.license_plate, custom_alert.description, - alpr_group.web_server_config['agent_label'], - alpr_group.web_server_config['camera_label'], report_settings.org_name) - - # Send email alert to receipt first - if helper.are_valid_email_recipients(submitted_user.email): - email.recipients = submitted_user.email - email.send() + email.subject = "{} Match!".format(custom_alert.license_plate) + + report_settings = GeneralSettings.get_settings() + submitted_user = User.find_by_id(custom_alert.submitted_by_user_id) + submitted_user_profile = UserProfile.find_by_user_id(custom_alert.submitted_by_user_id) + + # Add a publicly accessible URL + email.body = "🚨 Custom Alert: {}\n\n{}\nLocation/Agent: {}\nCamera: {}\nOrganization: {}\n".format( + custom_alert.license_plate, custom_alert.description, custom_alert_alpr_group.web_server_config['agent_label'], + custom_alert_alpr_group.web_server_config['camera_label'], report_settings.org_name) + + # Send email alert to submitter first + if helper.are_valid_email_recipients(submitted_user.email): + email.recipients = submitted_user.email + email.send() - sms = SMS() - sms.msg = "🚨 Custom Alert: {}\n\n{}\n\nLocation/Agent: {}\n\nCamera: {}\n\nOrganization: {}\n\n" \ - "OpenALPR-Webhook".format(custom_alert.license_plate, custom_alert.description, - alpr_group.web_server_config['agent_label'], - alpr_group.web_server_config['camera_label'], - report_settings.org_name) - - # Send email alert to receipt first - if helper.are_valid_sms_recipients(submitted_user_profile.phone): - sms.recipients = submitted_user_profile.phone - sms.send() - - # Send to additional recipients - if custom_alert.notify_user_ids is not None: - for id in custom_alert.notify_user_ids: - user = User.find_by_id(id) - user_profile = UserProfile.find_by_user_id(id) + sms = SMS() + sms.msg = "🚨 Custom Alert: {}\n\n{}\n\nLocation/Agent: {}\n\nCamera: {}\n\nOrganization: {}\n\n" \ + "OpenALPR-Webhook".format(custom_alert.license_plate, custom_alert.description, + custom_alert_alpr_group.web_server_config['agent_label'], + custom_alert_alpr_group.web_server_config['camera_label'], + report_settings.org_name) + + # Send sms alert to submitter first + if helper.are_valid_sms_recipients(submitted_user_profile.phone): + sms.recipients = submitted_user_profile.phone + sms.send() + + # Send to additional recipients + if custom_alert.notify_user_ids is not None: + for _id in custom_alert.notify_user_ids: + user = User.find_by_id(_id) + user_profile = UserProfile.find_by_user_id(_id) + if user is not None: if helper.are_valid_email_recipients(user.email): email.recipients = user.email email.send() + if user_profile is not None: if helper.are_valid_sms_recipients(user_profile.phone): sms.recipients = user_profile.phone sms.send() else: - print("ALPR Group #{} was not found in the database.".format(custom_alert.alpr_group_id)) logging.exception("ALPR Group #{} was not found in the database.".format(custom_alert.alpr_group_id)) raise Exception("ALPR Group #{} was not found in the database.".format(custom_alert.alpr_group_id)) else: - print("Custom alert #{} was not found in the database.".format(custom_alert_id)) logging.exception("Custom alert #{} was not found in the database.".format(custom_alert_id)) raise Exception("Custom alert #{} was not found in the database.".format(custom_alert_id)) except Exception as ex: - print(ex) logging.exception(ex) diff --git a/apps/alpr/routes/alert/routes.py b/apps/alpr/routes/alert/routes.py index 4ed4ef9..e234928 100644 --- a/apps/alpr/routes/alert/routes.py +++ b/apps/alpr/routes/alert/routes.py @@ -15,6 +15,9 @@ @blueprint.route('/custom/', methods=["GET"]) @login_required def custom_alert(id): + if id is None: + return render_template('home/page-404.html') + alert = CustomAlert.filter_by_id_and_beautify(id) dt = helpers.Timezone(current_user) @@ -33,6 +36,9 @@ def custom_alert(id): @blueprint.route('/custom/print/', methods=["GET"]) @login_required def print_custom_alert(id): + if id is None: + return render_template('home/page-404.html') + alert = ALPRAlert.filter_by_id_and_beautify(id) dt = helpers.Timezone(current_user) @@ -50,6 +56,9 @@ def print_custom_alert(id): @blueprint.route('/rekor/', methods=["GET"]) @login_required def alpr_alert(id): + if id is None: + return render_template('home/page-404.html') + alert = ALPRAlert.filter_by_id_and_beautify(id) dt = helpers.Timezone(current_user) @@ -67,6 +76,9 @@ def alpr_alert(id): @blueprint.route('/rekor/print/', methods=["GET"]) @login_required def print_alpr_alert(id): + if id is None: + return render_template('home/page-404.html') + alert = ALPRAlert.filter_by_id_and_beautify(id) dt = helpers.Timezone(current_user) diff --git a/apps/alpr/routes/alerts/custom/routes.py b/apps/alpr/routes/alerts/custom/routes.py index 25e7bfd..5f33662 100644 --- a/apps/alpr/routes/alerts/custom/routes.py +++ b/apps/alpr/routes/alerts/custom/routes.py @@ -1,10 +1,10 @@ import logging -from flask import request, jsonify +from flask import request, jsonify, render_template from flask_login import current_user, login_required import apps.helpers as helper -from apps import db +from apps import db, helpers from apps.alpr.models.alpr_group import ALPRGroup from apps.alpr.models.custom_alert import CustomAlert from apps.alpr.routes.alerts.custom import blueprint @@ -22,7 +22,8 @@ def add(): region_match = bool(data.get('region_match')) description = data.get('description') username = current_user.username - notify_user_ids = str(data.get('notify_user_ids')).split(',') + notify_user_ids = [] if data.get('notify_user_ids') == 'null' else str(data.get('notify_user_ids')).split(',') + user = User.find_by_username(username) @@ -48,23 +49,49 @@ def add(): return jsonify({'error': message['duplicate_custom_alert']}), 404 +@blueprint.route('/delete/', methods=["PUT"]) +@login_required +def delete(id): + + alert_record = CustomAlert.filter_by_id(id) + user = User.find_by_username(current_user.username) + + if alert_record: + if user: + if alert_record.submitted_by_user_id == user.id: + alert_record.delete() + else: + return jsonify({'error': message['illegal_access']}), 404 + else: + return jsonify({'error': message['user_not_found']}), 404 + else: + return jsonify({'message': message['custom_alert_not_found']}), 200 + + return jsonify({'message': message['custom_alert_added_successfully']}), 200 + + @blueprint.route('/edit', methods=["PUT"]) @login_required def edit(): data = request.form id = int(data.get('id')) + custom_alert = CustomAlert.filter_by_id(id) region_match = bool(data.get('region_match')) description = data.get('description') username = current_user.username - notify_user_ids = data.get('notify_user_ids') if data.get('notify_user_ids') == 'null' else str(data.get('notify_user_ids')).split(',') + notify_user_ids = [] if data.get('notify_user_ids') == 'null' else str(data.get('notify_user_ids')).split(',') user = User.find_by_username(username) - if notify_user_ids != "null" and user.status != RoleType['ADMIN']: + if notify_user_ids != "null" and user.role != RoleType['ADMIN']: return jsonify({'error': message['illegal_access']}), 404 - custom_alert = CustomAlert.filter_by_id(id) + # Each user can only edit their own records + if custom_alert: + if custom_alert.submitted_by_user_id != user.id: + return jsonify({'error': message['illegal_access']}), 404 + if custom_alert: try: custom_alert.region_match = region_match @@ -107,7 +134,7 @@ def query(): 'id': record.id, 'site': alpr_group.web_server_config['agent_label'], 'camera': alpr_group.web_server_config['camera_label'], - 'plate_number': record.license_plate, + 'plate_number': alpr_group.best_plate_number, 'plate_crop_jpeg': alpr_group.best_plate['plate_crop_jpeg'], 'direction': alpr_group.travel_direction_class_tag, 'confidence': alpr_group.best_confidence_percent, @@ -124,6 +151,9 @@ def query(): @blueprint.route('//choices.js', methods=["GET"]) @login_required def setChoices(id): + if id is None: + return render_template('home/page-404.html') + custom_alert = CustomAlert.filter_by_id(int(id)) if custom_alert: return jsonify(helper.setChoices(current_user, custom_alert.notify_user_ids)) diff --git a/apps/alpr/routes/alerts/routes.py b/apps/alpr/routes/alerts/routes.py index 9c4ab0a..7c2d9c9 100644 --- a/apps/alpr/routes/alerts/routes.py +++ b/apps/alpr/routes/alerts/routes.py @@ -1,6 +1,7 @@ from flask import render_template from flask_login import login_required + from apps.alpr.routes.alerts import blueprint diff --git a/apps/alpr/routes/capture/routes.py b/apps/alpr/routes/capture/routes.py index 155b4bc..d706275 100644 --- a/apps/alpr/routes/capture/routes.py +++ b/apps/alpr/routes/capture/routes.py @@ -14,6 +14,9 @@ @blueprint.route('/', methods=["GET"]) @login_required def plate(id): + if id is None: + return render_template('home/page-404.html') + license_plate = ALPRGroup.filter_by_id_and_beautify(id) dt = helpers.Timezone(current_user) user_profile = UserProfile.find_by_user_id(current_user.id) @@ -31,6 +34,9 @@ def plate(id): @blueprint.route('/print/', methods=["GET"]) @login_required def print_plate(id): + if id is None: + return render_template('home/page-404.html') + license_plate = ALPRGroup.filter_by_id_and_beautify(id) dt = helpers.Timezone(current_user) diff --git a/apps/alpr/routes/search/routes.py b/apps/alpr/routes/search/routes.py index ba7a1d4..94923f1 100644 --- a/apps/alpr/routes/search/routes.py +++ b/apps/alpr/routes/search/routes.py @@ -1,9 +1,11 @@ from flask import render_template, request from flask_login import login_required, current_user -from sqlalchemy import func from apps import db, helpers +from apps.alpr import beautify +from apps.alpr.models.alpr_alert import ALPRAlert from apps.alpr.models.alpr_group import ALPRGroup +from apps.alpr.models.vehicle import Vehicle from apps.alpr.routes.search import blueprint @@ -13,9 +15,45 @@ def search(): return render_template('home/search.html', segment='search') -@blueprint.route('/query', methods=["GET"]) +@blueprint.route('/query/alert/', methods=["GET"]) @login_required -def query(): +def query_alert_plate(plate): + if plate is None: + return render_template('home/page-404.html') + + query = ALPRAlert.query.filter_by(plate_number=plate).order_by(ALPRAlert.id.desc()) + total = query.count() + + # pagination + start = request.args.get('start', type=int, default=-1) + length = request.args.get('length', type=int, default=-1) + if start != -1 and length != -1: + query = query.offset(start).limit(length) + + dt = helpers.Timezone(current_user) + data = [] + for record in query: + data.append({ + 'id': record.id, + 'site': ALPRGroup.get_latest_agent_label(record.agent_uid), + 'camera': ALPRGroup.get_latest_camera_label(record.group['camera_id']), + 'plate_number': record.plate_number, + 'plate_crop_jpeg': record.group['best_plate']['plate_crop_jpeg'], + 'direction': record.travel_direction_class_tag, + 'confidence': record.best_confidence_percent, + 'time': dt.astimezone(record.epoch_time) + }) + + # response + return { + 'data': data, + 'total': total, + } + + +@blueprint.route('/query/group', methods=["GET"]) +@login_required +def query_group(): query = ALPRGroup.query.order_by(ALPRGroup.id.desc()) # search filter @@ -52,7 +90,115 @@ def query(): } -def get_count(q): - count_q = q.statement.with_only_columns([func.count()]).order_by(None) - count = q.session.execute(count_q).scalar() - return count +@blueprint.route('/query/', methods=["GET"]) +@login_required +def query_plate(plate): + if plate is None: + return render_template('home/page-404.html') + + query = ALPRGroup.query.filter_by(best_plate_number=plate).order_by(ALPRGroup.id.desc()) + total = query.count() + + # pagination + start = request.args.get('start', type=int, default=-1) + length = request.args.get('length', type=int, default=-1) + if start != -1 and length != -1: + query = query.offset(start).limit(length) + + dt = helpers.Timezone(current_user) + data = [] + for record in query: + data.append({ + 'id': record.id, + 'site': record.web_server_config['agent_label'], + 'camera': record.web_server_config['camera_label'], + 'plate_number': record.best_plate_number, + 'plate_crop_jpeg': record.best_plate['plate_crop_jpeg'], + 'direction': record.travel_direction_class_tag, + 'confidence': record.best_confidence_percent, + 'time': dt.astimezone(record.epoch_start) + }) + + # response + return { + 'data': data, + 'total': total, + } + + +@blueprint.route('/query/vehicle', methods=["GET"]) +@login_required +def query_vehicle(): + query = Vehicle.query.order_by(Vehicle.id.desc()) + + # search filter + search = request.args.get('search') + if search: + query = query.filter(db.or_(Vehicle.vehicle_color_name.like(f'%{search}%'), + Vehicle.vehicle_make_name.like(f'%{search}%'), + Vehicle.vehicle_make_model_name.like(f'%{search}%'))) + + total = query.count() + + # pagination + start = request.args.get('start', type=int, default=-1) + length = request.args.get('length', type=int, default=-1) + if start != -1 and length != -1: + query = query.offset(start).limit(length) + + dt = helpers.Timezone(current_user) + data = [] + for record in query: + data.append({ + 'id': record.id, + 'site': ALPRGroup.get_latest_agent_label(record.agent_uid), + 'camera': ALPRGroup.get_latest_camera_label(record.camera_id), + 'color': beautify.name(record.vehicle_color_name), + 'ym': record.vehicle_year_name + " " + beautify.name(record.vehicle_make_model_name), + 'vehicle_crop_jpeg': record.vehicle_crop_jpeg, + 'direction': record.travel_direction_class_tag, + 'time': dt.astimezone(record.epoch_start) + }) + + # response + return { + 'data': data, + 'total': total, + } + + +@blueprint.route('/query/vehicle/signature/', methods=["GET"]) +@login_required +def query_vehicle_signature(signature): + if signature is None: + return render_template('home/page-404.html') + + query = Vehicle.query.filter_by(vehicle_signature=signature).order_by(Vehicle.id.desc()) + + total = query.count() + + # pagination + start = request.args.get('start', type=int, default=-1) + length = request.args.get('length', type=int, default=-1) + if start != -1 and length != -1: + query = query.offset(start).limit(length) + + dt = helpers.Timezone(current_user) + data = [] + for record in query: + data.append({ + 'id': record.id, + 'site': ALPRGroup.get_latest_agent_label(record.agent_uid), + 'camera': ALPRGroup.get_latest_camera_label(record.camera_id), + 'color': beautify.name(record.vehicle_color_name), + 'ym': record.vehicle_year_name + " " + beautify.name(record.vehicle_make_model_name), + 'vehicle_crop_jpeg': record.vehicle_crop_jpeg, + 'direction': record.travel_direction_class_tag, + 'time': dt.astimezone(record.epoch_start) + }) + + # response + return { + 'data': data, + 'total': total, + } diff --git a/apps/alpr/routes/settings/agents/routes.py b/apps/alpr/routes/settings/agents/routes.py index 0b1313c..e6880cd 100644 --- a/apps/alpr/routes/settings/agents/routes.py +++ b/apps/alpr/routes/settings/agents/routes.py @@ -1,12 +1,18 @@ import logging +import time + from flask import render_template, request, jsonify from flask_login import current_user, login_required +from rq import Queue + +import worker_manager from apps import db from apps.alpr.models.settings import AgentSettings from apps.alpr.routes.settings.agents import blueprint from apps.authentication.routes import ROLE_ADMIN import apps.helpers as helper from apps.helpers import message +from worker_manager_enums import WorkerType, WMSCommand @blueprint.route('/search', methods=["GET"]) @@ -98,6 +104,7 @@ def edit(): agent = AgentSettings.filter_by_id(data.get('id')) if agent: + previously_enabled = agent.enabled try: # Update it! agent.ip_hostname = ip_hostname @@ -107,7 +114,22 @@ def edit(): # Reload workers and queues. Someone may have enabled an agent which will require a worker and queue # dedicated to that agent - # reload_wqs() + + try: + if previously_enabled != enabled: + if enabled: + wms = worker_manager.WorkerManager(WMSCommand.START_WORKER) + wms.worker_id = agent.agent_uid + wms.worker_type = WorkerType.General + wms.debug = True + wms.send() + else: + wms = worker_manager.WorkerManager(WMSCommand.STOP_WORKER) + wms.worker_id = agent.agent_uid + wms.debug = True + wms.send() + except Exception as ex: + logging.exception(ex) except Exception as ex: logging.exception(ex) diff --git a/apps/alpr/routes/settings/cameras/manufacturers/Dahua.py b/apps/alpr/routes/settings/cameras/manufacturers/Dahua.py index b88af55..5d806d4 100644 --- a/apps/alpr/routes/settings/cameras/manufacturers/Dahua.py +++ b/apps/alpr/routes/settings/cameras/manufacturers/Dahua.py @@ -108,7 +108,7 @@ def set_focus_and_zoom(self) -> bool: for i in range(5): response = requests.get(url, auth=HTTPDigestAuth(self.username, self.password)) time.sleep(1) - logging.debug("Camera {}/{} HTTP response status code: {}".format(self.label, self.id, + logging.debug("Camera {} (ID: {}) HTTP response status code: {}".format(self.label, self.id, response.status_code)) except Exception as ex: logging.exception(ex) @@ -122,5 +122,4 @@ def set_focus_and_zoom(self) -> bool: format(self.focus, self.zoom, values['status.Focus'], values['status.Zoom'])) return False except Exception as ex: - logging.exception(ex) - raise ex + raise Exception(ex) diff --git a/apps/alpr/routes/settings/cameras/routes.py b/apps/alpr/routes/settings/cameras/routes.py index abee873..b716f45 100644 --- a/apps/alpr/routes/settings/cameras/routes.py +++ b/apps/alpr/routes/settings/cameras/routes.py @@ -1,8 +1,13 @@ import logging +import time + from flask import render_template, request, jsonify from flask_login import current_user, login_required +from redis.client import Redis +from rq import Queue from apps import db +from apps.alpr import queue from apps.alpr.models.cache import CameraCache from apps.alpr.models.settings import CameraSettings from apps.alpr.routes.settings.cameras import blueprint @@ -10,6 +15,8 @@ from apps.authentication.routes import ROLE_ADMIN from apps.helpers import message import apps.helpers as helper +from worker_manager import WorkerManager +from worker_manager_enums import WMSCommand, WorkerType @blueprint.route('/edit', methods=['GET', 'POST']) @@ -111,7 +118,7 @@ def save(): focus_zoom_interval_check = data.get('focus_zoom_interval_check') notify_on_failed_interval_check = bool(data.get('notify_on_failed_interval_check')) manufacturer = data.get('manufacturer') - enable = data.get('enable') + enable = bool(data.get('enable')) # Check to if we can even put the values through the validators if len(hostname) == 0: @@ -145,8 +152,28 @@ def save(): camera.focus_zoom_interval_check = focus_zoom_interval_check camera.notify_on_failed_interval_check = notify_on_failed_interval_check camera.manufacturer = manufacturer - camera.enable = bool(enable) + previously_enabled = camera.enable + camera.enable = enable camera.save() + try: + if previously_enabled != enable: + if enable: + wms = WorkerManager(WMSCommand.START_WORKER) + wms.debug = True + wms.worker_type = WorkerType.Camera + wms.worker_id = camera.camera_id + wms.send() + time.sleep(1) + # Add the function to the queue + q = Queue(camera.camera_id, connection=Redis()) + q.enqueue(queue.focus_camera, args=(camera.camera_id,), job_timeout=-1) + else: + wms = WorkerManager(WMSCommand.STOP_WORKER) + wms.debug = True + wms.worker_id = camera.camera_id + wms.send() + except Exception as ex: + logging.exception(ex) except Exception as ex: logging.exception(ex) return "could_not_process" diff --git a/apps/alpr/routes/settings/general/routes.py b/apps/alpr/routes/settings/general/routes.py index d33b7b4..2db0b3b 100644 --- a/apps/alpr/routes/settings/general/routes.py +++ b/apps/alpr/routes/settings/general/routes.py @@ -113,9 +113,9 @@ def edit_report_settings(): logging.exception(ex) return jsonify({'error': message['error_updating_brand_logo']}), 500 - # Organization name - settings.org_name = data.get('org_name') - settings.save() + # Organization name + settings.org_name = data.get('org_name') + settings.save() return jsonify({'message': message['report_settings_saved']}), 200 else: diff --git a/apps/alpr/routes/settings/maintenance/routes.py b/apps/alpr/routes/settings/maintenance/routes.py index 35d3c0c..22c09ae 100644 --- a/apps/alpr/routes/settings/maintenance/routes.py +++ b/apps/alpr/routes/settings/maintenance/routes.py @@ -1,13 +1,13 @@ import logging +import platform from flask import render_template, jsonify from flask_login import login_required, current_user -from marshmallow import fields import apps.alpr.get as Get from apps.alpr.models.alpr_alert import ALPRAlert from apps.alpr.models.alpr_group import ALPRGroup -from apps.alpr.models.cache import Cache, Counter, CameraCache, AgentCache +from apps.alpr.models.cache import Cache, CameraCache, AgentCache from apps.alpr.models.vehicle import Vehicle from apps.alpr.routes.settings.maintenance import blueprint from apps.api.schemas.alpr_alert_schema import ALPRAlertSchema @@ -18,6 +18,8 @@ from apps.api.service.vehicle_service import VehicleService from apps.authentication.models import User from apps.authentication.routes import ROLE_ADMIN +from worker_manager import WorkerManager +from worker_manager_enums import WMSCommand @blueprint.route('/init/cache', methods=["GET"]) @@ -30,7 +32,6 @@ def init_cache_db(): Cache.query.delete() AgentCache.query.delete() CameraCache.query.delete() - Counter.query.delete() cache = Cache.filter_by_year() if cache is None: @@ -58,58 +59,36 @@ def import_db(): get = Get.Get() group_collection = get.collection(database="group") - print("len(group_collection) = {}".format(len(group_collection))) + logging.info("len(group_collection) = {}".format(len(group_collection))) alert_collection = get.collection(database="alert") - print("len(alert_collection) = {}".format(len(alert_collection))) + logging.info("len(alert_collection) = {}".format(len(alert_collection))) vehicle_collection = get.collection(database="vehicle") - print("len(vehicle_collection) = {}".format(len(vehicle_collection))) - - alpr_group_counter = Counter.filter_by_key("alpr_group") - if alpr_group_counter is None: - alpr_group_counter = Counter("alpr_group") - - alpr_alert_counter = Counter.filter_by_key("alpr_alert") - if alpr_alert_counter is None: - alpr_alert_counter = Counter("alpr_alert") - - vehicle_counter = Counter.filter_by_key("vehicle") - if vehicle_counter is None: - vehicle_counter = Counter("vehicle") + logging.info("len(vehicle_collection) = {}".format(len(vehicle_collection))) for i in range(len(group_collection)): request_data = group_collection[i] - alpr_group_counter.one_up() try: validated_data = alpr_group_schema.load(request_data) alpr_group_service.create(validated_data) except Exception as ex: - alpr_group_counter.one_down() - print("transfer_db: (alpr_group) ex = {}".format(ex)) - print("transfer_db: (alpr_group) request_data = {}".format(request_data)) + logging.debug("transfer_db: (alpr_group) ex = {}".format(ex)) + logging.debug("transfer_db: (alpr_group) request_data = {}".format(request_data)) for i in range(len(alert_collection)): request_data = alert_collection[i] - alpr_alert_counter.one_up() try: validated_data = alpr_alert_schema.load(request_data) alpr_alert_service.create(validated_data) except Exception as ex: - alpr_alert_counter.one_down() - print("transfer_db: (alpr_alert) ex = {}".format(ex)) - print("transfer_db: (alpr_alert) request_data = {}".format(request_data)) + logging.debug("transfer_db: (alpr_alert) ex = {}".format(ex)) + logging.debug("transfer_db: (alpr_alert) request_data = {}".format(request_data)) for i in range(len(vehicle_collection)): request_data = vehicle_collection[i] - vehicle_counter.one_up() try: validated_data = vehicle_schema.load(request_data) vehicle_service.create(validated_data) except Exception as ex: - vehicle_counter.one_down() - print("transfer_db: (vehicle) ex = {}".format(ex)) - print("transfer_db: (vehicle) request_data = {}".format(request_data)) - - alpr_group_counter.save() - alpr_alert_counter.save() - vehicle_counter.save() + logging.debug("transfer_db: (vehicle) ex = {}".format(ex)) + logging.debug("transfer_db: (vehicle) request_data = {}".format(request_data)) # Rewrite the API_TOKEN to that of the super_admin super_admin = User.find_by_id(1) @@ -130,3 +109,54 @@ def import_db(): vehicle.save() return jsonify({'msg': "Records migrated to SQLite!"}), 200 + + +@blueprint.route('/shutdown/wms', methods=["POST"]) +@login_required +def shutdown_wms(): + if current_user.role != ROLE_ADMIN: + return render_template('home/page-403.html') + + if platform.system() != "Linux": + return jsonify({'error': 'Unsupported platform. Redis server is not running.'}), 404 + + try: + wms = WorkerManager(WMSCommand.STOP_ALL) + logging.debug("Sending STOP_ALL command") + wms.send() + wms.command = WMSCommand.STOP_SERVER + logging.debug("Sending STOP_SERVER command") + wms.send() + except Exception or TimeoutError as ex: + logging.exception(ex) + return jsonify({'error': str(ex)}), 404 + + return jsonify({'message': 'Worker Manager Server shutdown successfully!'}), 200 + + +@blueprint.route('/restart/wms', methods=["GET"]) +@login_required +def restart_wms(): + if current_user.role != ROLE_ADMIN: + return render_template('home/page-403.html') + + try: + + wms = WorkerManager(WMSCommand.STOP_ALL) + logging.debug("Sending STOP_ALL command") + wms.send() + wms.command = WMSCommand.STOP_SERVER + logging.debug("Sending STOP_SERVER command") + wms.send() + + from apps import start_redis_workers + start_redis_workers() + + except Exception or TimeoutError as ex: + logging.exception(ex) + if TimeoutError: + return jsonify({'error': 'Connection to Worker Manager Server timed out!'}), 404 + elif Exception: + return jsonify({'error': 'Unknown error occurred!'}), 404 + + return jsonify({'msg': 'Worker Manager Server shutdown successfully!'}), 200 diff --git a/apps/alpr/routes/settings/maintenance/rq_dashboard/test.py b/apps/alpr/routes/settings/maintenance/rq_dashboard/test.py deleted file mode 100644 index 761855c..0000000 --- a/apps/alpr/routes/settings/maintenance/rq_dashboard/test.py +++ /dev/null @@ -1,9 +0,0 @@ -from apps import default_q -from apps.alpr.routes.settings.maintenance.rq_dashboard.queue_functions import count_words_at_url - -if __name__ == "__main__": - for i in range(10): - job = default_q.enqueue(count_words_at_url, 'http://nvie.com') - print(job.result) - - diff --git a/apps/alpr/routes/settings/profile/routes.py b/apps/alpr/routes/settings/profile/routes.py index 8dd5784..93f86ca 100644 --- a/apps/alpr/routes/settings/profile/routes.py +++ b/apps/alpr/routes/settings/profile/routes.py @@ -6,6 +6,7 @@ from flask_login import login_required, current_user from werkzeug.utils import secure_filename +from apps import helpers from apps.alpr.routes.settings.profile import blueprint from apps.authentication.models import User, UserProfile from apps.authentication.routes import upload_folder_name, ROLE_ADMIN, ROLE_USER, STATUS_ACTIVE, STATUS_SUSPENDED @@ -55,6 +56,8 @@ def edit(): # Change avatar if image: + # Create directory if it doesn't exist + helpers.mkdir(upload_folder_name) filename = unique_file_name(secure_filename(image.filename)) full_file_path = os.path.join(upload_folder_name, filename) try: diff --git a/apps/alpr/routes/settings/routes.py b/apps/alpr/routes/settings/routes.py index 8c41138..acc78d5 100644 --- a/apps/alpr/routes/settings/routes.py +++ b/apps/alpr/routes/settings/routes.py @@ -3,12 +3,14 @@ from flask_login import login_required, current_user from flask_paginate import get_page_parameter, Pagination -from apps import IPBanConfig, ip_ban_config +from apps import ip_ban_config from apps.alpr.models.settings import EmailNotificationSettings, TwilioNotificationSettings, GeneralSettings, PostAuth from apps.alpr.routes.settings import blueprint from apps.alpr.routes.settings.cameras.manufacturers import get_camera_manufacturers from apps.authentication.models import User, UserProfile from apps.authentication.routes import ROLE_ADMIN +from worker_manager import WorkerManager +from worker_manager_enums import WMSCommand @blueprint.route('/agents', methods=["GET"]) @@ -39,6 +41,24 @@ def general(): ipban=ip_ban_config.get_settings(), post_auth_levels=PostAuth) +@blueprint.route('/maintenance/app', methods=["GET"]) +@login_required +def maintenance_app(): + if current_user.role != ROLE_ADMIN: + return render_template('home/page-403.html') + + wms_status = False + try: + wms = WorkerManager(WMSCommand.ACK) + wms.send() + wms_status = wms.last_connection() + except Exception: + pass + + return render_template('settings/maintenance-app.html', segment='settings-maintenance-app', + wms_status=wms_status) + + @blueprint.route('/notifications', methods=["GET"]) @login_required def notifications(): @@ -127,4 +147,4 @@ def users(): segment='settings-users' ) - return redirect(url_for('home_blueprint.index')) \ No newline at end of file + return redirect(url_for('home_blueprint.index')) diff --git a/apps/alpr/routes/settings/users/routes.py b/apps/alpr/routes/settings/users/routes.py index e9bdaa7..3045f42 100644 --- a/apps/alpr/routes/settings/users/routes.py +++ b/apps/alpr/routes/settings/users/routes.py @@ -6,7 +6,7 @@ from apps import db, helpers from apps.alpr.models.settings import EmailNotificationSettings -from apps.alpr.notify import Email +from apps.alpr.notify import Email, Tag from apps.alpr.routes.settings.users import blueprint from apps.authentication.models import User, UserProfile from apps.authentication.routes import STATUS_ACTIVE, STATUS_SUSPENDED, ROLE_ADMIN, ROLE_USER @@ -23,7 +23,7 @@ def check_smtp(): settings = EmailNotificationSettings.get_settings() if settings is None: - return jsonify({'error': 'Settings have not been initialized'}), 404 + return jsonify({'error': 'Empty SMTP settings. Valid SMTP settings required to reset user passwords.'}), 404 # Validate SMTP settings is_valid_hostname = helpers.is_valid_hostname(settings.hostname) @@ -106,6 +106,12 @@ def edit(): profile.address = data.get('address') profile.zipcode = data.get('zipcode') profile.phone = data.get('phone') + + # Check phone number validity + if data.get('phone') != "": + if not helpers.are_valid_sms_recipients(profile.phone): + return jsonify({'error': message['invalid_phone_number']}), 404 + profile.email = data.get('email') profile.website = data.get('website') @@ -123,6 +129,12 @@ def edit(): profile.address = data.get('address') profile.zipcode = data.get('zipcode') profile.phone = data.get('phone') + + # Check phone number validity + if data.get('phone') != "": + if not helpers.are_valid_sms_recipients(profile.phone): + return jsonify({'error': message['invalid_phone_number']}), 404 + profile.website = data.get('website') profile.save() @@ -200,14 +212,14 @@ def reset_password(): password = pg.generate() user.password = hash_pass(password) email = Email() - email.tag = "Account" - email.subject = "Account Password Reset" + email.tag = Tag.ACCOUNT.value + email.subject = "Password Reset" email.body = "Hello {},\nYour password has been reset.\nYour new password is: {}".format(user.username, password) email.recipients = [user.email] - email.send() # Don't save the new user password unless an email was sent without an exception - user.save() + if email.send(): + user.save() except Exception as ex: logging.exception(ex) return jsonify({'error': 'Something went wrong! Please make sure email SMTP settings are correct.'}), 404 diff --git a/apps/alpr/routes/vehicle/__init__.py b/apps/alpr/routes/vehicle/__init__.py new file mode 100644 index 0000000..ef10da5 --- /dev/null +++ b/apps/alpr/routes/vehicle/__init__.py @@ -0,0 +1,7 @@ +from flask import Blueprint + +blueprint = Blueprint( + 'vehicle', + __name__, + url_prefix='/vehicle' +) diff --git a/apps/alpr/routes/vehicle/routes.py b/apps/alpr/routes/vehicle/routes.py new file mode 100644 index 0000000..bbc9566 --- /dev/null +++ b/apps/alpr/routes/vehicle/routes.py @@ -0,0 +1,51 @@ +import datetime + +from flask import render_template +from flask_login import login_required, current_user + +from apps import helpers +from apps.alpr.models.cache import CameraCache +from apps.alpr.models.settings import GeneralSettings +from apps.alpr.models.vehicle import Vehicle +from apps.alpr.routes.vehicle import blueprint +from apps.authentication.models import UserProfile, User + + +@blueprint.route('/', methods=["GET"]) +@login_required +def vehicle(id): + if id is None: + return render_template('home/page-404.html') + + vehicle = Vehicle.filter_by_id_and_beautify(id) + dt = helpers.Timezone(current_user) + user_profile = UserProfile.find_by_user_id(current_user.id) + + if vehicle is None: + return render_template('home/page-404.html') + else: + cached_camera = CameraCache.filter_by_id_and_beautify(vehicle['camera_id']) + return render_template('home/vehicle.html', segment='search', vehicle=vehicle, + date=dt.astimezone(datetime.datetime.utcnow()), + user_profile=user_profile, cached_camera=cached_camera, + settings=GeneralSettings.get_settings(), users=User.get_list_of_users_w_user_profiles()) + + +@blueprint.route('/print/', methods=["GET"]) +@login_required +def vehicle_print(id): + if id is None: + return render_template('home/page-404.html') + + vehicle = Vehicle.filter_by_id_and_beautify(id) + dt = helpers.Timezone(current_user) + user_profile = UserProfile.find_by_user_id(current_user.id) + + if vehicle is None: + return render_template('home/page-404.html') + else: + cached_camera = CameraCache.filter_by_id_and_beautify(vehicle['camera_id']) + return render_template('home/vehicle-print.html', segment='search', vehicle=vehicle, + date=dt.astimezone(datetime.datetime.utcnow()), + user_profile=user_profile, cached_camera=cached_camera, + settings=GeneralSettings.get_settings(), users=User.get_list_of_users_w_user_profiles()) diff --git a/apps/api/controller/webhook_controller.py b/apps/api/controller/webhook_controller.py index 03ae3c2..bb28f11 100644 --- a/apps/api/controller/webhook_controller.py +++ b/apps/api/controller/webhook_controller.py @@ -50,16 +50,13 @@ def post(self): return BaseController.errorGeneral("POST has been disabled"), 403 elif auth_level == PostAuth.USERS_ADMINS or auth_level == PostAuth.ADMINS_ONLY: try: - # Re-serialize the object "custom_data": "{\"API_KEY\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"}" -> - # "custom_data": {"API_KEY": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"} - json_obj = json.loads(request.json['custom_data']) - - api_key = json_obj['API_KEY'] - if api_key != "": - token_holder = User.find_by_api_token(api_key) - if token_holder is None: - return BaseController.errorGeneral("Unknown API_KEY holder"), 403 - else: + try: + api_key = request.json['custom_data']['API_KEY'] + if api_key != "": + token_holder = User.find_by_api_token(api_key) + if token_holder is None: + return BaseController.errorGeneral("Unknown API_KEY holder"), 403 + except KeyError: return BaseController.errorGeneral("Missing API_KEY in custom_data"), 403 if auth_level == PostAuth.ADMINS_ONLY: @@ -71,7 +68,7 @@ def post(self): return BaseController.errorGeneral("Could not process custom_data") # Redefine custom_data for the schema validators - request.json['custom_data'] = json_obj + # request.json['custom_data'] = json_obj # Enumerate the 'data_type' key data_type = DataType(request.json['data_type']) diff --git a/apps/api/service/cache_service.py b/apps/api/service/cache_service.py index 038e06a..2387f88 100644 --- a/apps/api/service/cache_service.py +++ b/apps/api/service/cache_service.py @@ -5,6 +5,7 @@ from apps import default_q from apps.alpr.enums import DataType +from apps.alpr.models.alpr_group import ALPRGroup from apps.alpr.models.cache import Cache, CameraCache from apps.alpr.models.custom_alert import CustomAlert from apps.alpr.models.settings import AgentSettings, CameraSettings @@ -15,14 +16,14 @@ class CacheService: - foreign_id = None + alpr_group_id = None now = datetime.now() this_year = now.year # From 0 - 11 not 1 - 12 this_month = now.month - 1 - def __init__(self, request_json: json, foreign_id: int): - self.foreign_id = foreign_id + def __init__(self, request_json: json, alpr_group_id: int): + self.alpr_group_id = alpr_group_id self.request = request_json # Load the cache if it already exists @@ -31,16 +32,17 @@ def __init__(self, request_json: json, foreign_id: int): # Create a row if the year doesn't exist if not self.cache: self.cache = Cache() - + def update(self): try: - if self.request['data_type'] == DataType.GROUP: + data_type = DataType(self.request['data_type']) + if data_type == DataType.GROUP: # Increase counters self.cache.all_time_plates_captured += 1 self.cache.month[self.this_month]['license_plates_captured'] += 1 # Objects self.cache.month[self.this_month]['cameras'] = \ - self.increase_dict_value_count("cameras", self.request['camera_id']) + self.increase_dict_value_count("cameras", str(self.request['camera_id'])) self.cache.month[self.this_month]['regions'] = \ self.increase_dict_value_count("regions", self.request['best_region']) @@ -53,8 +55,11 @@ def update(self): else: # Always overwrite the user definable values, they may have changed camera_id_cache.camera_label = self.request['web_server_config']['camera_label'] - camera_id_cache.gps_latitude = self.request['gps_latitude'] - camera_id_cache.gps_longitude = self.request['gps_longitude'] + # Don't overwrite them back to -1 + if self.request['gps_latitude'] != -1: + camera_id_cache.gps_latitude = self.request['gps_latitude'] + if self.request['gps_longitude'] != -1: + camera_id_cache.gps_longitude = self.request['gps_longitude'] camera_id_cache.country = self.request['country'] camera_id_cache.save() @@ -64,7 +69,8 @@ def update(self): agent_uid = AgentSettings.filter_by_agent_uid(self.request['agent_uid']) if agent_uid is None: - agent_uid = AgentSettings(self.request['agent_uid'], self.request['web_server_config']['agent_label']) + agent_uid = AgentSettings(self.request['agent_uid'], + self.request['web_server_config']['agent_label']) else: # Always overwrite the label, it may have changed agent_uid.agent_label = self.request['web_server_config']['agent_label'] @@ -74,7 +80,8 @@ def update(self): camera_id = CameraSettings.filter_by_camera_id(self.request['camera_id']) if camera_id is None: - camera_id = CameraSettings(self.request['camera_id'], self.request['web_server_config']['camera_label']) + camera_id = CameraSettings(self.request['camera_id'], + self.request['web_server_config']['camera_label']) else: # Always overwrite the label, it may have changed camera_id.camera_label = self.request['web_server_config']['camera_label'] @@ -83,29 +90,51 @@ def update(self): # Check to see if we need to send an alert custom_alert = CustomAlert.filter_by_license_plate(self.request['best_plate_number']) if custom_alert: - # Send the id to the custom alert to the queue to notify recipients - default_q.enqueue(send_alert, custom_alert.id) - - elif self.request['data_type'] == DataType.ALERT: + this_record = ALPRGroup.filter_by_id(self.alpr_group_id) + custom_alert_alpr_group_record = ALPRGroup.filter_by_id(custom_alert.alpr_group_id) + if this_record: + def enqueue(): + # Send the id to the custom alert to the queue to notify recipients + default_q.enqueue(send_alert, custom_alert.id, self.alpr_group_id) + # Increase custom_alerts + self.cache.all_time_custom_alerts += 1 + self.cache.month[self.this_month]['custom_alerts'] += 1 + + if custom_alert.region_match: + if this_record.best_region == custom_alert_alpr_group_record.best_region: + enqueue() + else: + logging.info("Plate region match is enabled but does not match") + else: + enqueue() + + elif data_type == DataType.ALERT: self.cache.all_time_alerts += 1 self.cache.month[self.this_month]['alerts'] += 1 - elif self.request['data_type'] == DataType.VEHICLE: + elif data_type == DataType.VEHICLE: self.cache.all_time_vehicles += 1 self.cache.month[self.this_month]['vehicles'] += 1 - # Update/save the cache - self.cache.save() - # Prevent circular/infinite loop import from apps.alpr.queue import download_plate_image # Send it to the queue to download the uuid.jpg from the origin agent - default_q.enqueue(download_plate_image, self.request['agent_uid'], self.request['best_uuid'], - self.request['data_type'], self.foreign_id, retry=Retry(max=5, interval=60)) + if data_type == DataType.ALERT: + best_uuid = self.request['group']['best_uuid'] + else: + best_uuid = self.request['best_uuid'] + + default_q.enqueue(download_plate_image, self.request['agent_uid'], best_uuid, self.request['data_type'], + self.alpr_group_id) + + # Update/save the cache + self.cache.save() return self.cache except Exception as ex: logging.exception(ex) + logging.debug("data_type = {}".format(self.request['data_type'])) + logging.debug(json.dumps(self.request, ensure_ascii=False, indent=4)) raise Exception(ex) def increase_dict_value_count(self, dict_index: str, key: str) -> {}: diff --git a/apps/config.py b/apps/config.py index 2b3f683..2901b17 100644 --- a/apps/config.py +++ b/apps/config.py @@ -1,5 +1,6 @@ import configparser import os +from logging.config import dictConfig from os.path import exists import secrets diff --git a/apps/helpers.py b/apps/helpers.py index af7b82f..eba6f58 100644 --- a/apps/helpers.py +++ b/apps/helpers.py @@ -1,5 +1,7 @@ import datetime +import logging import os +import subprocess import uuid import re @@ -17,6 +19,30 @@ message = Messages.message +def netstat() -> float: + try: + netstat = subprocess.Popen(['netstat', '-aon'], stdout=subprocess.PIPE) + grep_3565 = subprocess.Popen(['grep', '3565'], stdin=netstat.stdout, stdout=subprocess.PIPE) + grep_time_wait = subprocess.Popen(['grep', 'TIME_WAIT'], stdin=grep_3565.stdout, stdout=subprocess.PIPE) + tail_n_1 = subprocess.Popen(['tail', '-n1'], stdin=grep_time_wait.stdout, stdout=subprocess.PIPE) + awk = subprocess.Popen(['awk', '{print $8}'], stdin=tail_n_1.stdout, stdout=subprocess.PIPE) + + stdout, stderr = awk.communicate() + stdout = stdout.decode('utf-8') + logging.debug("stdout = {}".format(stdout)) + + if awk.returncode == 0: + if stdout != "": + stdout = stdout.split('/') + seconds = stdout[0].strip('(') + logging.debug("seconds = {}".format(seconds)) + return float(seconds) + return 0.00 + return 0.00 + except Exception: + return 0.00 + + def setChoices(current_user, user_ids: []) -> []: users = User.query choices = [] @@ -27,9 +53,13 @@ def setChoices(current_user, user_ids: []) -> []: if user_ids is not None: if str(user.id) in user_ids: selected = True + if user_profile.full_name != "": + label = user_profile.full_name + " (" + user.email + ")" + else: + label = user.username + " (" + user.email + ")" choices.append({ 'value': user.id, - 'label': user_profile.full_name + " (" + user.email + ")", + 'label': label, 'selected': selected }) return choices @@ -176,8 +206,7 @@ def emailValidate(email): return False -def createFolder(folder_name): - """ create folder for save csv """ +def mkdir(folder_name): if not os.path.exists(f'{folder_name}'): os.makedirs(f'{folder_name}') diff --git a/apps/home/routes.py b/apps/home/routes.py index 0e70753..fcc4fc9 100644 --- a/apps/home/routes.py +++ b/apps/home/routes.py @@ -16,7 +16,7 @@ def index(): cache = Cache().filter_by_year() alpr_group_records = ALPRGroup().get_dashboard_records() alpr_alert_records = ALPRAlert().get_dashboard_records() - custom_alerts = CustomAlert().get_dashboard_records(current_user) + custom_alerts = CustomAlert().get_dashboard_records() return render_template('home/index.html', segment='index', alpr_group_records=alpr_group_records, alpr_alert_records=alpr_alert_records, custom_alerts=custom_alerts, @@ -24,9 +24,10 @@ def index(): us_map_regions=cache.get_us_map_series(), plates_captured_chart_series=cache.get_chart_series(ChartType.PLATES_CAPTURED_CHART), alert_chart_series=cache.get_chart_series(ChartType.ALERT_CHART), - top_region_chart_series=cache.get_chart_series(ChartType.TOP_REGION_CHART), + custom_alert_chart_series=cache.get_chart_series(ChartType.CUSTOM_ALERT), + top_region_chart_series=cache.get_chart_series(ChartType.TOP_SECOND_REGION_CHART), plates_captured_alerts_chart_labels=cache.get_chart_labels(), - top_region_chart_labels=cache.get_chart_labels(ChartType.TOP_REGION_CHART), + top_region_chart_labels=cache.get_chart_labels(ChartType.TOP_SECOND_REGION_CHART), number_of_records=cache.get_number_of_records(), size_of_databases=cache.get_all_db_file_sizes(), top_cameras=cache.get_top_cameras(), number_of_records_raw=cache.get_number_of_records(raw=True), diff --git a/apps/messages.py b/apps/messages.py index 492b6e5..151bb04 100644 --- a/apps/messages.py +++ b/apps/messages.py @@ -73,6 +73,7 @@ class Messages: 'general_settings_saved': 'General settings saved!', 'general_settings_not_saved': 'Could not save general settings!', 'custom_alert_added_successfully': 'Custom alert added successfully', + 'custom_alert_not_found': 'Custom alert not found', 'custom_alert_updated_successfully': 'Custom alert updated successfully', 'duplicate_custom_alert': 'A custom alert with this license plate number already exists for you.', 'illegal_access': "Illegal access", diff --git a/apps/static/assets/img/brand/dark.svg b/apps/static/assets/img/brand/dark.svg deleted file mode 100644 index d82922e..0000000 --- a/apps/static/assets/img/brand/dark.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - diff --git a/apps/static/assets/img/brand/light.svg b/apps/static/assets/img/brand/light.svg deleted file mode 100644 index 2f1ed79..0000000 --- a/apps/static/assets/img/brand/light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/static/assets/img/favicon/android-chrome-192x192.png b/apps/static/assets/img/favicon/android-chrome-192x192.png index 74d876a74698afc4fa2b5cb0ca3c06449a55c1ad..ffa762ad4446b07130a618520a8138127856244f 100644 GIT binary patch literal 9267 zcmZ{KcTf~h@bBJn99c3*kSw62lPt(_WD${^Bps4-&gsZOq6kPlKm`OPN)qJ=3Q9V% zeZ`yf4tq=o!Z^*o}QkWo=^8|oaPG^GGazz0078TpDJqO%GUobLMZO8 zJ?%t*DT&>3olJ6NfscD;vwW(p4gdk%0Dy`FfD7C!)H(oo!vJ6t2>?>>0D#^t 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 sa0es|Q=U$HhzO@n8N0Uii~ z_%HpZe+`1zz^`l&Hz)Y971U1wKiF^UUD1P}&xyRW8yw)XwDW)0u0T-85eULQf*{r{ z*aZmkSAn1zC8!o>~S1xePbBgZSukhyU zMPUeXt-7SIXBITNIuRTsJ0FH5drO9?ulYh2jc3OCqtr*&sXE-659R4x|ibd4K(!kn~)26e1En7)y_~hCE?PMgj zQw0(boQU!l4r`ukKbPuQO;JnuAre@}>#EBs&T01;hK;!+`9qjtc)_89Y^A@eV)E4f zm!+p}73H(NN{6$+9eX}VU*G(r33)ZHfjF>c<1L_|K4xjEuu;(Jx*fX07D0Tem(6h! zyyfMM>*R#i5$$qy$K(n3P{OOKKfflZY|SKlsgm3JTR{f;rVBzG`9=b*d-Vj^AQwG> zhfwxi8y+-g+N*1){jK}@W74kYmXCBL*lGG7{&KKZ*LO2=`PZFO9O!1Z2z6W2M%&SnSd3lGzs+1 zibF9mgI2=f^vcm30!*6FFdyM;Pd|^EMMUc!;l7#IM<|TR{ZO9TRrsre=I9vC+$Q8+ z%NNETw}`}^6n>q;v-J~dlJ4Ed8pq`Ggtro9*IL&izA+C&{nRWO`t-q1F>W1s!{0G| zguDX<1zov9u_ad~>(?I(St>tuKFuxu6)VMEbVf+@1g{GFDJ0MgAD#2Wl8Q!0vn^Oq zbk*v?(JDe_PiW*Hq!33lVJo!OsMb$&w_B_F6K$;+VQkNt6yYzR63AY2y!RWJL`UV1 zF3K^Ha6(68q}Jo=Rq6w2aRwiI^YT_`zToMU@AbNB_h*=2eCD_a?*!PpjMxK!k)B7F zvxI7?+D+LWii^UPdm9lVLXi|XM-|#vcU+0c-BkT)_o1IS>X_Pd^}Npq*q_+LHly`6 z8BjF#NE3wC|K!}ap)SfyZb38!lA94aeG{mys~1d{0x3EkoLBm8{_1EUWQNUrC~+wt zVPA>Fx~gLjWq$@5_^j~7QAQho_=PA;d*eH5bbuuJbmCATu5TvroKi~NDKOhkOXG&! zGuTsxDV$r&>eq{rWHo6f`DJhK&g@AUy&Yf8iQ zlJFVSoKG#gVI>9jZDwwB-*KYJ$mhIr z8C~_R9J!jc%O!h>XJV&6k9ohQVVQSoZo!`z6!w_2nlP@R=D+EGI^Fz4c>JyHlW^=N zP^XW7t%NZRtB%)bbVk)rAtd9QH^({8tbma5ZbMQ~0KeCSM%5{Gs@sv59XT}%U#Htw z*iJz}iQSHh?(9ksh(qeMT^RcVT}SHhV-%49=J(tUNT;M#01zHCL|Nhsp1FYXWTqfGFw;&U(FM=+lKf|t)&;tCbw!bKq`Q<^^? z?B_p`I9;c8yEDRzJjq(bKUWz((&I$yy!HtR} z3w1jl#*BYo3vvu=$05;E!_G+hcN5#8`8QG?g&SPwdk$h~LXO|uhButIeF@EO0?$o` zQ{FnxLIFS^iz6#!^~rgHW8K5Y1ZJ;%9al8ts8!I?kL4ZY>WXBHF}^VX_5s18SgVG$ z$9A^^#aXo(I)?``qZd9tjr;v0`JOGza|Nc$h5C4 zxZ~<2BA38fN{5X>hYW-5{ybh~G&M@#2cHF)xlfj7o)j{G; zP5nIIj*8!S42P|-^^1T|cREV7oS8GhOqS))3grs#UnE`&UbSz)XbHO!&^JcfYQ(UT z*em}Q|9-rWQ4c+!wn+tFOx8IMruReWLcVj)XD$r)hiZ18qfXBO95DTQOpU58MVk@1 z@C!eo{;i#MCYH1|i6n+Z9uocnS){{Y_x5K?vE*aTt*{C$wBq4S)nUwEGiB{{6N?eo z{Pi!bjRcc3+f9bKoE}`n?lRQ}SV8%;MBz3@8S*AfRV8Zb)Ewv&mP`5W@|)j7en&W^*HRpVah} zp70&ghw^z7g@q8)o*WZ)b73*P&5g%Iva`3x-9y`q9o%k;Z53g(VYxRpvBSafx}Uzb zE^~4+qWJu#+RUC8N^tQy)C$xuz}nO=KC77h*xN3C%m#r+xeIr4_kG^oB-B$Ze|^}s z7QVGj>2k;#u3 zA0t1a!5geCKsvWZ^|^(Nt~vs1ftG6Nq4U6B;!+=wwqa>i{^Yf z^BkFjj{0-AmCn)`$B3Ng4NUGZ$0m8W*8`etSYhJgZGXrlob%w?!rDgAgLlS=vNxAC z_iJpARx{3~e?QJ&+P9;zB*I;<&&OwCN(Kn zNZkF-n^r z{n`_zr$_K5aa;()_8m1bY;>_FRuWU{slKuUEf6xOklXtk*VP1TQ@Sa*zfurJrML7p z^Y*pxt;g~v!#M^|JkViZ&}&-KWqPC@D<@I6>bO@l;k%z&y5nz8CKw#9e#59ACUQO) zGyTGar9w-OK*&yus3p&*K-vz>GkILMZ!ZnLv=o+;xNzU}>ARZsbS=n2Ex0hzHyU5^ zm{W&a_A=&ng?i8{vrzDGEx#kSU zdW=2AbDK|C@|ZSCjgi@xh18Oq(6Kccg{dgRRrvbR=NVrQ$*7i&!KI@#zi?$py~)Uz zNWr(dy;YYY0Wb#;W$l7k2FCj)!@o}2$xc+^z*q81#AM&8D|&FAM`K*3H|SYzk%2G) z)5B`j%=mNI9^`^w2o@}G>-TTkmZUIGWALE2Ic=blsqMJs81#o@Op@T9KDFg&c_XaT zg)>SBzB$wJe&4bDAP*S-9eV-r{w z6Mb{@%7hyNt6-D~oVB~$%b2TgO@a~-5{{Vw@}0n;xW~ z8F3~02UMY$oP{WV;?POCI6fazS3PE^6uYsrWjVTt69kJM z7=alc$uI`GS0=-qbi|aw1P=G(z?Al?jd%%#oe5|c}A65y{oq3 zCDN7n{cvY;UzYr_v{$%y5z7q!HWqw2;wWr(#j_)HB+LPae0iI?-T1P5>2d_^b$ufi zzu5C!&b-^2cKkeAk`>3_mD}_53d=2n%?UdHR!O*e`Ua7B>(~K<(uTtJ=Fh{|vPbDC zSMHA|S(wDH>cVwXAO6~>lH3)DY~q;`k%YtIZW8zI9k1%Q8(d=^MKJUK-FRmARlt#n z*IFa+=H9(l_{N&lBB}Q;a1T9K>)wE^{q9<3!MtisTgLvMb=t$T|Nj0ilE-zcRf78| z|g!Crax*Uzon;;1u>i9#-g?`7>`d<1{Wri)zq6$4Xzo$MWc*1jkfclEeK z6?a^2v@Pn{2(s%znei#JtZowyVhxy{~BJ zdM_tydk!B9bsw8v$J11=l+@NReb-G%}zyOL0YG)+NLq0Hx4DP`^D9-$GAv0wkL90#fgti z;?^&QdJk<|o-HJV^Kmu%=;)d+80mt!&u6lsEKmBo#xZt64G;&Jrg{PgHrQJ)AJK{b9r@e? zVUm+@w?mmtMh0H@&eI$+Jd*lmPo=-6&PAhU(o+M29lUQ(cYGfH9Px0(woKmDmMtOv z(+$~{nv%UY2fYVKJ!0Wd<6B8CQkB17`0!#+e1?Z=ehG6-GTrXIsJz0L{r{|?P<}!r z!!s+U|Upl4zn- z&4ty==43&b{Z=Pn3#~HMWoO5FJ0bT+nQuLDK7@BY;ZkVs4scYghiGE$(SP6t9YT-kdMFycW*IY0aTxwwQxxm&12VD+;5 zVx!-Ymy%KwRKZi^<6_t;MD&`(Xw_}z#`O4iKgDNyi$`>SO}Dp6oA`Z9ByM6Wt#PP> zYuZGze0XJX`MiAklrI}p6TH}!C709L2Teo!plenQzAZsR`nu5iUTngQJqTrN*7Y8>j{&(>5ZdYDGFB}^cFnz6Wd)r z>9ey73MYHt1g+#Zp0LHq8v1;lJaFSxx67PZp8OG~g{3Bj5>z0_GBuY27V#OuNURi8 zMyXWM+9thPtxJ~y^;?BY@UZjmnC*v=_zmay^6SjM8`Kh9fr8-y5{H1oYV>R!M1875 zyGQ69%pwJawP%ETFIU#9YA!KHz_{^t~rRqs(jvb6!c9C~l;6Vk2!`r1lR zePbx+#f!}I%vaC8>uZw|I>!5tsVmiElu|kui@iG`X>Ny}Pv>_IuB=ErkP&dBzLxF0 zA{2hPB343d^5LPbx2M=k;U-*Hwh>V=<1*#Thr!wTt)-2T@%5_UdCK7p=HbJu$w&)7x3g` z`HSP%3#(@@VXaOGQ&vv$ONVW*XyHLh*RuHedT?6q+$YDg+p0XRjyQmfzLPNgEWfO# z!UZdo!}4Lxj=YRh>Yfb#x(K@-{A@Qh@aD5t>mm;I7miG>Vc16vmR5*bRI`b$!mR49 zS@vW+ur_~L(FZ@`o|c=huAIr(%fswhVS~n){@*}|Q=Khe~pEOH1<&X<}ccL|w=1QP?BQV2a;n2CQNV zguXAr1O&}z{^t(*viO}Ih+Ii=shKsCd9^26>%pI=pE8VbTK6>u5&0us>1feb7Foxp^>6) zMP)`zkKk(8eMz`W!ysYEHO=L9sz3e(mL_cdx>iS}Y}3Isx!xFuP&XBk3tQvDQycU> zTsaHNF%57KB-?DE_yC44$q}TEptw;Mat0fI1l!nrJYwLCulDDCsSV+b2__<~?O|E0 zm!s~EWhbwikU|E1Im*$II;74NnV??X{<;^ao5*!BNTG|CfQ&C);M6}H|H~;fPq}|m zV`+gmb6 zPtmFP^6ke)w=XK_Z%HXB*s-o?lrd+({C$LlOmE%tSIs8gaSBt*cEH|D%WXBrZLgvd ziuG%bmKt9pF7)TCH|~mD`2H#T6f`_RX|H5nX_EswYiRDleTsP&cQ89&aZcXbepPbv z%h(LDQj6|jbLmWmgC@PrhflNk-Wn31oLf)dTts)WAWnpKS9x(~v- zO#<-|dM5H=ml15&+D&tR7Hap$P&n$#Da^=XvwFJzaZTdnF-IoG`B{`!DQ+UMn92E# zwT}&|_RwKiVN~13PJThbPh&gW=r6V2RYWw`oA9gM(p44r{x%FX5)DTD+yo1wFdTz< zbZZgJsJ3+zq{e+ zR#3)AJ&kD~`%d6sEZ5ViP=2)6&Z(;>U72!LRb8j9>{Q^pI`2D=WkcDFaU~a%J9C{= zt}>^tdOK)u!_j@V^toxrwWF8|?#$zi|CNEuo*H8<)(l&nV;6}MVxx7`5L&ZI325L5 zezTOR?x`nkATP}2dc6%A^gg|*P9RrnuM&WX8skn3fo?+1E9d*@q|{)NccU4URxn%E zS6$*D%6{nA;E2xgxa9W5ojLXk-#^HE+fgQWt8qJ(9!GGKV4$HuYRWN&2VEUBKV{rB z%>7^<@r|v8qN!P#sf}UuNc6`O0({j7w7_89Q1;ymqPLVYLpT4TGBRqyVYzkkPG_z5 ze8{7HCaa%iJ%0(vk3OKtE^Ke8l%A1MAAI;reNbUTVPMnDc2q`q;`WP6a)&K@aMa4e zJbd`+^h?UkjpX#JyM046YnsGC;P)$wcn&okggoMLM8h_Vo6m=o9kID>Y=1~nBYigM z?B$EIKfWczmxQg8b{O+NrfIT8WAr&HEuoHHoVngUjmO&cwaLirgfMpJyF=OZzskXq zU_nq2j6C?MX;g$=K(&5OSx?~Hc`ec!K7492uU@KTWs5o<<6&$n|LIMbKkY|tc|pN} zz)gv)+1ul@w{@r5X?`eCCTBa)u1f8Ad9G1UwxV2K6F(n&zq>a^h8kS2suo7O=sh~F zK2$y6cO?G9U-6vJK`WH}A&35o99wG9Ervxpy-N*4_x*@@3YKZ&8}?zJ;KT?1l|3qA zn1OXXH}oy@*+jdV#tGr8xq?RTldhY^By(H4b@@K>iF;@zld$`r@UhRbWf~mGFVXW2Bm?_5vEC#qS@4XF1N zf2zmc&-y&y%{U7<|I2|c`JLf&Dc6v_cK7(FZ-UmbhhP3goAY|xCMVg5<0w2u>eSS$ zBsJu!`@12t7m9KXsk9|12ftB{$87%VITn`6X7}A@gp4^VM;E4;jLnY}rg19p zD4t$*zho6gpoIRmrMHbye@x=NX?E9qSGceMW4InuZxX4cgXBA%1fke$87N+yD0Mrs~h8Da){k31JNtPVWJQSB@aaZ z_kS*!S$}BfQb)aAp}J@6TnYy3)IXA&T5L|NrtDfcS#EWgyrEaKnp-*B$BxFF=;9~* zdI@}V%$jlGW2{A(V?{K`ePW(ik?kL{e(8u}U5v3~)fWC=f4CDyE$LU54kuUo!UfWr?!FyuL!V{8>E8tk4LIuET3htTAo6xqK4ha z?rvu2Wb~er&ghoO_$ib6Q~G)LIrq|JMIN?#sr|ZHT;W+_x`}*x0s^)UHXqk@^IQLM z5i*je6}YkZU@*Th@Kc?@}Ei2Jcjslj~TZ_!s3f`dS~rmohm%KRm?6QV-Ep=O&p*nNs9-G%(LdAqxt8zx|Ns1d#QndE|KErIpZ@(n z2_$J{3yS#>3?d50W>3R<3vXKAjEsz103Xz^QWO_fiA#J71Ro|2b=()_Xef{_y{N|6 z&&Q^(KLD^^`)eNDK>Oc^*jwAqoG_W3B^9VQxBMur%@X$aJoZ-5fO7Nt$xI9*IN}gC zrb7x2d8VmG;g|NA9%O&Ab*>~$SBav-2h-Ol1xZMI^2AS#6GNMUH_K^N;@1wD`v9O*x(WwuQDN*Z)_akmDFb^NwJKc%Pc@MP#$HX(creAdt-DFh(4jLg3w(Q;@bv34uXe-o0$slJ zfKt7}Ug$z=RyF57K>%^ru0>hnKL7Rh*rBpFi=AbB>vQA|^kcq}=5DlknqQ3}mk(jp z6vhR!@lpym{nfI=j~x7_`e0w4tNn{$ryG0<%q_o&w<7HgVWuiQ5{RJ)d zZ)OPaDLjU7IC0xsl77YX1!Zv8a#F{1>#Yh^9S?J|8>Pn|0dhu@ft~_ZQ;VCid+jAcGm$(XoU>+7Q@i6YU9FYN)*2#i{0cB29R;7JJri`n@@ZHo?Ap%3NA@@t;@H0cG!VjlvU zRJUwnWMn|ZQ53~=ZZnGO_O2myf>!WG$@Sff#PoZ)SM|++s;87IFesGT`*}Fx4c!Qx z9qsj|UXl*eSfDi^uiX)*&J+|Jaf0rhj1Q#&!=lOJnx1iG(t>uT2JylyCKS0-K#}%3 zrej+ivip$>ESND_c?^=iM~h9wG&U6Or1T!-sNCQ7pZ=^kCnRQLKJN}qJ?agDP zDho5-_c_bUA# z2M~m^XsYojLDOaM5bXLg?j{ihC@z>0B%jXAR!wZo$8d4T#x9kMT1p1WDh@~UmIs$6 z4(!3eE+wCn*WJo@ybU(Thl>*{YW|iiHnGGd9YiBueees(gZZ&|Ur6xRoD+0MPef|b z_S7bqK>g0=+ZfgUU%NuaiRm#hXAp37{L%8c5;4q77wX>Z+dSQ|UwzE@|6LRVZv*RJ zF2sRc8DL?9N zU;wv?z~Tafs8y2Gr*thn0nl#;FMZPt^|B3qUPE$oj@9iTLl^Kd$)~1Ri|x?hgRXq~ zA;}C`Mg`42%VWf@5Z8P|#`X1Qk8@%NO}zTD{x~ob!w#{Efqjv3GBWcgp;IUOgcwf% zx5GJnM>3QQSQCv|_d~k$_4~!ep)|87HAehi>i+R6=k}?p3??6qc?DRJl|Y(Fs&n}E zv|~`yRq5VF>N=fy?w@*rs|k^??BG-YS-BOy;F*(;bvF`SN(g|VBPWy7)&ljq6xgvA ze((z+HZf{ci}|Y0`3Si373$S5u-fTClKN0(zJO|3jN_BqG}6}>1@lNWAH#jzR_4y^ zT{|q#2-FiEdn0vRQ1J8-PVA8zzbIl(n@L%r$WRKeLlzU15?SN5LcQ!BHcUzvco6l4 znd!Vb(U2ARZ)L+^#K*PUj%7q;0dBu1E4t)DthAPn6$rW>d=S5vPBHU5LU&uOY-PXy zzX!C#J^4r18ShGisuk znNdKxavEy>ti0#pRA5LF*a|!F{wLkf8C~TVB*c6xl!)n<;MShndJQyu7YupCnW(-- zQy<^N5B_R!odrZK1t1)GPAuoOTQgao$yA7p7-tS&HB25S{Ch|PY`oNF8>)exg@EX` zRf!e;r1ebTT)wyi0kqsAdDqXQFbh3TzqVsCC73ZWcMgLo#1D94E|fD@LlH=xN28g3 zEOqT42N$rdD|kEFW;ye123NS(>JC7M6Q?<`Z8s`Oj((HOPlug%c4-kafV=~iiG*Xn zdfZ}$5Y;nx2@>O9mV*JANMFAgi1MVF4RwdrI(aTt!o>E$fyN9rK~veP<(SPdW@F>q zXUM>idhk+Bap=u$b!rciS~ou&nHW+ZLH{?n4Hq1HzTgc@xD?K6`lG%X)(|bw)bYCO z%#Au`prkG_dx(Hq*g^x*RjNQ|vs+g1LCaYs-a%Ui8B)rEf|XL7&^(JHB<@Y!+`Beh zH-_ZiXau4u(BQ;gv6$;(CU;}T01xxzdOr$$3kSEq2%XNVF2{5_N%sRU7AXtf`3;)l zYhHKDq=!P}fHfV;Q9XhB|4mT{-gKm(m(f$gG)flc_TScC-UZ$upeT?%V!b-i_oPPsxe3O)fyH{14ph z32yGJ-|Z2H0BP#5*4_tv_1lRtF-uQiPC{n2yFG{Fa+Jp>cMttfJ<_TWY%EWLrL3I&ffo_~Dd($fECp~MGm-xh&35}B)O_zj>^vY>c#1NsQ> zqo7RYh`8o^?R);Wz^{;rRe@C`D-RLwJ~k)8%`qz-}vNeGUn4|g-lVPCZiNeXPDR;B=#UZ0z>Td_068Z zvZH?#F;kAi9*ut4dsb)C=9bBHQ>|0 zR*%C?ltJvdzX#33-txzymg(4cYCAH}k!mCJMVr^jb=8Jbz&g~Pv-Hg+c`@TKW-BUD zNqI7WRu*+{u0L;;4@4m6xEiQw`JqY(qO7?S6MP4zl|B*T*Oi z$DGc(n3Ce9q2nbZQ|%0WL=>LKZmcrz84$ekxU7z;Rex&Wl8zpLvU_MLmo3>Z9Ga5A z9JF`%vbZ%2k`N%5i$C5lOOUWP2w1aIP+s3mF^9RiYI&fS15Ci+E){P@+q8#@qOjLX z8p#Hq|F$lJwgPz5P3R-C&=!(|lG~BPf3~LF4hh=V=Fj<<76m{z|0N&dJ8TOj#~=$p z(+Oq{c!!^^st@X3+|kpYy~qbu-u9qt}Mv*Ixhy*sgE%3^CzFxYcYZ%NIcxVNW-7j8)NNEaxK zbmS9o6Fe3lbFA)sG|GwSUqgaM?OyMXt@>~%`Uxr?$4{U-13cOe)|hsacM>fc$;+g zW9$R@?C4IIO%xJ9A}KhU-)bBN4STR{?ZN@Vs1~(&mGX(L!^+MYs;xX$NAe9g)Kqgn zsT1Ug=`pZu(vM8G1tO*TtWJ}SRc2Og#JLD{(XhH>@zZ}FvKywbyL~>`Gy)Krh&bfd zxg^|_;|sYY1~x6~dA-QJTN^dw+d&Q5ffLtik0-jY6@F%^z9M)&`XR+_dbp1HExj2mT4`G;Yeb#1S7a z^TQtIE@84XxJ%cC1owjhGFOi@Jzbm3&7#B6nu1yA`+qD=v^R$?r?`>*Hz%=WhoD6L8JKwJ#C} zTSj4Mi*&|H9LmI=`@fufaoHN|$1@oWbw=j~ZKZCG_^}}QO-(p4YAmHEL+{Tg_QLyu zg1^#UolUN49@gbWlY+F~NR402k4yefe&+s*pR~fe)e;zo;&sdYUmx;Fr*z*cC*Vla z7y@#HXv17zIAod}wrKXiZG+NU?fk6uXpz_Pes%e!Ls%oQ_W*^t87PzIkn`uU$3xR} zAwXx9v%;_C?RW4$0M&!4#epQks~5a5i%!mvYBWKZd`sTzO%}-MZ>$daC^Wu9BVcVO zUkQhY0odf#Du<<%E0l^=?Vb+XV}oy}do4-7QgsvarH!4Co?@;5^a6Eem@KQe>FPn37-A;CnrML_ z3pfBrhl#MEON$rBm{8IcxpxW^yWW#@gxP-ff(3T*EZIBZX-+Jen9m;d*D|Mi9t(A48-TEuH!<6{M$McwT@kW#Oa`g$u8-O@P)(>Jw z1uvJhWr@{0l;9U(gW%W*;6&98GQaQ^cU!{_SfDT=(kju4hi3@Y+KiOeteB7DT2Q6y z_CW}SmFBr-^r-l<>dSKp@i@~|E%ql=_z!!znVTSMQfvj0@d6Aj!~y!b1Lw|U7{9Gi z8KOyrrpv*61xmjd8XtBc=JC5x66*8=Y;IaCz2HHxDN-~pdBpC;rgeTOFZHS%dU5v> zRJx}6I#E<wjL<0j99yy zm0znV-tY4778Gzj@QKZ3=6H%06wJPn`g(ECLz64*F?e)`zrN{~rcQLiZ?ob>oWU=O z3gofx!rgqR$r@E_Z#w2Ez>(MoA5}0fr%AP9=1%}r_56Am`!i|_icLQn2- z_@10$8Z|#o3*y^VY67rg7lV#V?$p$IZIcwH3mT>VvOdT31is}GpgU2pDEoeYN8&v&XJ-bfubl^m8le}Y9Mxq|868MW6nr(5K;8&)>6B+oTe(IN#w z>rtblCX|HUH4Se4;vZyhbdqds_ae;mMcEhA)Id@VH@u1SMXhqftTxq85n%TE%BfAR zQBz70Tt@xq9$b!W6k(&sO}rrI{bf|EO7AqV^Q+|{SLAQ*xzZ<`$5m}whWB29UhuP> zF_06geAp7%sBik>+Z+NK@i@XM8fFQ=RLKKw6LauK?#~wX%#Y>mK&S2Hi|lpKtgc+M z`tYFOMc#w#FMxV~?7Oa;fATb4%ro+H$O})#H4(YBElB;x%;rwE32oaFdjo5e;zUft zjgE$X$&hk7;nKIqmkT?A6>W!1wB`nJjQfmhFYLNl!DMK8_56KewIYoV*6&snhvP=` z`3LL;6n&fj+TL|4IMViW+VBDU5@)^@)`V)od;t?QzGWZwBs+AR)-R)|y;P^bPLBKo z0}N_j;@_7dR;ao33%Cm>p?*u#ZeWjD> zkjDk~|8fW{YT8?j4ID89!dOjJ?^(#VNl-Qb@rnKXA5SYPC-<@dxlUGMfQNi>cu)mn-ONamn{iU z6>Heh#VzCC71MU%Ns)h^o=F^1pWZ^NU+(LF*%}-sls&KyiVu$m*ziPQRVoqrGR?U4 z_8Tde6YO6zsGyxTr-T-q+ylfs4(q^ldyh0yrER7{?C)ByfJ2S&OEQ78!oz&^UZ7=f&QGrS3FIfh-=2cjccFg6;~+q|U`ki9V7MqVnKQBe!kA39VUPy9 zwXdmU(||n6&T8ot=evzAHV?K;bvzYPSYs2%nX(;c^uIZdq`<$fpoRxWK%y9+rPFKk zpZ?()g$Ie(nw7Bb04-UJY-6Cf+@m9xHAnVQp>r7%?WW@_QupkABy{>vAqmHap8T@h zB+jnq6N0TQtxy4F0-hRJ?`bfBo(%zThBD&A_3xMRxU6{@P79?y^So^9*%iD^VNk!B zVi9vb9tG7l)OmLSRP!*mAoW9P{@vjo#tow3iHERkPQ`Ja*ID#sOGPQqSU_9L@eb;F z`%Yn%?KOhqCU^F&YXO^C3ULk?g$Ka$2hSbJcr$oP?(y_q$d;)DJYlGX1eCz6dGWG? zb^=V`*hIrugmWc4I}oY;ugUBRD=)`FjGleIIgo zf#>7Kc0&EVMWaj^o{SScB)S3NnM>`^V#FXg-gA>z?fG@UI|6+?c2?5427{7pt!-+S zwjg&o0k6=enLX?#jl95k`18+EQI0fN5FiiQ$=3&lng1~;+UNNs?Cmu#J53e*#ny}akh`oUb-_wwKLHw!-K>a)aFqDvRxsi60mAU`cd0*4bZFWNMh?pU#j#8#Jk zcb0>E#p0BCch_XCb@x6rgSsDtR2={gOi5>&K=M+5b|(U)poea_423(3Vbfvx*29vt z=UH^`kt+AcL&&qB4&*MkKheRweB_iO9)<=H9pu_?xbIAIzlJB(`BHyaqpxR31r|Tj z3dtmLvfVJ-&ldB>4no73XPsv`n&fEslS2vpmL3Y@H+ za#35XZ5`3NuCNBZuxFd1VBA@`Zk-O)CXkeoE`?eK>%H_!=X_n_QyreB$G-(kd{m`D zpq8$y#2_qi0S)0e)cEAU&Kn@L50#f5*OE7tAhDa!@WEF`5LDKuUg8KilH&kIUc>iR zA*21F(g*(u{JK?ea~?Oz*jd%3G#OmD1#Y%ea~ zblpwvoB1SHqI~b(&@UmxO;6FN-whCDND|CKxNrpLKx=>=l=X-$Eg=~vfpQq772H}I z|KhO%0YdUUI$n;I6fXrsZAu`rOto~)h8iQP201SVgy{)i*mQt4uR**h&jQ6k2H;B) znurFO&s~C>7EcacJAR-x$taJ-&f8>Qz?wcPZ+eX;%Rx};clY@okW2Z5lvd7eQvwK@ zAx!5|2Oh9TZ(Kl;v4kEP*n2i$@v17 z1oElx!yCUrIn&;q{&fuFR?IsUxgGg1$PzSN6|d4a+13dt(mFo*{b0~ima+N3*0-1O zw@WEu@{x)JD0>i8wlqM%Y=lG7qH(# zNrKZ|5%g=&4%}p7@8cDhE{27wzpi z&&~sfct!Zb&#-nW@*c>-2sYQwQO=7#eVd$CrbTeX*|w^e%`{Ek3vHKYsUb)?)4qiN zIT$y_v|eXNTY}Qgb5$y2xEF3yrwUGcXZVGTZwsug&^?${lJ80#c@%8+I&o)fs)%Bo zxukK+NGxW#@hc9}O9EP7-1@gbqoIgGGP&}<3wz(uHeng_wi@E%d=92w%@H1aF^WEjEcDhW> z?8;eG(`0io3V&Lqf`debkt@&zrwgYYe^XE@q;=)E>*M8cj_f!OLuTyCg8{0YnQW z)DoVdYi2;Ntyb#PmClLA2c#3?jqTZ6htLlwSw^f%b0It;?p)K#Y_~eVI1TLQJdv6~ z)5P1R^~k2B*G@Tg*WPYBn$gApOOUH-b=S3GVaU!Sm>3!47c2-6r9UJP$gC5FqchBj z_oRJU%xsN7&6MurS~{eVMTt?;hvq+$?-bV9hcotdC_(1Makh+&RwS0$H2e;C{E`p& z{|i2)jKnTe=1`j}_Vv^ ztp5~!x^QS{(EmC2PY zzr9r)pXV@e>h%29@N(<&Cf;}DS009E9DzQ4vwY3_L2sfi6~ULVHZjrQx~#0JGZ&Hu zT>n62H^xE|TXq$a4RnHr?JN?x2habrPD$I?x?3>H z1xfo;f2XGW8qK#mF#363opLe2%V04V-TCfeY?sF%Jpr+M@)MQosV-%!q@ye_5lAnu zb>zEx`G}uz^e34(1f+_j_5Hx#?%)K?h0j);AN|zPA$PspWU3CUi^TDAzxJ{IP^& ztAvuJQw~SAgW@1VktAF8#OO$tV(es@8A-M@MF?3dLQKfMjHNhb8M|Z|jD5zw46}ak zKELbwUDx-I?_aLDF39NztAU(2vsX_b}zr1Xf>%t6<iWR9amtB`RKrh5LF4@0 zS=c1q2oi%X+oWc(C0=dK7Ef0$Jh=tB@6L#PUs?b~cYgry8uV8yX3#Wh@d_Isn^Mj6 z9IVNekn<{=n<>Mo9~?&B`{1deoXt?;eaPw*Kp*bIe3$`%ZSVd@gCi5eHL4B$1r>kK zN_X}TYt71k=RV^uIL$ifvfyEh@Rv^gXhHAoqH}3+KjR9KJVVnckPFrX;p*scSF=i8 z<5E;RMG&kwbLM%74>FUlGS7uD5cfH4%q{bI->!e1ze~+;C z1psOFT15pyBqhVigd3GQb6~d3hkWj8F-!qHo(RCDeOT)_t`w}fN_iaRooCNv+K|wYo^Wl5iSF(~LiwWbHuTi+*pL$coLO*`Vsyh`;|+LAj?% zJR>*5V2eyBIoKJ6{YZH$iFQm%O3J_}UP8K_wD{To8iD9c6D3A=ybEvAMb!=w34B1h z{#&M$9EWX6i&N?vLpIE{$+)_@w*UWjBJAG%VTmwwe|%96E!Cxt2&%rwDv!)e+RW5g z3(!0-vKg>_g}$;~u;gL4m4Nz~PA?>&SZhC(mxs5|7tr%y@#6$UKZF>k)k*@^4XfF$ z`lOKFR(#ZA$CCs}nI0d#fKvZnoW~-o6(IEH*Jk^q{KCjto}R%}?tu^Wp1)P66d0Z% zYeI%JKVB7W4Ry3a)||v#Pj-roj%K=q0<{@I;fY*L$ev)NSi*MS_Tb&GnnLnF2e zpo4A`B>{2UEVGLV9vS={*55C>BR63-Hs3X`Fncc;-)1f6hoeGhEv^)oAanGg02}e1 z{-kLCdxe~3_n;;O^HmGPt_!c*X(`fWOfW5eUV6xESlKEin92NWVowq(2;7l!XWdT( z6J=8&+WPb8OSbDa8kOdLxO84vIKWY(aOrdmW1B zvfZP&MyGkR_4+sV0Fc!a1E7ULa zBan@}&v7HO@J8~555Qysqj?3%9T(+tFu!E`Nc_*1WFwh?!vepPzorx!k~)DC^WFHqPB$=~DgHOojsQr&bWi#!%lzlkDh zKzdSZVEHJ38mXyoHA3dzXxZmpxgR0$p$ru%h4y3QR-r1tLjBST4WKF+3G>k9{A&A$ zRkUNsv@*|=i!As}N&E}ut8A$#^icP)s^iwqC*vxpFzGWh*qI77pk>S{V<`}r3WQxHnb-6FG+Q&5!(MbO0O$WFvOh-;cV|XHp&pR3v7~zX)c!Yu{Mpaq7P4-a4^ta)FjN*H ziYCcg-k*wPnHz6|No>|M1}Nnq4G|&Jaw6mERu2J`*oVt-v^z6}AMhalU1o|a^`UoiObg^@7b*wDLGuxx1Za9 zta32%tKkKVxrG`W(cUxx*RA@9UIbDfETPGl%K!ffQ$m+9Bfnr^`zZ!>QS{%D9h_te zhw#*?mvLnmCbYua+iC>t@W~Kp3iJVz%~BYb(d(6oS|uPlRLFR|`be9Tk3FQTa5GU3 zg+L8l$2rBCO*R7h403EqQ1^MzBl07g@xZXH9+EOc!^S4f5*Rd1Fn`oA|DnlVEN8`z z#3=|E{7n!z1qpHWbLC0s$)e3LU1Q+{t6XNm*ancHUQtiDs}vbbUyVT_Npl&37Me1O z$4Eu*9kSCp`K@g#HT?#}YCffXzWIxpZ{gmR&z*B{=n~$wG>S}u)_%J+bZ2MTnQ_E@ za_WX`K}rqgW_i#XWVFe@DJ{US=3CdKND#ZVjlS0DtQCo0$h$(Ek~@5Q!V6L5(`|S@ zzK!L$o)@{m@#M^>MmF0rFCu0~f-U$+LTbiVmIihe<98Xm#|?4rOQDuuO&M*lB;e8q zoT0ZKPt%7F#K-z_BTju&LzO0>n$|F*F%oDlw*ZBbEpd0K)P0WRgckS|#J-QYvc1(- z)|dkpqWT$`^u`L6NK!3uk=V1djId9r5O>*|4D5aZ%}kf0dmj<#UO{iGp90z-HyYu4 zKQI*N%ay55@-fkbl!W(ITPwA2Dv4nEn*0ZE6^bE%7W;%?bfbD3_DCru9jHhAkJhq2 z9bVQWc36B$W7mR;Nz9^LT82wqC(Y>wj&>V(o+m>7)aFZPY;3CB3DiE+oy_cpXICe1cS&$K zYv~uvCWb99%HeE^m+rY<%x|QbeOF1(DBKQT;|dDcV+9uuvyoE##zU3gLw8F>&71ey zx9Ph&VDZ9NLvNCSrt_4!@eL+g|= zC1!7G6#^v~Gbg2=f6!&gY+P02b|MOQf0 zh?x&4xS9-Iafe5bSGF4oj4Z;n{7sS?ir5D0oWm!fzW4x2Tk98L7e2Pm4``vA6pp~N z;ky~Qp>gd{AYIBI@GNOK3y-HW7bw&8j?~ncQ$Qp*eW&bC9&0|1hU-)=Z>!Cy?O54V z?ZRIX2$t9EhB%W}*+uG%wJS4GN^y8h8Nss5&l47|@6Y9Nx8w7X}R1aRP^ z*7d?JlY*cQ)VlAmewwyfgi;dX^Y)`gs&fF-Ht?@rH$!l~kNh&L`#c4KOJ1ktAauzv*h;7e?DgAes2*<>iF0mF@>r=3Kp^J#S z6pan4GPS{Vt7vcLAIP+Q@t*#Jw6bv^x$bovJT}GAVdR9g_TA&uPrfqE$iBh>s|mul z6@}G24^4UX-&&wne!j)7K~{H!RMQA%?S*Vj(!2NCK43`AjwV%B8*t6TUm6w>!`O;VM+r)IETiAa^>2?qE`u|> z#3=PP+7E_ChP%)}Um_yVR~*k>2adz#?@w%Dm3z(T3kyRVZ}qph6o}Uq8nwAg*7%0Q zL}Xtd)@6#|rWSP{yM%s0g;LtgpSEY`zS7ywF=a>%Uj40k{9kzWF8C(`ktH^7w_l2= zh}()8WxPao|E>lyOc0LWM5L5nO-`erg7Jo$&ZX`)+IhFZP#wzWb_gqPoT-?x?c zi&dZ3c|Orzo;#L$Svc*>VYGxq)a)9KQWLU&cAG1@t67rpw|?^Vx6H}vhLwpi=az$M z65(q86hfEW)wG2nF|C0@-1Jid1JV`V=K$R!ZS;#-iEzw1=vgiu%(wP_C|*rY?sodV zIGA3QF`RVkkAGTDBt6GZHTlVA+%FtX*UxEcqpttbz*N`} zGh7pfDmeT4ez6rmGW3PCj~K5C8wMs8=y2+9YB9Ku#+4~Jp;)O{R#bu9@z=`C8Y2dP zfxh@n{x@{yIe}+)YGH8)`ZOBx?cow3vO^qrr#vSEr!5VAAw$cvXrLiL^No^hfge?& zIgYu8l}{+Z?vT zVDWz|8gMEWaBcX=iKuZkW{}Pr#tURT!$~*UypQ548jne~?i+d-n3$w5l_6A}aQE`b zD?6jzD4|4!Y5kyYgw;22P0==3-AMJP+DwP9UiOr0P2cw+bX_%NZ2D4!z2Ny{og zxjU$@g&!hb)fZ>UDKV*TcJz8;?&TwZ0$%*@U#;un#^*RcmRydctuFLUN9m$e0M$19 z53kDrDh^}*mN4J;+tPRj?Yuw{8(UWI0m#hIhKFrIQsrHn7;uGv9}C(20-OOK zi|AM$$*}%+t4Ex0_~YjNdnZPLC^Qbf(?bx0w(E$wtMP1kG2Wj~zSPiuOe|CuJ29cv zV3dtCH%O9Cz0s3{WH_RPFxLw$r+NshuVLsa)UOMCkYahyX|_d#(qb%Lm_cnHK6no< z1njn(GXHiHi=1hrD07*A7q20ArOpX$@|KnCC$E98!VmzJghK(+C;jTAEZE zUp_b52&4$E9XA9%N3=iu2iteQh8Gb+S5O}lDxc5IA(}?;p!Q6f?j~`X+37Nn}`y^88X6B>#lcqfC;BVHN%1a z-H#7a@)teV+N3Pa$~61)_KsDpa*!Y&Vkb0m%?t-FE-1OVNUaZH%`JXV+bFO&7^|Aa ze9Jw<&VlX*z|a?YB|wTI?;cc}NH|4iGllTHd86sZG9q}~&MHVFlTFVD+Yw64&KexM z2+B(ZJnhR1p*-BLwPXG2Ha10FSf^74=LQBwYNN9_ifs(f9~(3Ky#PVSqzEW-fdqN& zGTpBhcIhn8c*vh*Cp-62{t{*UmV;--DJ6yM@vptUFb=}}e939kp$C8ZGzI;Z-OH!< z8n~cZF~}@9Z)r>}81ESlbmI7=q=x`Uumn2!;&G?=K0x5?fNt&uZ5BP6YKOXTPzx7~oe@6D^c2?`YU`EISm(@4Ey14oC_|o}&HjjCuOiO|!F_f-ZvC z3*6twBqWnT6?wwOWJo;-^yjCn5J(z+DE>f)?8vmOJzP;kNp4@`$5g4wZ_{`1;*=vm z)?96Jr%~r&x*!@b=GS=3obC}zm4#NdeCI061NV0~z`5|aO>*!1cXs%e9St?&7&gyh z-u2lSC%EO}1bz3nF2w5Ezuf4ApMf0YK90|Kcvbo$tYy-BflXbG&grla<{Q`5sgV*C~b(O^zb;!az|%TtcnD;{}+jnItiF~=+P z;+=typV)S2q_-K)=#T7z`P;QhxshA#-^W_Y<|~g|`y7%;jLtMzBJ7fc65C6~#07{k zn9ea@-JLih!zN{$&hg~g#rsX1`aJ8Jfpl=%r{&I9asKC7vG4(yxP-5fwiZ4(2>+rj znkZALibz{UR5`_J2$(27atLH6uk)$|L*xdw!-t;1USY^E`oH1s<``umaxgVAnFd1j zAjzZ%-W0lBjYxl-0Ke2l^{V(6&E|&DHUf{4o;6WrcOb> z6hIBPWQN;XgE?hpG(}y_$7DKpPZ1Ehld)NhkADH_S;>Q{3ocD2t#ub>zO6d3cWNKm zm0=@3Y?bmNO^1;4iyEn1f=}Qn*0RM05$ja$jb?RiKjInNV~xy@)0zn(6mj!iwer2C zQKcPSQSe4qa~h6!(p72fpL|ZKb45W3h|_$T<$4=wuLiQY&2>&adMM>jjl4~=@UI`< zT`NU6X@fGfq-52QuwI$DW%uZi1F#?>#2}BUTj%sprz~5RsD*wFmIF7 ztcGrbMs&Mh%c2ABFv=c`YZ#2{n!Li%ID39*(Txps$+X!!RfM1!!JxqXbsf!pj}TV> zJzcLi^2T3n3&GtO%;B1v zq6CbZm$yNBm)xrK`^&{YPfO>qGJ#LFuLo`VykPLY0NKr`H4;?eJ=t05(~`Kb*=W@m zSo~Z&!g&c>IE9}xR|MY1UOp025U~>NB%~6{M#R$qOK06XToALzkH8rv-_IS|$X>mf zXefdJ4&j0RtBa`@?G+aRag-%T5RO^Dq{IJUXE4$%EzXsH8;uZRwnj>d>vP^cYtmK55>NnjFNs4spyYPQVvSUEi z*HF2_1(kjyM4(?HYtdVD$W^Fc>hgSTeZ&*#gW7f7KwlTqi+6yee0=j^lc(EIaq8hp z{0=c4-;x_=bRJlabY`G_1lq{cA5l(55zcz1dD)x zzc;MiNJxX*bZB^ausvz~J84N43vXzuX~BvH1^|{DbwmWY^LL8^b6$%N`r@f@70oP( zg&39{wjq2!6$QmQ&|6D<>B|$U4G)*nyu;T$Nvq>+jofFI9D`EvTcEEP=rlaP zdJa(LJQM9)2ga0-#8lDN%(h);Wr4v*o~hlRJYwlbdbp3Cjz(8p%!55_{ds!R;jS~} z4EFU%--*8FW)4TnGp&XiRX$DGEaR>;(Fa)kRQ+SW;JHObpocUBZGUlXwoZb(ZWV6u zd2UQDVC&B30hhFeG_L33Tvz0TL*W_SVq#5DQxxcvboVvWXk4`tpb^fU&5WqiSIT-} zwCIlQ1^4tUTNdBw8cPiO&~3k)MA@>lI$#q){Q;1fc@--jXjF=Gmp|IpgwwXI^?-CJ zG%z|a1rQ3#^owccfJI%v4I#tv6})Nb4Vk%P7ZU?&7mE;ZU@3A%;NxNe$iR!zE^pV| zP17rut2R%Tad1GFp7PQ- zh;sF0N8L>C3j8iH71?~{nxoM~1NB+Q>vs9r8CVT3$6~;do{$r7IHIOx9GiX=!m2(VJI+%bqaDUYeKNamhEf@x z-Q%8!Wa>3`Eg@2_Oy>>dT0s`4WU_kS7i3ub%VggKoq>u}>pxnWPGsadI=q3iTL+x$ z%l~rVZi(DS1ZB7%cETEe72w;=zpw#Cz4fCfXyzRsEP5)3tyItDl)xumT-O}_<)iWf zzZ;U6+U9q)L!x{!kw{cOagX~xR#`e+2RTmM>2}7zU+W+(g$#_7n<44AWQDjVa(dv` zHaohosJo04k z?#MHAvWm;!*V`5u)*U4`R@1$u)=RF-EUrZ>I*U?K*6Q@_=#dD?3z$EE`NfE$*m zJMbq6__V}Ti=}Z`XozS$o__Xs>#fRQfTtV71+wY6nTe;S&Y_n~OiWApZ}% z_gW7sY@}6KKg%Cl^kTZ5Y>6dlPFvN-*n?qq<#pJQV1&aYxH-_+>Xo~n>R@b{6=oW1SkC>0}^(hoKV|9EG^-1ppni3Ev66m(Kp z9L((g=bH1D?SQ!|6KH53c>i9Yo0hA;8~6jMs;H_ds$5o7Rkc?6M@#jRmb%JC6%{QN zmFv13$^X{{-iZ624<7%&FVJvpR00>+g<0DN-o6(i?dy+t;Q7c+I`FZto3y8IpeqE0 zz9nw+@%Y)w$^9_z?lE4t4RM@5rsR6;e* z4VjT-mvSsZ%pf7hL1T=WdEPbl{^R}Qy{_N&`*vy8TK99`_xjw2b+7fT=aS>W-OJ>( z>+gq5)0@Hgjh_3t*!ey~{oNaJXM|oKNH_U~@A3#3|jqp+5enoKE?i zJbU{6sT}}l$L{^z#`#S5crPSeFnX?=TrPT$wcKdS!dIr{0-qyaL&<;z2lWw^qd0tc5L!z)^Q z2&H!|A2TRyp^K{v4v=D+G||-9v(>NL(;XVQr>Aq{SKvP_rzEK0DduyFJ_6d&&Ju;o zYtevYDW9-$Qgm#j*cSby3!_aV0sV`f_A8C-B^r zMDJ$Tivydy`#}RmZwX&;=lZcbDcjUlG;nHTidAUq5+;O_5 z0E&MUjE&1YIkHwCfE%vD_RZq;1>?KO?ISYZ%1!Ay8r;8d4T=4NWE4^q&5+$fT~LIIjxNb zL9@Se!y95t^&MdpI>#wi?sJ`L_VM4gDWnf71IPVbhh!xAYCv9anBEf%AnbRgRYX^r zt3c=H=4vWn6M7i|G)w4SJ{@mSo`>>+`CIL3`Tb#a+39ZG%bLNe{{ni$|d zqX6OYlRsYo$l#wZvYc>G2ReYhvtn7I5u}kk%aC>Eyb^h;BJk!p6vc<*VA8Z}Xe5P& z6Wy@6uYa=zH`c0MaTe}3Sanaxcf5}OEv0gi7k~ns!Y~!*>575D!1(b#2Km%f4yQfS zK_nFKuN>#jqgf#yQn(vi7adFxVw^Cv@GinJNaxIK__M-xUMab9N2wxUU3wDDe^Hb~ z@z;_zMl!x=NKGbl>;H7MsJ4=(YCgj$>+efjKHRp`s*bK`UjMLWvl{BC_ z$<>GDFEqa}q#>`1lc|qmLt%I??tE79#{j!unT~<7Du?vLj2`hR%4kK)c zN24lyd;kqthiZZs$BAmlC)1kJ_&s+gJgM*g;hac+yXuATmsP;RSeXn70COkiP)T?h z{J)>I0%k|?p&B`_;Gq|?b*46e1Hg)oxnIio z274_V^pafwM6t0wvAr`a`lNozOX07Ht{&(&qtTe}{Bz79o959QaLV1?$F*I%g##x@ zdrO+vkf0Bvy8Bku^v-n7Cp3DoTmH2!?)m;yl)x}gWL7Ywlg8mQ;UxX&(-rqig70B` z=P!63gC_4&SNr4FV95EF=Uo&grVJ?#@j?ObzA#Vbmhr#$_XafHPn^9at0cVx1xV`N zJg3%#wric&(kShTn|q=jpMZH7#b}e>Bac?Mm~BGDX%ib^#o(MxJwE1rXtgd1Uf=01d?Ek1ton24@iY9w3%(|4gELR9j$#4F zJkx@I`|u(1^7J`@0RzSLFTPL1GtO2p4XeswsXJF&dFKMlTgyfl$;H?4cM?5cH!%kh zlkad1-?*|$hTn2r(ZnI#llgpG?fI!x?nElKV9{*8RZM#Z*ObbSLnxH@c6IL7bO$E> zuOtmv*axP_dF*gz>BIw(F#rcnnnVu@c-KeVDs}K*v-}&i0A0VL*sH5?HFZ*pA)vu> zt(B>eIMFZ+7n;f_m)BJ0=s#9HW*}}y0rM3Ne^!m=uWo_eV0GO*EL%gij1mo~j3-*? zrH(}v=s@R)?qNWVOPf=iLL#hJ+fKV~S16WmiLKjfbT$JL-j7E%6Uv>sjXHv0?wE|C z^|ws?V!0q{b!$j;t;~wJ{I^A_daYUye^EXWMqq_H@)K>Y(xS-N0<$FkyDiG>^6#6z zwF=-``JstUsePE3{!+7|?k^vAgJ3}2=%G|fsCvftGF5=pDgD|N;*?g(E3Nv}T@*N$ zpF$fn6h+t3Pu<%b6)38IVZNx&fK^&;ld)X2TCOIYKL&tvm+VM=k-r7XB+AgZ=65VC z)_GLVJnAhE7Z_*|js96MQGx+2uMV>Q4$v1%7RGAbyrSYWc}>Lw(96-=q_lH&N&~m9 zdw!oEm%0rA8u!e3e?#j~jZ410>B*E{0yO-$WNNuN!PBC0vlhOKS$i!@+zU%JYqR20 z`O5IEWW5(c=F)UQBQkS??R6ijQ1=Kmc~dv7b^`Fg5ci~^sHdPNSf=pk26nUjZ*cd0 zq=0%TA7N%KqgvhjbjKLJYX%L#5H`_AqhuQ2-3A9V9GbE)G?a-5tBfs?;{%JhslL}< zqD%@>VSn`HfhIJ_x%PP#(%#qHpNae;_BRtnzf~v97auMmzV4%u#lH!MDMlq1CzSa!>FNFH>FJ9CdlQk@iCT)PSN2`#Ktd6r6d5|-|AvgKj1JV6 zanjG}VnU`fq937WR^Uh3Q{4r!u;831T(cwp65=b9zq7WjZ9zk(<|`tqPgj4lFgrX; z%VQ(6O83>oV-?{Pk?65D;dl+%N?c|ZzRVPcOnqmqO*Zg*?*RZT(311pf74K*C^YQ< zY*;6j{Ik$WSxAt$pnqtLf9BU;Q6)%v`u_e#W22Ok8b&z+mjp{zKHyxu4!HtZ%r0SH zblZ%pCeOwaRjMh-d`EQ$^yE+yva2$B^aTGzU?9R=4VS51pjyJ2bs}DG75@wqFZYf~ zuD~n$X(}kniQ1Co7c-s5vyF1u$Tn!$EWhp3F8%|afUL}4G{;p7IMcQK=03`?Z_RmZ zNBg=M6=xHri3|v=!No+{U;{)mSsN-0Dz|^fcozm5)_pJ;J<4A%PA#L|G%d^ z81`Pd#SYe;+x#1=&P%G{wly#xhSWqh@r>p8O?ct_+*WvQ-K-FzwE>{0TjVH2>(IBm zr%Wh@qCB#&DsFH#NC9oDhmAPb0ZRXV!+zUvo!{u+pn}xho|})VfF7h?QAK|7=hnox zOww3&d=uA}*PX1Gkfzr|(Y5u= zB0gpWIQnzrs_`T&bzd4n;$mA+^qK*rWe*qubUucTAr;iK1Icg(eKAz=fBlp{<(F&{ zL;uI9BF_9NEm???k;Y6HLVjmw;bIyQph=$f#NIDcm#)I(dQikStMwGYM18bT+<5j! z2_K^ioY(5iPHD;jDe5^tWF7Dl zmk5O)rBR5LwMuY8mwKYkRNQ3>Bz`cTRH6dMu5n`C*i@wi&8~XlCxOm97AiRqB(h}V z0g8UNixMQ7zbpkGTh&9aA`t$UR)K^kgje!QqQQe3p41_ck7+X`zYwF8!N%L7`3v%5 zh}F5_AHp3`3AS@d>Jh)lS6s2A(9=LD0UW|(r#oQuP*4?n91oGD`5_`s8bvbG>3RwN z4}J)y3}OcG2Wrm|nc1NMiX~zGhqQ0z^=gR^gL!NvSFyx#4bLFIMDTJKghquwIFQ^d zZhuO~N@VFq!6`7E>DC8D5(w`HC-Sm5ZzN292!wsZN^&$;UBaYZFYyC>CqO|HcdZJa znoFu*!uE`>Bzb_bg?Z|DHGUF#z7)sCWlIEn5rTrTT3aIS6id97@dbg}Roj*Zduw{R4g}d6EUv%!*#V z`{hhFn?W8rcJ8g0*Og5BJ392~-O(CC|3TN!JuT-HRwm zp3pHZp$|nwi%-ZQ90a};F$vut&F4L2+e39jw&UK>x2D zUB$no&}=Yg-GM@X988#)F+rB+J@Dm-(a3AQ(F*Y3m@kg=wg!&IyK-SjLBtkC6kH5p zC+%QK(}fuQwmPPgZKj5>cMb!3SYryfGJocLgTFM2de^o2Cm`j~vaZ^11cX;KxjS7r zR7ABM#7Hk!I_P`-&9j0lY{!c-Dr%N4vQce`x7}+SxaK4ukJVj`8{(uqI90v`JHaZ=7*I03ADRW6?Hm zx=DCWz~1K*9y|r_L-dZi0ZzsY_F;K4)hb&$C1Ddx_<~Ox0SDvKqmDoD=q-;aO+^E1 zM_Npe-+jO2mq-i@VLbiHPzVSz)92d1Lel|N>4p)AKYl6QN0ovC_$Mo#DN;8MO}bsu zDII=U3?FywHE1w?lW4y`dEW$i6yoH2yCA!8wA-R=2EUmLjngET^5o)!M{k3Kqd92` z1NYwcoY({p=hogUqE3;5oPs*X9@=k$uuQobe`lc{+8m#C`dL$q(S@Ygjd7vJH#!DY z1V@hvRL#JDKu%V?7uAV)a?{z#~}CS9rqsbPnN(jcDm*NIP>C>7I1yvmM6hjK(3 z{1`dZKLu}27Ng7p5P9(NaDOW5TH<4j)8FGn!;nxpa(WsQTAuH*BHmFL?B0GCzQL6O zB{>QuAx^Gv&~)dmP9c#l$^@mjWG|JGPGiR+>9*D`3Na&GaQM0XQ7sgFw{^WaYaquk zUo`I3yQ7KnJ{=Um^ibZ@>4%JQAG+~-zQs&Xq^Qzqc-Cvj-76;xY*EpL{GvBrb?6T4 zOH(v!;7dzNa8en1WRLq(j@4h6QtK%=U^s$Suw6(;UEh|94p@MfO*hyAhnJD_%cZDl z5AN&CzbybqjtGMTMeFB7PD9#nGla0lEF)DU)zr*zlQ@tW@ASS$=f~kcZ9u?v1_2axZ+Cd3*A+45{R3Vz)l=?2uL$L3 z!d28V>2b>hlXIHuu)6FeJ@6lzZ1Y9n=PnFB7JlMiLgP-5#_U=GmFEddc|F{kVI1gf z^M+D%{vDAXaAr$?RYAi$!sr?AB_Un-pz}A+SqUedYQ)-uQ${-q*GDwu!=2&EjUT~b z!#WqKiJpngDo9K{QK6TsgrYw&V&ywC@#s}@sQ9}uVwBE3IUp3e7yJC1XWXX%&M zzN7n*p+}&7u zjq%&hV&Ue13*?{sPxlg3%4kK0g{~RzcE=8q$z23G#?eb%_k}oDF0Q=lS;UCUjm=}o zAuh6(1}_{oBG=*vSS?1P9{hq;EG}K5p`#^#XK)^1E#Nm=BzR`JQ#^ z;>1?-t9P0fb^}hGahu5Uhjh_i`~OHenR&N68iY`+0_LN(OeQ7*)_SJ1Qt{V1_H4VNyO;`P&LlWk>%0=h^8(x*vI`0oK|w!!cBoQNpM-VbP) zH6;m~BG!P2o5mws^~&@eH5})vhMwCxz@k4W-*cDMm73@yhw+KO)p00s(eZk^$YmGh zhk?Krct7&ujKZtPJs<1C6s4M@bia;q#BJY2LqX)Qkd9Y-{Au4dD?lx?^1ZiE=_Vfv zIH}qSu{|nskR1P6YQG$NR9p4SfFb~{!pv?@#mG~?SMD)(xI8H zy-{G0uL@)Gafejpv4{%vn-b|Y*yKTN6&}W_hasvbR(>>wWW5_-1By5-hEfZUZOPUr__^++`uF?tkdH| zM&gbJUEt`68yQme_5?39e++~_!=u5M6zY&R+BHKat5RJaVZa=wo>q2GcUWncl%%6Q zh1Zgk0{l?io>X-H+ugof^*<5<7W4qi-w>;Q1_n!{NA=SAX#1@5zT|?rgv%|k>ODn zo45{}7_Ebv*VK2|$jeNc<=X(NgH$4PXjsGU=0BqQ2&!baNeuLnEatVgRJ1f>dk_2b z4=f5aY01cNN9`gW_P^X0DvGx3D++6rhxV_*ng8Bmgxy7Hhe*Jz9L8RQW<@t4Ah*P` zb0Ic(9B8@O#QNg>iB*1CF|CGY4GBC_i{)pXk(F03`7hMjmI<$}Mxg*h3n$o)D^#>` zNaftq6o(n{>)fZ~mdWCPV`QqXRZU~_i)dM%qUz#Yb#MyIS)BCX`4w}KMc&(^7Y|(U zG2#>TdAa};$;)7Uytl_KyBXykpvG^DjY=fy&tS_IukM6G1lpf1#JQe(NwuBpN7iYp o%s8kDM9e`AD*&9w5oryu**cZKM!KOJz<+yp9sIp`r+3o-0EgUh*8l(j diff --git a/apps/static/assets/img/favicon/apple-touch-icon.png b/apps/static/assets/img/favicon/apple-touch-icon.png index 28fc29badf47dd0ff6762cebf351a0fb370e39f6..5a2633c996a0e94c78a23e1604a8bbac30fd0c78 100644 GIT binary patch literal 2454 zcmZ`(X*k>Y7XGUaQ@YHIrNwBeR;#vHL##n0v5VNZ1Q8J=2(eSk*ea+b2(dQyH9_sW zUaF;y&NMUHUdElOwsgkmVrfnK=|1)xH%KdI_lyLJyq8Lmi<2&|55dg#AXym4Xo{M*v7t1%Qlf05}kaGF|~d90&kj zV*mhB0RZR8)x)l)0C0lk;(&%-QUhy45FWwN@!4fXRc+NB!*}|o8@Q9K*1LJ-9CBKr zvrpJH9SayLFsrn-X<)X#cf!cp)e!2E%V^~E&rq^T)eUSsLt-jh?^-$gT~afONX%{I zO}Pd{geUyug^M*qcp6!|FgU!c+UB{;MnZfJ0v)7n49_X6$5S#vCP-g=oF>@T0O}M* z$*O4XSGr-8U(UHJvgSKZMac5G2RrTWysDWG`G4tkKIjc=&R}+tL>Sn z>z%CW9%pro(whfw)$yPXzKoW^Ja$ihO;7QierD@XQ~ykT?^I3q1iNdjs$-PZImYf9 zuj`p;;7;3n;V_ZOrf_$kP|6i8)5xTJV;HKWw$sU%a9IPQqG_60T$5JFB2cppEuF7u zn-UXp%bWWdceoB-p`?^T_aG8A=QfSqPH*g0(KPW3r`os#T-Sqohf=c3>SNMrA<^l{ z`4z$B^tjAY8)yHj_90SoeoR_XT2WPGQeIA3gNgGWDip##OWo+vf7!^QF zWHj_T`h;m1T8G7D5#qDaSdxyJy(-AOwr9MwuB(96`V+mu&Lbq9R$Wxx=ID*D>mG}} zS&YVz;BHtAFf5~(&1xHr%PPf2CcF5BlT&ZO-7sJ)7jIl_5Gge|m#JxFdwhH>qxL*p zxV|Dm_Hdi$WIRt{fN0|7gnCvMz#rxz;FaUhRMA|^n3BPSu?*~fbE=&X$3oSr zyb}MCjSc;!5+7jk?jyKnd35=2+y^%GC3{2Wj>oJLN|2NaS|of^!VG^oAb%T<6YJY6{PSIiyHi|gmE#R!Wh?h?ib&b3$rN8rk$N$TFD)r$+BO{2FMr9`%J@oBmrf1zu|`#B+GDLjgFEdG$h(mjhko@V zzE(TO-D7s*)t9mGq}5l80Zjp__vmNuzj%a$B^}v?=oUjnj3f1J7N2DK^8#snE`xHCzWRPZsc$$SN%6?maPwGT5>>vFJ+|?@6w|)Q zS;Y2V#6C%?uhd_%n-Fh{gU__jJ#XS0shdfm)#ZxtC;c@(o3{*1hRfqQ8^)Q29C-Isa|jS zCExIlCS!n~63){<@*fk|Y`R$%JTkH9EdF!eT=8t?pQ08c7N1Vf41H22dhf1JqzOU^ zA}<11Sk3$(+kX@9?tL$4E%vd~6*;@I5O1F@M&;|M8%yiu`;D;wu(!E&IteOiyp{o% zk1Urxz|5unEobg&Di^!PJJQC?GCcQl zn&8FnK*(+H0{_U}wQdi65_Q`9Qb1o)-*yp6T}&-x z$6qv`3mg3Ia@YR*yY(|}Rq_X$$KxYj#P*vqOD5+&u0;JH8nD{DMqyIDsj_$1jU=ZB zJ3ZLqUnXNN?mVshrP{h>@%*-F&|Kno*k{1$GZpbp@^7+97U{MR)N+3`r>?XfxBoK8 zO=hN8uoOVAOkXw44gOFzYD>?}6f~5)Xb4ITCM{fvfJ>}1&$_w|?Yu)pSZFrw{p)E< zj@hyFZ)vNhwqKrC4G(>u?OI9Gd2)V10}{`D+ItH8-wR0&+O)`9UJ(%~=-Ct=?W+`+ z7bOHs!9jv!a6$ldLArXHAVW=ET{OrTqH6%rHC6|KARv&;g7dxq5k!(g2%(ApUl2n7 zm?RWK*F4C Jx~wpn{{R^pc$okI literal 2681 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 diff --git a/apps/static/assets/img/favicon/browserconfig.xml b/apps/static/assets/img/favicon/browserconfig.xml index cc90142..6f29df1 100644 --- a/apps/static/assets/img/favicon/browserconfig.xml +++ b/apps/static/assets/img/favicon/browserconfig.xml @@ -2,8 +2,8 @@ - - #F2F4F6 + + #1f2937 diff --git a/apps/static/assets/img/favicon/favicon-16x16.png b/apps/static/assets/img/favicon/favicon-16x16.png index c935d8eb66337a38a9b27f57202a8c98dafc8321..544e741d62744051241325a7007b364087c37bf5 100644 GIT binary patch literal 769 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a><@}H9AUB(q1o;Isu&w^Gm^u7?sE_;i*55W; z|E{XY3i6oQ+%Ejhvmh|pUVG9Xk^Nze*-PafoLhGFl2G5z+f6*z9>~uI8o-$3?e3x$ z#W7Kr(F_VDR;odXB-6*>;33mA#Ii3%7BA5}e|rPil)AX%+ZNkOw! zO(9oJxm)Q#8e8FlIWuis91i*j`WS0!I`f7G2Bjth1e;%OuyhDM?Gx>O-N#@4or)*3 zuCsEouz@r~nLn4|&+C#NKsTtCxJHzuB$lLFB^RXvDF!10BV%0yGhHL25CcmqBU3A5 zLu~^CD+7a9J&g7!8glbfGSez?YnXj;XERWPB*=!~{Irtt#G+J&^73-M%)IR4ncU{>bVOXe0<7WSSj!Yr)d(qM8pg;{xXh{EX`S56!`b42C{`{@Rc1zvg#ufzpQ UJ~^3A1zN%2>FVdQ&MBb@095xgUH||9 delta 298 zcmV+_0oDG22D$=}8Gi-<001BJ|6u?C02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM007)cL_t(|+G1oN0xaEjL;y(b2Vw&tJ^;jl(OxzmKypkB#DM~+<^@3P z0K@?>31SVv35Ydd0uWyS;smG{Hjrch$iGitzT5cl*=q(MZhwUN9|Ty4b*i+u5b<7s zhB{Gz1xIv&oajhSAg+f-7wNG8wA}z2$0Pw{FTgZ|qUZrR=>QgR7lF}KNR9yqptL;> zwee8;1F|3^S}fcLQVP&CUkFMt(3qJIP5%dgVvhJ?ArNW<1`c5h#xlxBvkL0NVRPjHZyJ?f?J)07*qoM6N<$g6t}AE&u=k diff --git a/apps/static/assets/img/favicon/favicon-32x32.png b/apps/static/assets/img/favicon/favicon-32x32.png index a987b585abe5449ec176b81d4c3b871c05a6b37e..f268be00dc5448fbedac86772f2f0b2c142d88cb 100644 GIT binary patch literal 1108 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081EY0-Plzi}!IEt!mTfz{ zY}*ki+Pr_&wnGs1s{Q+y!o^{X<=c)dg{fb)>e#B?XCP{pZig6h=>Px!%eI0{o3?W2 zj8!}P7jK=ocOK z<{w$U?J&@y!+{W1@xni_D^15@FkT5`2{n`tp5CAp@`^E@-^C@yMRTmpJ(! zu1k9pz__^o`K`O>b}U;Y$ore?oB-4QTz0>{Q%RGpn0HpK=$dl0u=>U?PhI~ej%Ttq zKPOp+zpMDSIn~ak;KUz~ZxOc*S#N&5GQ+iSQqd})ZH!6Y?k+NOSRC1b9L@rd$YLP< z280&jYP@A~Ke{{wRiFWjB$yW`XDQzt9aCe7)nShDV(fwYvX76MxxSpIZOHGN?jO$t+kO6%v~S;D>$3ffPyF0d z5>pF6!KPZ`8c~vxSdwa$T$Bo=7>o>zjCBpnbd8Kc3@ojTOs$L!wG9lc3=CfNFxsPN z$jwj5OsmALVfMwH%|H#3ARB`7(@M${i&7cN%ggmL^RkPR6AM!H@{7`Ezq647DhjU( zi6{w5ELSKf%1_J8NmVGREJ#(zEGS84V5pe$_!AFDVVH)-DgV=FJf8+JFe`KGC36ca z3wuu%VHQ?!X)rmQ!mPYGMB(&}D<_VeIU;j}{d9xJ0xvy=SK@*tpPWpm01boFyt I=akR{0BeSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00Fc~L_t(|+G1p&GFZCphy#%72Vw)L&;}rGjP|m*fK5Fk4J_Y}Md||( z8v-5i09}HK$^p=i#0L2oW}yHO*JIN_Z3n=D{Q}Uph9F-f$$u%(!vQcL0E`X+T$a+( z0UMBf`yPnTBgq}4hXWd+2@V~A(!&Ir=K^R>Q274y*M3GuMo94g|G$BQoh=cVCO*(5 z4S=%RtG6E?ynOS40gT^%yok$k5MZH23gqSHWcdB(517rt#)eldO&lP^&qK6YT4lpw z=m2OrPk#phEq^uuVo-sypB9c_A!IqUb`zj`6hO=J^|Z8{P!!Y?Q<>1j0ifa(NEHlZ zE(jRtY-o?f2DNGy(AxpX3GV^0GD!r|g-A^-`eZ|-5CGM369%dzBqt|0Q0f5WHoOD0 zOdz+&en5@`(A#gMWJ&bq_W_a}0F3VqXfCe@`YeG6-+VWq1^)(Yoe^TwKp`4`KGXuN z#WoPn$Kv}&LXKu6;3JTs30S&Wpb&Zp<;z10F7$K)YKShN$N_j9K?oEQn{5eZL!?6J z1CeD$ASq=ABMI3{02&hh&_195Qj~yF`bJ`c9321z7yv4Qi-{~hH+=vA002ovPDHLk FV1hy%(`Enw diff --git a/apps/static/assets/img/favicon/favicon.ico b/apps/static/assets/img/favicon/favicon.ico index 2d0756891800042f2044c2143429dca51ca98df7..51e4d79035f1a7adec9f8183044987d8601a1a30 100644 GIT binary patch literal 15086 zcmeHOYitx%6do*E-{A9yuU5sVF(&wkiH2BBG>UIYe8fLK@fj2J7ttRr5Wz?k5w#@< zEp2CJ8AD5HcXqctw(UL&STPV#RL~Lv_=HAEUF_29cV_Oiv(wp~*`3|Co3P|?_TGCQ z-??+=_TF>v3c@6zM3_EZ052DO*9pQMf*_Qa^YT=UB=iXuUN9xkEy%pxvN99b{S5FLkM^TAC{+w|W@s7XZtTY4Dsx zeIv&9Lsl$Zs&Wa&%8O`^r_n_Wa;;k&xynTY@;Y1p0jVeMZ@k&bE{*j_Kzs@|{T^TuZ_Lmqb)1X%N1ifJ?c03`ew90xjP)LJu{tN zruyzS-;J=>H`=B&FOyy_ZE;n;#l}yfGgN59WJLjrheXs~^-YHE`t0 z6-6n*-1CFgc04H3@*;1as48x=`sfP!Zq0{-m@2(*wH;OE`T4MI*noZOd~qmW&)9Bk zBBo};w^vScIq;{fZ6X0F=GCsDA8xLlYVH4sU)pN4d*!sQwAx2`y;r+tec1cg>?5K| z-<#XLeDB$yOflQ$-@}H@a5y~K>zoan{V6{1P8;^Uaz6K`^bdR;CcC>8=!l5uJqPy9~U+_ay<@1~auCv&R* z3)i=9EEjwKceOPf-`u>4ZCbm6h1acOovn>OxruwC$TY9~kTrj`XqeX5Ej}?(u(`oe z?D$)17c*5{$^!B-rZ#@c+Uh?pivFj(HO>XTi2B8pbD4-rWqCg3HrzbF@sOdsHRZuD z_oQIAl$%&p)oJ5_&&g*rAT6|DwT~kpz2;i9Gb8SWtc#d%WeAxb}=S zJ|};ayEbE_b+}mvrnooa)utn$Ih@$~9(0zmdkjvgr`Rr`YHW}-! zU`!A|r5aBPB^pm?bpq=Xgi31fE$gTt-ci}7bCxKh@;sKDLVN)m(s&8yuvSX-PW+5Y zU2Zbx@TTciS$GF88@!j7`#4Wd7n+^?@u3omhq2@&ohJ-l&dYN+@3WKzy=>?i zb~Jo+Ppces4`}$FmNuKAB8Ly;{I4bx-*@MJ~oE$=h1UILU(-9$vf49q88uqV>?`4v;YvXg2{tW!mM|Luq z>fjsa&qn|0=g{;%(A}0ydPZAH|EbavquwpY-uIIc|KhfYD!+vCps^lxvg6smHs2cY zkMObb&+nJ~Hqr+=hOzQb{fl?-?eX+aIRf|(n=y=K{L}}0F4=Bi7;FE8f$p*JwdkPR zJB?n)Kl!zOs4uK_>B@!hpU#(E{VD&Zzh61bzjl3^P2J|TD}wE7s#&{I!!|Xol(Nyy zhpfM0$vz|Z?r&JSJs&o+u@PGHO8Oe5U%AZ{_ z-7`as$iYaM*BT$O+NLsoYx6R-W4@`dZC8CWx&Jwlfc&IY2Kuvf`}X+*t>0B?K(m4K zm2CA%9x;62MW6Ozbf$xS`GQ>hTXoE3r})jXcHh0~hm`8MZS_moMqkaFcJ`g>I@j0w zJJ!{m>}Xl7ILTVu;{ovjJQv){)}GHG@=r6YGMUPJY#!ymhw4u^M$_4#Gdw>2`)SQ@ j-ft%`n)}KG;qZ4l9X%=tL17~LHMwtk=)`|ZQ-tC-* literal 4286 zcmeHKu}pe{Se@MQ@eqwRZi_bOz?wn> z?o+cFx8?0)N6sU__8C&K;PKjE9hQHX;`gy3S8ei*b8+BvCc1_)7nAZMhwVM2cqtoV zD^o*};&s^&e`a#@{^cUho7i!eR?3HX-9we)blHr4=;Ee)Mt_pxblFUN=;Ee)CVtsJ zY`g~*DZaIt_+b6HW5kz0ypC(^C(W_X#nKP1K7XN4jOHMoy+(b#dd+LwuR*_fPkr_U zeft~a9DG~P+Wyx5nF~31PpyHi&p-A8?L$C6TYU6&t%#{q-Jy${^EEY0n|waUr+=OL zQ4cwN+~?L!=;t)G|3iO$*Poti-~HXyd3E#SRER&nzK6bX>*AFc-zq>FY*ioEUU6Su z)Yb1xA@0jdKFfN)zr1Az(6RTcc<W8*bIgS|#gyKekEDD9g40-Q&zWAJ<2&~u@* zri^WB*rtAbPEeD3&LQd#eve$Cf3NhSF4rfZ7@BVtK6F@vo|`AB32k%&jNpO5|lVfuHz diff --git a/apps/static/assets/img/favicon/favicon.png b/apps/static/assets/img/favicon/favicon.png deleted file mode 100644 index 6a751f21042e6dec478aa6be3147c4886a1ef6be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmV+c0{;DpP)u(MKpcog zj;0QPfd{}K2gUydLJFzvfCn(&0)zZKkUoz^j;0PML}D8trH2c+aspKy0JLNSkaGO> z`wy7^@85rh-+%rd0Ey8h8^S=_ob~^axQ$gQfepCSve3c-9PF$_tEGtp#DxWjR!ggF zI1C*CE$8X)0HDPJKn$v2&f_Z2DFG~mEQi)^1_KoZG_@SB1AxA7pta?MLLh&@asf24 z2@GU5bih-~(Y+iv0IcOEKwCEt=$Z|&RJ8*V0wm=GXxYI)s3k21ScLQm}*K`XI=G(8Nm;00=MuOYMYK5_e>300000NkvXXu0mjf DF!Ibd diff --git a/apps/static/assets/img/favicon/manifest.json b/apps/static/assets/img/favicon/manifest.json deleted file mode 100644 index 1d22e99..0000000 --- a/apps/static/assets/img/favicon/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Bootstrap", - "short_name": "Bootstrap", - "icons": [ - { - "src": "/docs/4.3/assets/img/favicons/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/docs/4.3/assets/img/favicons/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "start_url": "/?utm_source=a2hs", - "theme_color": "#563d7c", - "background_color": "#563d7c", - "display": "standalone" -} diff --git a/apps/static/assets/img/favicon/mstile-144x144.png b/apps/static/assets/img/favicon/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..b67efbf5c06918e88af800b4e26ad4d2f32514e5 GIT binary patch literal 2628 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 E0rwEUo&W#< literal 0 HcmV?d00001 diff --git a/apps/static/assets/img/favicon/mstile-150x150.png b/apps/static/assets/img/favicon/mstile-150x150.png index 5cef43119b53a4cdfb31d119c9ccdfef54fc3212..14f24cfecc599bc0067cb3dc33dddfd1faafec7f 100644 GIT binary patch literal 2608 zcmb7GcTm%b68-@KmJ8_N0fzx{3QCbsgLDp#76B0i;)$V!$OSYYB=jPl5_*s#f{L6- zmtg3EISeJV2uO`Uz)%tnX`#2^;d_6*H}huh?d;As-|l`hyZhJ1U%g@pIxck_000o& z%FF=(_(ZJ&l>Cv4h#IA)|O_#R|1jVbjXBpa9eX>j*$4VALTOf$BhBt=n&k@ z#4%)akr|olgqLpT_I^UgJQRFv{)%6~%ly67T(H{Ie(C9f8pYDDUjNkPRWy}_~O0eINsNTwgzN>;|q@tUY;nD<*Y>U zYQlToa<(WI7fl@9*Nl;3^I9e66c^y#mUOBJ^&R^Z5&&Be8Mg zpR*6rMeAEQ^D9`@fW+`N(#c2Lda9ep2-2Iqk)aDp_IMJPIq{i9SyCkXnmg%oIlLGA zFFnS-@VJbPmkAMN!QzsjG1uv1WMzxY?SQ6_$-gl+*JLCceH>$adDB>n7NbRB&yi%M z6|?2}Ae{v#8S%!|si9UV1ZGtBlWyz{{dI)Ou*PEdPARzo7Q`x66WweIcrB3<64Tx= zQG;Fa`Z`<`U{l2~L?MU?tB$fu)eO7cGbDZA93j;?9DQ(N<`KEf(mWK~gEyUAE8NX< zThNkK4BkkxgzCN6(8gqih?a9^GEt zEK4<#$qZ~f_d*_G%jVd}5IvP}>QOEX|HGJ(?>b9U)2|=;^f0r3DK(o&uy^B@?FXgwx?C=G>#~cc4 zb;qww_6wNhM`(zNT*%4aneqrnXJq>qn-fd?{;HyWMazM)!=eF3TR+HmnCaZCu*BV2 zP^!Ej#_Id-LlV+d91Q`>l5XAm-3A&Mf`!N&Rk3F$-~Ab3Qh9Y%$*^3V zoM=-uNYWj5K?qqa4mrRtKlUXJ(@2^h9L|V<`ug5Ku^q*+MW^g@)?-n5roHiQ6)nqO zvoDU^q{w5u7Xk(pC}Ut-s#QO-KLTF=xd9XJpeH`5$4u>D93%PO3 zGNOG*JjBwL`RtnduFzIyihQ^76 zl6c3bsG!TC1=`@wlFu7b0(jKJGqR*(G3t#qhMq+kzxuTNghBfkk=rtv&w1DV^S7iI z<3}%`Gui&Hk7MyRB2ksy?;~-RZzi4P%9%Nz1XVt;7?S&*n0_0?67*HN7EFy@@0!e1 zoXwc>mm~Dtqr4ZT9%xhadKfBLZl&3J2Lx@FtaleQ=vxPRWT&nw1ySAlM`@}O8 zt@^ypw*~wvBCCm1apLY{hT;9HZ4ZJ9K3nuvBW*IsFZ zm}DDLYe#vR3`)$}cDw;ghehZL&TW(B<`~>5U+?Q5`}x-$AHS}u4v}rwEHsgh*cmcd ztlpzC3}e9i#cQ89dzUBuxFM?DV_lQH7zXbi*nqCQ3axL6Y6Z#Djk&lA`dG7iG&D#R z@?JAiYq{BX!!N@8(HeGzH?g!Ig=7WlD&&UmcrSH5%^hNH5PbLTRaZNq?03V6_9ea< z7VE$=i>t%p@DwGsy#z z<8+&}qbIW?_w8bH^X5M7!dEIMt7Mt@EZA`mr@&!zsJrgG4m9q%9{VY zA62oJPCsadTC?W<*a>_0*=5GXvc|Hp8bKH;y|M8Tf-L<>ijh1i+Vo1dbNGIdh0W69 zGVblpb)$;YjlvHUZZ5Y+yi@wPooJcms#@Ab*-za<=twR`(aw1`T{}&!$z>(~kVLzy zx*|`WluuxP;iZi!f1j*!5D=<*>*nVVA zAxmlBCa%U!dHtDdAA4auwLl-5=5Lke3v*1zSCK}Jg6LvtBGLmQl#+rQrFH4kq&Oz_}_%NH=4!qm|wYZWZpnXO(vu3d~EK U!mXOZGQVvNH@{*=GIhWIH-=NyCjbBd literal 2627 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 HVeEecrARtM literal 0 HcmV?d00001 diff --git a/apps/static/assets/img/favicon/safari-pinned-tab.svg b/apps/static/assets/img/favicon/safari-pinned-tab.svg index 6be6e39..3058a98 100644 --- a/apps/static/assets/img/favicon/safari-pinned-tab.svg +++ b/apps/static/assets/img/favicon/safari-pinned-tab.svg @@ -1,11 +1,29 @@ - - - - - - + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + diff --git a/apps/static/assets/img/favicon/site.webmanifest b/apps/static/assets/img/favicon/site.webmanifest index 2d28b24..cb632d4 100644 --- a/apps/static/assets/img/favicon/site.webmanifest +++ b/apps/static/assets/img/favicon/site.webmanifest @@ -3,17 +3,17 @@ "short_name": "OpenALPR-Webhook", "icons": [ { - "src": "/android-chrome-192x192.png", + "src": "/static/assets/img/favicon/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "/android-chrome-512x512.png", + "src": "/static/assets/img/favicon/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ], - "theme_color": "#1F2937", - "background_color": "#F2F4F6", + "theme_color": "#1f2937", + "background_color": "#1f2937", "display": "standalone" } diff --git a/apps/static/assets/img/marker.svg b/apps/static/assets/img/marker.svg deleted file mode 100644 index ed4d224..0000000 --- a/apps/static/assets/img/marker.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/apps/static/assets/img/paypal-logo.svg b/apps/static/assets/img/paypal-logo.svg deleted file mode 100644 index 17535e6..0000000 --- a/apps/static/assets/img/paypal-logo.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/static/assets/img/profile-cover.jpg b/apps/static/assets/img/profile-cover.jpg deleted file mode 100644 index b6bbf9b19644ff04b772170d5e8f0322f9d423f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163522 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%0D%kjb0lPs_+8o38c~gmDjR@VJt(VlBb|YCi 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�!+Q&=98KJ?nI zqja8?C&9XRSEEuYLu7GrEgyRw(2?2(I>Oe^Utc3TpeOUqis+jsY^i)+*Ey5uG+e1# z$Xm)(&L-We1F$;Px_`NPN=rDt{Ck&%%guMd5@1J`C_?{Mj^>-rf!5|cZN`ONWonVX za9jPg@gv_Ixo$X_u)*SYC~=DJ#pUWJrwouxvHn3b?-mSb*YIR4YotWq=2$ocR)Vf_ zUtBDTUDA6xwJyNLD09Qh+ixkF=47{;Z!cGmPxY2V6M94nhZ%w*1$3}_3~4e68sc6# z2AuY3YJQEMPyh)h42J)}A2M`-NoJD$4mYR-z}OU*(>*b}zKD5H(Dc)4WB8?=FDdLt zq8k>|L?hm-cgcNo^FxcHWo^mGA^8a)^gI!RJjo%<&R|zHFd$l&@jxgz~d_ZCVx+}sa1qFpR0}eU%AHEiPlFza1b8wjj zm;B^xwAPlZyTEB`q;D6Z+VcCwlhpZ|&8~GF3{uynZ|4W;v5bdHZ9<#ruSgxohc5VB zd5bcI=+-ZLQGX>QR;r}~iVQ9Z;*`aSvznE$nIm=EWPE~)JwyT*yX80-2n~`v@Y%)nGR9NG$(r1;Z zh-GZvK5%Acqd0h-l?$JS$v&?%1^#8Y7dq`*+`gx5UYJ|PEsvG@hG<@+nn7TQe+9zt zB+*I`H~)6L@~DGRGFH^5SF;)sWWhfGaYeE@P3rz}$u%%Pupn0Xln4CNFctz~Y6Kyg z0%e)c%UNPj_*9WZ91lw0qjU4)jyW9psxW7i)+^n?VkIV_P_2a0OTLdA2jvw#L_b|E z6Pl#L6GV$1P^4I+emQ#5A3^^>TBnAj{^v=urLERyj#!3Rll_A&wa(EDChi zXW`mz^pZ)=J^tgC^wX9bj2@bg-@AIt$Pc?4K$i`s=ZlN`q~fYqDUYwWO)R=NX`;eZ zdnShbB<5A{FD%++rlZ{Y_d#CCO&x>%wV}f#{!dVfEH~O}Ox|d1R=;#uoctzhV7atw zvmI5M9WKw}Crw$xj?JR^cXlE0lVV3EXRP>N@a!S9Es*xLmTS0f4M6bBkD;$840^LD zD41?9P$VAYxJ4`|W7G(*PFmwP7H{Yu>tC&})qVs!bIQeX)=kgOW%vpV%1t>_Vg`NXf#S-56MM6*LzdP%Z~`8# zTwM$;-JjNQub*^Ca|EKP_LW|DhVFEp9bIc|tZ|Msxo%6dxPCcGl1O*{oI$&FQM!P4a&t#!0xD22=??zdloU(A?R$nAT1I4=KNzy{M`~$`KD2rt8b0 zPS331X^eFKiN9&17qKPb`ygyLxU;g@#aGkyQ}@GxJL+@l8y{?o!%0$e#w|_4U|nm3 zn?pG(Q7v>v;CysPB{QNd3QRR{{(ShE=C4#`Ad36e>Aj$fM{e|&O3a9DZ*2z6XlcDa zu_%ZsNhc^Lj|yBB+b6Wm}RzczyV?Sh_u0S8?3+#7%ZXMUQ;aM>;WGI6_`;f30;`myMfuVQvBllUthL@tbRxjeI zan5FT(HS#aCf8p-P&!^fu9a{o1?XEZ!;==_tyxCLm88m-CgwOao*!8ss9TiDmmT>j zXD$H3vvDyI_&0{;j{S^ate4%^r-0e~{%J$g(x?Z$+Ph>v{hDy%w|Had?&eqCmDn)S?yhNay_R zMCcU!aMdn%Vqc#pVd`<;O_I>-Fj^;9r z5E_GvbWFY1J$hIK5OsbCxWZueP(L ztCVqs#yzkw=ScRH{fD<-)IhseM0~LikC>2h$>9P K=);(b&e_S?#{vzKb-drIaV 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�uwli`rKSebTXuA)r0^niH~K&lm}R9`KsQX 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 KOplBFJM(|bhMT?s diff --git a/apps/static/assets/img/themesberg-logo-alt.svg b/apps/static/assets/img/themesberg-logo-alt.svg deleted file mode 100644 index 3a6e4a6..0000000 --- a/apps/static/assets/img/themesberg-logo-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/static/assets/img/themesberg.svg b/apps/static/assets/img/themesberg.svg deleted file mode 100644 index b28fdc3..0000000 --- a/apps/static/assets/img/themesberg.svg +++ /dev/null @@ -1 +0,0 @@ -logo \ No newline at end of file diff --git a/apps/templates/accounts/register.html b/apps/templates/accounts/register.html index 6f68aee..263e209 100644 --- a/apps/templates/accounts/register.html +++ b/apps/templates/accounts/register.html @@ -101,7 +101,7 @@

Register

- +
Login diff --git a/apps/templates/home/alert.html b/apps/templates/home/alert.html index c632e7d..23b8528 100644 --- a/apps/templates/home/alert.html +++ b/apps/templates/home/alert.html @@ -5,6 +5,7 @@ {% block stylesheets %} + {% endblock stylesheets %} @@ -42,25 +43,6 @@

Rekor™ Scout Alert

-{#
#} -{#
#} -{#
#} -{#
#} -{# #} -{#
#} -{#
#} -{#

{{ settings.org_name }}

#} -{#
#} -{#
#} -{#
#} -{#
#} -{#
#} -{#
#} -{#

Alert Report

#} -{#
#} -{#
#} -{#
#} -{#
#}
{% if alert['uuid_jpg'] %} {{ alert['best_plate_number'] }} @@ -197,6 +179,12 @@
Description
{{ alert['description'] }}
+
+
+ +
+
+
@@ -209,7 +197,7 @@
Description
{% block javascripts %} - + {% endblock javascripts %} diff --git a/apps/templates/home/capture.html b/apps/templates/home/capture.html index 8e87f73..84468af 100644 --- a/apps/templates/home/capture.html +++ b/apps/templates/home/capture.html @@ -5,6 +5,7 @@ {% block stylesheets %} + {% endblock stylesheets %} @@ -21,6 +22,7 @@ + @@ -46,25 +48,6 @@

License Plate Report

-{#
#} -{#
#} -{#
#} -{#
#} -{# #} -{#
#} -{#
#} -{#

{{ settings.org_name }}

#} -{#
#} -{#
#} -{#
#} -{#
#} -{#
#} -{#
#} -{#

License Plate Report

#} -{#
#} -{#
#} -{#
#} -{#
#}
{% if license_plate['uuid_jpg'] %} {{ license_plate['best_plate_number'] }} @@ -196,6 +179,12 @@
Vehicle Information
+
+
+ +
+
+
@@ -207,6 +196,7 @@
Vehicle Information -
+ + + + +
+
+
+
+
+
+
+
+
+
+
+
+ + {% endblock content %} @@ -69,7 +95,7 @@

License Plates

{ id: 'time', name: 'Time', sort: false }, ], server: { - url: '{{ url_for('search.query') }}', + url: '{{ url_for('search.query_group') }}', then: results => results.data, total: results => results.total, }, @@ -89,9 +115,55 @@

License Plates

url: (prev, page, limit) => { return updateUrl(prev, {start: page * limit, length: limit}); }, - }, + } }, }).render(document.getElementById('licensePlates')); + + new gridjs.Grid({ + columns: [ + { id: 'id', name:'ID', hidden: true, sort: false }, + { id: 'site', name: 'Site', sort: false }, + { id: 'camera', name: 'Camera', sort: false }, + { id: 'color', name: 'Color', sort: false }, + { id: 'ym', name: 'Year Make Model', sort: false, + formatter: (cell, row) => { + return gridjs.h('text-default', { + className: '', + }, gridjs.html(`${cell}`)); + } + }, + { id: 'vehicle_crop_jpeg', name: 'Vehicle', sort: false, formatter: (cell) => + gridjs.html(``) + }, + { id: 'direction', name: 'Direction', sort: false, formatter: (cell) => + gridjs.html(``) + }, + { id: 'time', name: 'Time', sort: false }, + ], + server: { + url: '{{ url_for('search.query_vehicle') }}', + then: results => results.data, + total: results => results.total, + }, + search: { + enabled: true, + debounceTimeout: 1000, + server: { + url: (prev, search) => { + return updateUrl(prev, {search}); + }, + }, + }, + pagination: { + enabled: true, + resetPageOnUpdate: true, + server: { + url: (prev, page, limit) => { + return updateUrl(prev, {start: page * limit, length: limit}); + }, + }, + }, + }).render(document.getElementById('Vehicles')); {% endblock javascripts %} diff --git a/apps/templates/home/vehicle-print.html b/apps/templates/home/vehicle-print.html new file mode 100644 index 0000000..13f33c9 --- /dev/null +++ b/apps/templates/home/vehicle-print.html @@ -0,0 +1,140 @@ +{% extends "layouts/base-print.html" %} + +{% block title %} {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} {% endblock %} + + +{% block stylesheets %}{% endblock stylesheets %} + +{% block content %} + +
+
+
+
+
+
+
+ +
+
+

{{ settings.org_name }}

+
+
+
+
+
+
+

Vehicle Report

+
+
+
+
+
+ {% if vehicle['uuid_jpg'] %} + {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} + {% elif vehicle['overview_jpeg'] %} + {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} + {% endif %} +
+
+
+ {% if vehicle['vehicle_crop_jpeg'] %} + {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} + {% endif %} +
+
+
+
+

+ {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} +

+
+
+
+
+
+
+
Agent Information
+
+
Label:
+
{% if cached_agent %}{{ cached_agent.agent_label }}{% else %}{{ vehicle['agent_label'] }}{% endif %}
+
UID:
+
{{ vehicle['agent_uid'] }}
+
Version:
+
{{ vehicle['agent_version'] }}
+
Type:
+
{{ vehicle['agent_type'] }}
+
+
+
+
Camera Information
+
+
Label:
+
{% if cached_camera %}{{ cached_camera['camera_label'] }}{% else %}{{ license_plate['camera_label'] }}{% endif %}
+
ID:
+
{% if cached_camera %}{{ cached_camera['camera_id'] }}{% else %}{{ license_plate['camera_id'] }}{% endif %}
+
GPS Latitude:
+
{% if cached_camera %}{{ cached_camera['gps_latitude'] }}{% else %}{{ license_plate['gps_latitude'] }}{% endif %}
+
GPS Longitude:
+
{% if cached_camera %}{{ cached_camera['gps_longitude'] }}{% else %}{{ license_plate['gps_longitude'] }}{% endif %}
+
Country:
+
{% if cached_camera %}{{ cached_camera['country'] }}{% else %}{{ license_plate['country'] }}{% endif %}
+
+
+
+
+
+
Capture Information
+
+
Capture No.:
+
{{ vehicle['id'] }}
+
Start Timestamp:
+
{{ vehicle['epoch_start_datetime'] }}
+
End Timestamp:
+
{{ vehicle['epoch_end_datetime'] }}
+
Epoch Start:
+
{{ vehicle['epoch_start'] }}
+
Epoch End:
+
{{ vehicle['epoch_end'] }}
+
Vehicle Confidence:
+
{{ vehicle['is_vehicle_confidence_percent'] }}
+
Travel Direction:
+
({{ vehicle['travel_direction'] }}°)
+
+
+
+
Vehicle Information + + + + + + + +
+
+
Color:
+
{{ vehicle['vehicle_color_name'] }} ({{ vehicle['vehicle_color_confidence'] }})
+
Year:
+
{{ vehicle['vehicle_year_name'] }} ({{ vehicle['vehicle_year_confidence'] }})
+
Make:
+
{{ vehicle['vehicle_make_name'] }} ({{ vehicle['vehicle_make_confidence'] }})
+
Model:
+
{{ vehicle['vehicle_make_model_name'] }} ({{ vehicle['vehicle_make_model_confidence'] }})
+
Body Type:
+
{{ vehicle['vehicle_body_type_name'] }} ({{ vehicle['vehicle_body_type_confidence'] }})
+
+
+ +
+ +
+
+
+ +{% endblock content %} + + +{% block javascripts %}{% endblock javascripts %} diff --git a/apps/templates/home/vehicle.html b/apps/templates/home/vehicle.html new file mode 100644 index 0000000..a03c103 --- /dev/null +++ b/apps/templates/home/vehicle.html @@ -0,0 +1,288 @@ +{% extends "layouts/base.html" %} + +{% block title %} {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} {% endblock %} + + +{% block stylesheets %} + + + +{% endblock stylesheets %} + +{% block content %} + +
+ +
+
+

Vehicle Report

+

+
+
+ + + + + + +
+
+
+
+
+
+
+ {% if vehicle['uuid_jpg'] %} + {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} + {% elif vehicle['overview_jpeg'] %} + {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} + {% endif %} +
+
+
+ {% if vehicle['vehicle_crop_jpeg'] %} + {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} + {% endif %} +
+
+
+
+

+ {{ vehicle['vehicle_year_name'] }} {{ vehicle['vehicle_make_model_name'] }} +

+
+
+
+
+
+
+
Agent Information
+
+
Label:
+
{% if cached_agent %}{{ cached_agent.agent_label }}{% else %}{{ vehicle['agent_label'] }}{% endif %}
+
UID:
+
{{ vehicle['agent_uid'] }}
+
Version:
+
{{ vehicle['agent_version'] }}
+
Type:
+
{{ vehicle['agent_type'] }}
+
+
+
+
Camera Information
+
+
Label:
+
{% if cached_camera %}{{ cached_camera.camera_label }}{% else %}{{ vehicle['camera_label'] }}{% endif %}
+
ID:
+
{% if cached_camera %}{{ cached_camera.camera_id }}{% else %}{{ vehicle['camera_id'] }}{% endif %}
+
GPS Latitude:
+
+ {% if cached_camera %} + {% if cached_camera.gps_latitude != -1 and cached_camera.gps_longitude != -1 %} + {{ cached_camera.gps_latitude }} + {% else %} + {{ cached_camera['gps_latitude'] }} + {% endif %} + {% else %} + {% if vehicle['gps_latitude'] != -1 and vehicle['gps_longitude'] != -1 %} + {{ vehicle['gps_latitude'] }} + {% else %} + {{ vehicle['gps_latitude'] }} + {% endif %} + {% endif %} +
+
GPS Longitude:
+
+ {% if cached_camera %} + {% if cached_camera.gps_longitude != -1 and cached_camera.gps_latitude != -1 %} + {{ cached_camera.gps_longitude }} + {% else %} + {{ cached_camera.gps_longitude }} + {% endif %} + {% else %} + {% if vehicle['gps_longitude'] != -1 and vehicle['gps_latitude'] != -1 %} + {{ vehicle['gps_longitude'] }} + {% else %} + {{ vehicle['gps_longitude'] }} + {% endif %} + {% endif %} +
+
Country:
+
{% if cached_camera %}{{ cached_camera.country }}{% else %}{{ vehicle['country'] }}{% endif %}
+
+
+
+
+
+
Capture Information
+
+
Capture No.:
+
{{ vehicle['id'] }}
+
Start Timestamp:
+
{{ vehicle['epoch_start_datetime'] }}
+
End Timestamp:
+
{{ vehicle['epoch_end_datetime'] }}
+
Epoch Start:
+
{{ vehicle['epoch_start'] }}
+
Epoch End:
+
{{ vehicle['epoch_end'] }}
+
Vehicle Confidence:
+
{{ vehicle['is_vehicle_confidence_percent'] }}
+
Travel Direction:
+
({{ vehicle['travel_direction'] }}°)
+
+
+
+
Vehicle Information + + + + + + + +
+
+
Color:
+
{{ vehicle['vehicle_color_name'] }} ({{ vehicle['vehicle_color_confidence'] }})
+
Year:
+
{{ vehicle['vehicle_year_name'] }} ({{ vehicle['vehicle_year_confidence'] }})
+
Make:
+
{{ vehicle['vehicle_make_name'] }} ({{ vehicle['vehicle_make_confidence'] }})
+
Model:
+
{{ vehicle['vehicle_make_model_name'] }} ({{ vehicle['vehicle_make_model_confidence'] }})
+
Body Type:
+
{{ vehicle['vehicle_body_type_name'] }} ({{ vehicle['vehicle_body_type_confidence'] }})
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +{% endblock content %} + + +{% block javascripts %} + + + + +{% endblock javascripts %} diff --git a/apps/templates/includes/sidebar.html b/apps/templates/includes/sidebar.html index e762c93..430c111 100644 --- a/apps/templates/includes/sidebar.html +++ b/apps/templates/includes/sidebar.html @@ -151,7 +151,7 @@

Hi, {{ current_user.full_name }}

@@ -186,7 +194,7 @@
Please follow this guide for a strong password:
-
+
User image
@@ -214,6 +222,10 @@