diff --git a/.github/workflows/deploy_toserver_production.yml b/.github/workflows/deploy_toserver_production.yml
index 930f111..514fb1b 100644
--- a/.github/workflows/deploy_toserver_production.yml
+++ b/.github/workflows/deploy_toserver_production.yml
@@ -1,5 +1,9 @@
name: Deploy to server production
-on: [workflow_dispatch]
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
jobs:
build:
name: build-apps
@@ -13,11 +17,7 @@ jobs:
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
- cd /opt/GPMain
+ cd $HOME/Projek/geraipi_main
+ source $HOME/virtualenv/Projek/geraipi_main/3.10/bin/activate
git pull origin main
- export $(grep -v '^#' .env | xargs)
- /opt/geraienv/bin/python /opt/GPMain/manage.py makemigrations
- /opt/geraienv/bin/python /opt/GPMain/manage.py migrate
- echo yes | /opt/geraienv/bin/python /opt/GPMain/manage.py collectstatic
- service uwsgi restart
- service nginx restart
+ touch tmp/restart.txt
diff --git a/.github/workflows/deploy_toserver_test.yml b/.github/workflows/deploy_toserver_test.yml
index 1c31b53..9df0bfb 100644
--- a/.github/workflows/deploy_toserver_test.yml
+++ b/.github/workflows/deploy_toserver_test.yml
@@ -1,5 +1,9 @@
name: Deploy to server test
-on: [workflow_dispatch]
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
jobs:
build:
name: build-apps
@@ -13,11 +17,7 @@ jobs:
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
- cd /opt/geraipi
- git pull origin2 main
- export $(grep -v '^#' .env | xargs)
- /opt/geraienv/bin/python /opt/geraipi/manage.py makemigrations
- /opt/geraienv/bin/python /opt/geraipi/manage.py migrate
- echo yes | /opt/geraienv/bin/python /opt/geraipi/manage.py collectstatic
- service uwsgi restart
- service nginx restart
+ cd $HOME/Projek/geraipi_test
+ source $HOME/virtualenv/Projek/geraipi_test/3.10/bin/activate
+ git pull origin main
+ touch tmp/restart.txt
diff --git a/frontend/templates/firebase-messaging-sw.js b/frontend/templates/firebase-messaging-sw.js
index c08fdee..a2fd522 100644
--- a/frontend/templates/firebase-messaging-sw.js
+++ b/frontend/templates/firebase-messaging-sw.js
@@ -1,2 +1,27 @@
-/*! For license information please see other.js.LICENSE.txt */
-(()=>{"use strict";var e={};e.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();const t=function(e){const t=[];let n=0;for(let i=0;i>6|192,t[n++]=63&r|128):55296==(64512&r)&&i+1>18|240,t[n++]=r>>12&63|128,t[n++]=r>>6&63|128,t[n++]=63&r|128):(t[n++]=r>>12|224,t[n++]=r>>6&63|128,t[n++]=63&r|128)}return t},n={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();const n=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,i=[];for(let t=0;t>2,u=(3&r)<<4|o>>4;let d=(15&o)<<2|c>>6,p=63&c;s||(p=64,a||(d=64)),i.push(n[l],n[u],n[d],n[p])}return i.join("")},encodeString(e,n){return this.HAS_NATIVE_SUPPORT&&!n?btoa(e):this.encodeByteArray(t(e),n)},decodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){const t=[];let n=0,i=0;for(;n191&&r<224){const a=e[n++];t[i++]=String.fromCharCode((31&r)<<6|63&a)}else if(r>239&&r<365){const a=((7&r)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536;t[i++]=String.fromCharCode(55296+(a>>10)),t[i++]=String.fromCharCode(56320+(1023&a))}else{const a=e[n++],o=e[n++];t[i++]=String.fromCharCode((15&r)<<12|(63&a)<<6|63&o)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_();const n=t?this.charToByteMapWebSafe_:this.charToByteMap_,r=[];for(let t=0;t>4;if(r.push(l),64!==s){const e=o<<4&240|s>>2;if(r.push(e),64!==c){const e=s<<6&192|c;r.push(e)}}}return r},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}};class i extends Error{constructor(){super(...arguments),this.name="DecodeBase64StringError"}}const r=function(e){return function(e){const i=t(e);return n.encodeByteArray(i,!0)}(e).replace(/\./g,"")},a=()=>{try{return function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==e.g)return e.g;throw new Error("Unable to locate global object.")}().__FIREBASE_DEFAULTS__||(()=>{if("undefined"==typeof process||void 0===process.env)return;const e=process.env.__FIREBASE_DEFAULTS__;return e?JSON.parse(e):void 0})()||(()=>{if("undefined"==typeof document)return;let e;try{e=document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/)}catch(e){return}const t=e&&function(e){try{return n.decodeString(e,!0)}catch(e){console.error("base64Decode failed: ",e)}return null}(e[1]);return t&&JSON.parse(t)})()}catch(e){return void console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`)}},o=()=>{var e;return null===(e=a())||void 0===e?void 0:e.config};class s{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}wrapCallback(e){return(t,n)=>{t?this.reject(t):this.resolve(n),"function"==typeof e&&(this.promise.catch((()=>{})),1===e.length?e(t):e(t,n))}}}function c(){try{return"object"==typeof indexedDB}catch(e){return!1}}function l(){return new Promise(((e,t)=>{try{let n=!0;const i="validate-browser-context-for-indexeddb-analytics-module",r=self.indexedDB.open(i);r.onsuccess=()=>{r.result.close(),n||self.indexedDB.deleteDatabase(i),e(!0)},r.onupgradeneeded=()=>{n=!1},r.onerror=()=>{var e;t((null===(e=r.error)||void 0===e?void 0:e.message)||"")}}catch(e){t(e)}}))}class u extends Error{constructor(e,t,n){super(t),this.code=e,this.customData=n,this.name="FirebaseError",Object.setPrototypeOf(this,u.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,d.prototype.create)}}class d{constructor(e,t,n){this.service=e,this.serviceName=t,this.errors=n}create(e,...t){const n=t[0]||{},i=`${this.service}/${e}`,r=this.errors[e],a=r?function(e,t){return e.replace(p,((e,n)=>{const i=t[n];return null!=i?String(i):`<${n}?>`}))}(r,n):"Error",o=`${this.serviceName}: ${a} (${i}).`;return new u(i,o,n)}}const p=/\{\$([^}]+)}/g;function f(e,t){if(e===t)return!0;const n=Object.keys(e),i=Object.keys(t);for(const r of n){if(!i.includes(r))return!1;const n=e[r],a=t[r];if(h(n)&&h(a)){if(!f(n,a))return!1}else if(n!==a)return!1}for(const e of i)if(!n.includes(e))return!1;return!0}function h(e){return null!==e&&"object"==typeof e}function g(e){return e&&e._delegate?e._delegate:e}class m{constructor(e,t,n){this.name=e,this.instanceFactory=t,this.type=n,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}}const b="[DEFAULT]";class w{constructor(e,t){this.name=e,this.container=t,this.component=null,this.instances=new Map,this.instancesDeferred=new Map,this.instancesOptions=new Map,this.onInitCallbacks=new Map}get(e){const t=this.normalizeInstanceIdentifier(e);if(!this.instancesDeferred.has(t)){const e=new s;if(this.instancesDeferred.set(t,e),this.isInitialized(t)||this.shouldAutoInitialize())try{const n=this.getOrInitializeService({instanceIdentifier:t});n&&e.resolve(n)}catch(e){}}return this.instancesDeferred.get(t).promise}getImmediate(e){var t;const n=this.normalizeInstanceIdentifier(null==e?void 0:e.identifier),i=null!==(t=null==e?void 0:e.optional)&&void 0!==t&&t;if(!this.isInitialized(n)&&!this.shouldAutoInitialize()){if(i)return null;throw Error(`Service ${this.name} is not available`)}try{return this.getOrInitializeService({instanceIdentifier:n})}catch(e){if(i)return null;throw e}}getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`);if(this.component)throw Error(`Component for ${this.name} has already been provided`);if(this.component=e,this.shouldAutoInitialize()){if(function(e){return"EAGER"===e.instantiationMode}(e))try{this.getOrInitializeService({instanceIdentifier:b})}catch(e){}for(const[e,t]of this.instancesDeferred.entries()){const n=this.normalizeInstanceIdentifier(e);try{const e=this.getOrInitializeService({instanceIdentifier:n});t.resolve(e)}catch(e){}}}}clearInstance(e=b){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter((e=>"INTERNAL"in e)).map((e=>e.INTERNAL.delete())),...e.filter((e=>"_delete"in e)).map((e=>e._delete()))])}isComponentSet(){return null!=this.component}isInitialized(e=b){return this.instances.has(e)}getOptions(e=b){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:t={}}=e,n=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(n))throw Error(`${this.name}(${n}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const i=this.getOrInitializeService({instanceIdentifier:n,options:t});for(const[e,t]of this.instancesDeferred.entries())n===this.normalizeInstanceIdentifier(e)&&t.resolve(i);return i}onInit(e,t){var n;const i=this.normalizeInstanceIdentifier(t),r=null!==(n=this.onInitCallbacks.get(i))&&void 0!==n?n:new Set;r.add(e),this.onInitCallbacks.set(i,r);const a=this.instances.get(i);return a&&e(a,i),()=>{r.delete(e)}}invokeOnInitCallbacks(e,t){const n=this.onInitCallbacks.get(t);if(n)for(const i of n)try{i(e,t)}catch(e){}}getOrInitializeService({instanceIdentifier:e,options:t={}}){let n=this.instances.get(e);if(!n&&this.component&&(n=this.component.instanceFactory(this.container,{instanceIdentifier:(i=e,i===b?void 0:i),options:t}),this.instances.set(e,n),this.instancesOptions.set(e,t),this.invokeOnInitCallbacks(n,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,n)}catch(e){}var i;return n||null}normalizeInstanceIdentifier(e=b){return this.component?this.component.multipleInstances?e:b:e}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}class y{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const t=new w(e,this);return this.providers.set(e,t),t}getProviders(){return Array.from(this.providers.values())}}const v=[];var I;!function(e){e[e.DEBUG=0]="DEBUG",e[e.VERBOSE=1]="VERBOSE",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.SILENT=5]="SILENT"}(I||(I={}));const S={debug:I.DEBUG,verbose:I.VERBOSE,info:I.INFO,warn:I.WARN,error:I.ERROR,silent:I.SILENT},_=I.INFO,E={[I.DEBUG]:"log",[I.VERBOSE]:"log",[I.INFO]:"info",[I.WARN]:"warn",[I.ERROR]:"error"},C=(e,t,...n)=>{if(tt.some((t=>e instanceof t));let k,T;const A=new WeakMap,O=new WeakMap,M=new WeakMap,N=new WeakMap,B=new WeakMap;let j={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return O.get(e);if("objectStoreNames"===t)return e.objectStoreNames||M.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return L(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function P(e){return"function"==typeof e?(t=e)!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(T||(T=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply($(this),e),L(A.get(this))}:function(...e){return L(t.apply($(this),e))}:function(e,...n){const i=t.call($(this),e,...n);return M.set(i,e.sort?e.sort():[e]),L(i)}:(e instanceof IDBTransaction&&function(e){if(O.has(e))return;const t=new Promise(((t,n)=>{const i=()=>{e.removeEventListener("complete",r),e.removeEventListener("error",a),e.removeEventListener("abort",a)},r=()=>{t(),i()},a=()=>{n(e.error||new DOMException("AbortError","AbortError")),i()};e.addEventListener("complete",r),e.addEventListener("error",a),e.addEventListener("abort",a)}));O.set(e,t)}(e),D(e,k||(k=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,j):e);var t}function L(e){if(e instanceof IDBRequest)return function(e){const t=new Promise(((t,n)=>{const i=()=>{e.removeEventListener("success",r),e.removeEventListener("error",a)},r=()=>{t(L(e.result)),i()},a=()=>{n(e.error),i()};e.addEventListener("success",r),e.addEventListener("error",a)}));return t.then((t=>{t instanceof IDBCursor&&A.set(t,e)})).catch((()=>{})),B.set(t,e),t}(e);if(N.has(e))return N.get(e);const t=P(e);return t!==e&&(N.set(e,t),B.set(t,e)),t}const $=e=>B.get(e);function H(e,t,{blocked:n,upgrade:i,blocking:r,terminated:a}={}){const o=indexedDB.open(e,t),s=L(o);return i&&o.addEventListener("upgradeneeded",(e=>{i(L(o.result),e.oldVersion,e.newVersion,L(o.transaction),e)})),n&&o.addEventListener("blocked",(e=>n(e.oldVersion,e.newVersion,e))),s.then((e=>{a&&e.addEventListener("close",(()=>a())),r&&e.addEventListener("versionchange",(e=>r(e.oldVersion,e.newVersion,e)))})).catch((()=>{})),s}function R(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&n.addEventListener("blocked",(e=>t(e.oldVersion,e))),L(n).then((()=>{}))}const F=["get","getKey","getAll","getAllKeys","count"],x=["put","add","delete","clear"],V=new Map;function K(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(V.get(t))return V.get(t);const n=t.replace(/FromIndex$/,""),i=t!==n,r=x.includes(n);if(!(n in(i?IDBIndex:IDBObjectStore).prototype)||!r&&!F.includes(n))return;const a=async function(e,...t){const a=this.transaction(e,r?"readwrite":"readonly");let o=a.store;return i&&(o=o.index(t.shift())),(await Promise.all([o[n](...t),r&&a.done]))[0]};return V.set(t,a),a}var U;U=j,j={...U,get:(e,t,n)=>K(e,t)||U.get(e,t,n),has:(e,t)=>!!K(e,t)||U.has(e,t)};class W{constructor(e){this.container=e}getPlatformInfoString(){return this.container.getProviders().map((e=>{if(function(e){const t=e.getComponent();return"VERSION"===(null==t?void 0:t.type)}(e)){const t=e.getImmediate();return`${t.library}/${t.version}`}return null})).filter((e=>e)).join(" ")}}const z="@firebase/app",q="0.10.10",G=new class{constructor(e){this.name=e,this._logLevel=_,this._logHandler=C,this._userLogHandler=null,v.push(this)}get logLevel(){return this._logLevel}set logLevel(e){if(!(e in I))throw new TypeError(`Invalid value "${e}" assigned to \`logLevel\``);this._logLevel=e}setLogLevel(e){this._logLevel="string"==typeof e?S[e]:e}get logHandler(){return this._logHandler}set logHandler(e){if("function"!=typeof e)throw new TypeError("Value assigned to `logHandler` must be a function");this._logHandler=e}get userLogHandler(){return this._userLogHandler}set userLogHandler(e){this._userLogHandler=e}debug(...e){this._userLogHandler&&this._userLogHandler(this,I.DEBUG,...e),this._logHandler(this,I.DEBUG,...e)}log(...e){this._userLogHandler&&this._userLogHandler(this,I.VERBOSE,...e),this._logHandler(this,I.VERBOSE,...e)}info(...e){this._userLogHandler&&this._userLogHandler(this,I.INFO,...e),this._logHandler(this,I.INFO,...e)}warn(...e){this._userLogHandler&&this._userLogHandler(this,I.WARN,...e),this._logHandler(this,I.WARN,...e)}error(...e){this._userLogHandler&&this._userLogHandler(this,I.ERROR,...e),this._logHandler(this,I.ERROR,...e)}}("@firebase/app"),J="@firebase/app-compat",Y="@firebase/analytics-compat",Z="@firebase/analytics",Q="@firebase/app-check-compat",X="@firebase/app-check",ee="@firebase/auth",te="@firebase/auth-compat",ne="@firebase/database",ie="@firebase/database-compat",re="@firebase/functions",ae="@firebase/functions-compat",oe="@firebase/installations",se="@firebase/installations-compat",ce="@firebase/messaging",le="@firebase/messaging-compat",ue="@firebase/performance",de="@firebase/performance-compat",pe="@firebase/remote-config",fe="@firebase/remote-config-compat",he="@firebase/storage",ge="@firebase/storage-compat",me="@firebase/firestore",be="@firebase/vertexai-preview",we="@firebase/firestore-compat",ye="firebase",ve="[DEFAULT]",Ie={[z]:"fire-core",[J]:"fire-core-compat",[Z]:"fire-analytics",[Y]:"fire-analytics-compat",[X]:"fire-app-check",[Q]:"fire-app-check-compat",[ee]:"fire-auth",[te]:"fire-auth-compat",[ne]:"fire-rtdb",[ie]:"fire-rtdb-compat",[re]:"fire-fn",[ae]:"fire-fn-compat",[oe]:"fire-iid",[se]:"fire-iid-compat",[ce]:"fire-fcm",[le]:"fire-fcm-compat",[ue]:"fire-perf",[de]:"fire-perf-compat",[pe]:"fire-rc",[fe]:"fire-rc-compat",[he]:"fire-gcs",[ge]:"fire-gcs-compat",[me]:"fire-fst",[we]:"fire-fst-compat",[be]:"fire-vertex","fire-js":"fire-js",[ye]:"fire-js-all"},Se=new Map,_e=new Map,Ee=new Map;function Ce(e,t){try{e.container.addComponent(t)}catch(n){G.debug(`Component ${t.name} failed to register with FirebaseApp ${e.name}`,n)}}function De(e){const t=e.name;if(Ee.has(t))return G.debug(`There were multiple attempts to register component ${t}.`),!1;Ee.set(t,e);for(const t of Se.values())Ce(t,e);for(const t of _e.values())Ce(t,e);return!0}function ke(e,t){const n=e.container.getProvider("heartbeat").getImmediate({optional:!0});return n&&n.triggerHeartbeat(),e.container.getProvider(t)}const Te=new d("app","Firebase",{"no-app":"No Firebase App '{$appName}' has been created - call initializeApp() first","bad-app-name":"Illegal App name: '{$appName}'","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","server-app-deleted":"Firebase Server App has been deleted","no-options":"Need to provide options, when not being deployed to hosting via source.","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","idb-open":"Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.","idb-get":"Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.","idb-set":"Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.","idb-delete":"Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.","finalization-registry-not-supported":"FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.","invalid-server-app-environment":"FirebaseServerApp is not for use in browser environments."});class Ae{constructor(e,t,n){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},t),this._name=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled,this._container=n,this.container.addComponent(new m("app",(()=>this),"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw Te.create("app-deleted",{appName:this._name})}}function Oe(e,t={}){let n=e;"object"!=typeof t&&(t={name:t});const i=Object.assign({name:ve,automaticDataCollectionEnabled:!1},t),r=i.name;if("string"!=typeof r||!r)throw Te.create("bad-app-name",{appName:String(r)});if(n||(n=o()),!n)throw Te.create("no-options");const a=Se.get(r);if(a){if(f(n,a.options)&&f(i,a.config))return a;throw Te.create("duplicate-app",{appName:r})}const s=new y(r);for(const e of Ee.values())s.addComponent(e);const c=new Ae(n,i,s);return Se.set(r,c),c}function Me(e,t,n){var i;let r=null!==(i=Ie[e])&&void 0!==i?i:e;n&&(r+=`-${n}`);const a=r.match(/\s|\//),o=t.match(/\s|\//);if(a||o){const e=[`Unable to register library "${r}" with version "${t}":`];return a&&e.push(`library name "${r}" contains illegal characters (whitespace or "/")`),a&&o&&e.push("and"),o&&e.push(`version name "${t}" contains illegal characters (whitespace or "/")`),void G.warn(e.join(" "))}De(new m(`${r}-version`,(()=>({library:r,version:t})),"VERSION"))}const Ne="firebase-heartbeat-database",Be=1,je="firebase-heartbeat-store";let Pe=null;function Le(){return Pe||(Pe=H(Ne,Be,{upgrade:(e,t)=>{if(0===t)try{e.createObjectStore(je)}catch(e){console.warn(e)}}}).catch((e=>{throw Te.create("idb-open",{originalErrorMessage:e.message})}))),Pe}async function $e(e,t){try{const n=(await Le()).transaction(je,"readwrite"),i=n.objectStore(je);await i.put(t,He(e)),await n.done}catch(e){if(e instanceof u)G.warn(e.message);else{const t=Te.create("idb-set",{originalErrorMessage:null==e?void 0:e.message});G.warn(t.message)}}}function He(e){return`${e.name}!${e.options.appId}`}class Re{constructor(e){this.container=e,this._heartbeatsCache=null;const t=this.container.getProvider("app").getImmediate();this._storage=new xe(t),this._heartbeatsCachePromise=this._storage.read().then((e=>(this._heartbeatsCache=e,e)))}async triggerHeartbeat(){var e,t;try{const n=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),i=Fe();if(null==(null===(e=this._heartbeatsCache)||void 0===e?void 0:e.heartbeats)&&(this._heartbeatsCache=await this._heartbeatsCachePromise,null==(null===(t=this._heartbeatsCache)||void 0===t?void 0:t.heartbeats)))return;if(this._heartbeatsCache.lastSentHeartbeatDate===i||this._heartbeatsCache.heartbeats.some((e=>e.date===i)))return;return this._heartbeatsCache.heartbeats.push({date:i,agent:n}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter((e=>{const t=new Date(e.date).valueOf();return Date.now()-t<=2592e6})),this._storage.overwrite(this._heartbeatsCache)}catch(e){G.warn(e)}}async getHeartbeatsHeader(){var e;try{if(null===this._heartbeatsCache&&await this._heartbeatsCachePromise,null==(null===(e=this._heartbeatsCache)||void 0===e?void 0:e.heartbeats)||0===this._heartbeatsCache.heartbeats.length)return"";const t=Fe(),{heartbeatsToSend:n,unsentEntries:i}=function(e,t=1024){const n=[];let i=e.slice();for(const r of e){const e=n.find((e=>e.agent===r.agent));if(e){if(e.dates.push(r.date),Ve(n)>t){e.dates.pop();break}}else if(n.push({agent:r.agent,dates:[r.date]}),Ve(n)>t){n.pop();break}i=i.slice(1)}return{heartbeatsToSend:n,unsentEntries:i}}(this._heartbeatsCache.heartbeats),a=r(JSON.stringify({version:2,heartbeats:n}));return this._heartbeatsCache.lastSentHeartbeatDate=t,i.length>0?(this._heartbeatsCache.heartbeats=i,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),a}catch(e){return G.warn(e),""}}}function Fe(){return(new Date).toISOString().substring(0,10)}class xe{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return!!c()&&l().then((()=>!0)).catch((()=>!1))}async read(){if(await this._canUseIndexedDBPromise){const e=await async function(e){try{const t=(await Le()).transaction(je),n=await t.objectStore(je).get(He(e));return await t.done,n}catch(e){if(e instanceof u)G.warn(e.message);else{const t=Te.create("idb-get",{originalErrorMessage:null==e?void 0:e.message});G.warn(t.message)}}}(this.app);return(null==e?void 0:e.heartbeats)?e:{heartbeats:[]}}return{heartbeats:[]}}async overwrite(e){var t;if(await this._canUseIndexedDBPromise){const n=await this.read();return $e(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:n.lastSentHeartbeatDate,heartbeats:e.heartbeats})}}async add(e){var t;if(await this._canUseIndexedDBPromise){const n=await this.read();return $e(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:n.lastSentHeartbeatDate,heartbeats:[...n.heartbeats,...e.heartbeats]})}}}function Ve(e){return r(JSON.stringify({version:2,heartbeats:e})).length}De(new m("platform-logger",(e=>new W(e)),"PRIVATE")),De(new m("heartbeat",(e=>new Re(e)),"PRIVATE")),Me(z,q,""),Me(z,q,"esm2017"),Me("fire-js",""),Me("firebase","10.13.1","app");const Ke="@firebase/installations",Ue="0.6.8",We=1e4,ze=`w:${Ue}`,qe="FIS_v2",Ge="https://firebaseinstallations.googleapis.com/v1",Je=36e5,Ye=new d("installations","Installations",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"not-registered":"Firebase Installation is not registered.","installation-not-found":"Firebase Installation not found.","request-failed":'{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"',"app-offline":"Could not process request. Application offline.","delete-pending-registration":"Can't delete installation while there is a pending registration request."});function Ze(e){return e instanceof u&&e.code.includes("request-failed")}function Qe({projectId:e}){return`${Ge}/projects/${e}/installations`}function Xe(e){return{token:e.token,requestStatus:2,expiresIn:(t=e.expiresIn,Number(t.replace("s","000"))),creationTime:Date.now()};var t}async function et(e,t){const n=(await t.json()).error;return Ye.create("request-failed",{requestName:e,serverCode:n.code,serverMessage:n.message,serverStatus:n.status})}function tt({apiKey:e}){return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e})}async function nt(e){const t=await e();return t.status>=500&&t.status<600?e():t}function it(e){return new Promise((t=>{setTimeout(t,e)}))}const rt=/^[cdef][\w-]{21}$/,at="";function ot(){try{const e=new Uint8Array(17);(self.crypto||self.msCrypto).getRandomValues(e),e[0]=112+e[0]%16;const t=function(e){var t;return(t=e,btoa(String.fromCharCode(...t)).replace(/\+/g,"-").replace(/\//g,"_")).substr(0,22)}(e);return rt.test(t)?t:at}catch(e){return at}}function st(e){return`${e.appName}!${e.appId}`}const ct=new Map;function lt(e,t){const n=st(e);ut(n,t),function(e,t){const n=(!dt&&"BroadcastChannel"in self&&(dt=new BroadcastChannel("[Firebase] FID Change"),dt.onmessage=e=>{ut(e.data.key,e.data.fid)}),dt);n&&n.postMessage({key:e,fid:t}),0===ct.size&&dt&&(dt.close(),dt=null)}(n,t)}function ut(e,t){const n=ct.get(e);if(n)for(const e of n)e(t)}let dt=null;const pt="firebase-installations-database",ft=1,ht="firebase-installations-store";let gt=null;function mt(){return gt||(gt=H(pt,ft,{upgrade:(e,t)=>{0===t&&e.createObjectStore(ht)}})),gt}async function bt(e,t){const n=st(e),i=(await mt()).transaction(ht,"readwrite"),r=i.objectStore(ht),a=await r.get(n);return await r.put(t,n),await i.done,a&&a.fid===t.fid||lt(e,t.fid),t}async function wt(e){const t=st(e),n=(await mt()).transaction(ht,"readwrite");await n.objectStore(ht).delete(t),await n.done}async function yt(e,t){const n=st(e),i=(await mt()).transaction(ht,"readwrite"),r=i.objectStore(ht),a=await r.get(n),o=t(a);return void 0===o?await r.delete(n):await r.put(o,n),await i.done,!o||a&&a.fid===o.fid||lt(e,o.fid),o}async function vt(e){let t;const n=await yt(e.appConfig,(n=>{const i=function(e){return _t(e||{fid:ot(),registrationStatus:0})}(n),r=function(e,t){if(0===t.registrationStatus){if(!navigator.onLine)return{installationEntry:t,registrationPromise:Promise.reject(Ye.create("app-offline"))};const n={fid:t.fid,registrationStatus:1,registrationTime:Date.now()},i=async function(e,t){try{const n=await async function({appConfig:e,heartbeatServiceProvider:t},{fid:n}){const i=Qe(e),r=tt(e),a=t.getImmediate({optional:!0});if(a){const e=await a.getHeartbeatsHeader();e&&r.append("x-firebase-client",e)}const o={fid:n,authVersion:qe,appId:e.appId,sdkVersion:ze},s={method:"POST",headers:r,body:JSON.stringify(o)},c=await nt((()=>fetch(i,s)));if(c.ok){const e=await c.json();return{fid:e.fid||n,registrationStatus:2,refreshToken:e.refreshToken,authToken:Xe(e.authToken)}}throw await et("Create Installation",c)}(e,t);return bt(e.appConfig,n)}catch(n){throw Ze(n)&&409===n.customData.serverCode?await wt(e.appConfig):await bt(e.appConfig,{fid:t.fid,registrationStatus:0}),n}}(e,n);return{installationEntry:n,registrationPromise:i}}return 1===t.registrationStatus?{installationEntry:t,registrationPromise:It(e)}:{installationEntry:t}}(e,i);return t=r.registrationPromise,r.installationEntry}));return n.fid===at?{installationEntry:await t}:{installationEntry:n,registrationPromise:t}}async function It(e){let t=await St(e.appConfig);for(;1===t.registrationStatus;)await it(100),t=await St(e.appConfig);if(0===t.registrationStatus){const{installationEntry:t,registrationPromise:n}=await vt(e);return n||t}return t}function St(e){return yt(e,(e=>{if(!e)throw Ye.create("installation-not-found");return _t(e)}))}function _t(e){return 1===(t=e).registrationStatus&&t.registrationTime+Wefetch(i,s)));if(c.ok)return Xe(await c.json());throw await et("Generate Auth Token",c)}async function Ct(e,t=!1){let n;const i=await yt(e.appConfig,(i=>{if(!kt(i))throw Ye.create("not-registered");const r=i.authToken;if(!t&&(2===(a=r).requestStatus&&!function(e){const t=Date.now();return t{if(!kt(e))throw Ye.create("not-registered");return 1===(t=e.authToken).requestStatus&&t.requestTime+We{const t=e.getProvider("app").getImmediate(),n=function(e){if(!e||!e.options)throw Tt("App Configuration");if(!e.name)throw Tt("App Name");const t=["projectId","apiKey","appId"];for(const n of t)if(!e.options[n])throw Tt(n);return{appName:e.name,projectId:e.options.projectId,apiKey:e.options.apiKey,appId:e.options.appId}}(t);return{app:t,appConfig:n,heartbeatServiceProvider:ke(t,"heartbeat"),_delete:()=>Promise.resolve()}}),"PUBLIC")),De(new m("installations-internal",(e=>{const t=ke(e.getProvider("app").getImmediate(),At).getImmediate();return{getId:()=>async function(e){const t=e,{installationEntry:n,registrationPromise:i}=await vt(t);return i?i.catch(console.error):Ct(t).catch(console.error),n.fid}(t),getToken:e=>async function(e,t=!1){const n=e;return await async function(e){const{registrationPromise:t}=await vt(e);t&&await t}(n),(await Ct(n,t)).token}(t,e)}}),"PRIVATE")),Me(Ke,Ue),Me(Ke,Ue,"esm2017");const Ot="BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4",Mt="https://fcmregistrations.googleapis.com/v1",Nt="FCM_MSG",Bt=3,jt=1;var Pt,Lt;function $t(e){const t=new Uint8Array(e);return btoa(String.fromCharCode(...t)).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function Ht(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),n=atob(t),i=new Uint8Array(n.length);for(let e=0;e{0===t&&e.createObjectStore(Ut)}})),Wt}async function qt(e){const t=Jt(e),n=await zt(),i=await n.transaction(Ut).objectStore(Ut).get(t);if(i)return i;{const t=await async function(e){if("databases"in indexedDB){const e=(await indexedDB.databases()).map((e=>e.name));if(!e.includes(Rt))return null}let t=null;return(await H(Rt,Ft,{upgrade:async(n,i,r,a)=>{var o;if(i<2)return;if(!n.objectStoreNames.contains(xt))return;const s=a.objectStore(xt),c=await s.index("fcmSenderId").get(e);if(await s.clear(),c)if(2===i){const e=c;if(!e.auth||!e.p256dh||!e.endpoint)return;t={token:e.fcmToken,createTime:null!==(o=e.createTime)&&void 0!==o?o:Date.now(),subscriptionOptions:{auth:e.auth,p256dh:e.p256dh,endpoint:e.endpoint,swScope:e.swScope,vapidKey:"string"==typeof e.vapidKey?e.vapidKey:$t(e.vapidKey)}}}else if(3===i){const e=c;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:$t(e.auth),p256dh:$t(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:$t(e.vapidKey)}}}else if(4===i){const e=c;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:$t(e.auth),p256dh:$t(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:$t(e.vapidKey)}}}}})).close(),await R(Rt),await R("fcm_vapid_details_db"),await R("undefined"),function(e){if(!e||!e.subscriptionOptions)return!1;const{subscriptionOptions:t}=e;return"number"==typeof e.createTime&&e.createTime>0&&"string"==typeof e.token&&e.token.length>0&&"string"==typeof t.auth&&t.auth.length>0&&"string"==typeof t.p256dh&&t.p256dh.length>0&&"string"==typeof t.endpoint&&t.endpoint.length>0&&"string"==typeof t.swScope&&t.swScope.length>0&&"string"==typeof t.vapidKey&&t.vapidKey.length>0}(t)?t:null}(e.appConfig.senderId);if(t)return await Gt(e,t),t}}async function Gt(e,t){const n=Jt(e),i=(await zt()).transaction(Ut,"readwrite");return await i.objectStore(Ut).put(t,n),await i.done,t}function Jt({appConfig:e}){return e.appId}const Yt=new d("messaging","Messaging",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"only-available-in-window":"This method is available in a Window context.","only-available-in-sw":"This method is available in a service worker context.","permission-default":"The notification permission was not granted and dismissed instead.","permission-blocked":"The notification permission was not granted and blocked instead.","unsupported-browser":"This browser doesn't support the API's required to use the Firebase SDK.","indexed-db-unsupported":"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)","failed-service-worker-registration":"We are unable to register the default service worker. {$browserErrorMessage}","token-subscribe-failed":"A problem occurred while subscribing the user to FCM: {$errorInfo}","token-subscribe-no-token":"FCM returned no token when subscribing the user to push.","token-unsubscribe-failed":"A problem occurred while unsubscribing the user from FCM: {$errorInfo}","token-update-failed":"A problem occurred while updating the user from FCM: {$errorInfo}","token-update-no-token":"FCM returned no token when updating the user to push.","use-sw-after-get-token":"The useServiceWorker() method may only be called once and must be called before calling getToken() to ensure your service worker is used.","invalid-sw-registration":"The input to useServiceWorker() must be a ServiceWorkerRegistration.","invalid-bg-handler":"The input to setBackgroundMessageHandler() must be a function.","invalid-vapid-key":"The public VAPID key must be a string.","use-vapid-key-after-get-token":"The usePublicVapidKey() method may only be called once and must be called before calling getToken() to ensure your VAPID key is used."});async function Zt(e,t){const n={method:"DELETE",headers:await Xt(e)};try{const i=await fetch(`${Qt(e.appConfig)}/${t}`,n),r=await i.json();if(r.error){const e=r.error.message;throw Yt.create("token-unsubscribe-failed",{errorInfo:e})}}catch(e){throw Yt.create("token-unsubscribe-failed",{errorInfo:null==e?void 0:e.toString()})}}function Qt({projectId:e}){return`${Mt}/projects/${e}/registrations`}async function Xt({appConfig:e,installations:t}){const n=await t.getToken();return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e.apiKey,"x-goog-firebase-installations-auth":`FIS ${n}`})}function en({p256dh:e,auth:t,endpoint:n,vapidKey:i}){const r={web:{endpoint:n,auth:t,p256dh:e}};return i!==Ot&&(r.web.applicationPubKey=i),r}async function tn(e){const t=await qt(e.firebaseDependencies);t&&(await Zt(e.firebaseDependencies,t.token),await async function(e){const t=Jt(e),n=(await zt()).transaction(Ut,"readwrite");await n.objectStore(Ut).delete(t),await n.done}(e.firebaseDependencies));const n=await e.swRegistration.pushManager.getSubscription();return!n||n.unsubscribe()}async function nn(e,t){const n=await async function(e,t){const n=await Xt(e),i=en(t),r={method:"POST",headers:n,body:JSON.stringify(i)};let a;try{const t=await fetch(Qt(e.appConfig),r);a=await t.json()}catch(e){throw Yt.create("token-subscribe-failed",{errorInfo:null==e?void 0:e.toString()})}if(a.error){const e=a.error.message;throw Yt.create("token-subscribe-failed",{errorInfo:e})}if(!a.token)throw Yt.create("token-subscribe-no-token");return a.token}(e,t),i={token:n,createTime:Date.now(),subscriptionOptions:t};return await Gt(e,i),i.token}function rn(e,t){const n=[];for(let i=0;i"visible"===e.visibilityState&&!e.url.startsWith("chrome-extension://")))}(i))return function(e,t){t.isFirebaseMessaging=!0,t.messageType=Lt.PUSH_RECEIVED;for(const n of e)n.postMessage(t)}(i,n);if(n.notification&&await function(e){var t;const{actions:n}=e,{maxActions:i}=Notification;return n&&i&&n.length>i&&console.warn(`This browser only supports ${i} actions. The remaining actions will not be displayed.`),self.registration.showNotification(null!==(t=e.title)&&void 0!==t?t:"",e)}(function(e){const t=Object.assign({},e.notification);return t.data={[Nt]:e},t}(n)),t&&t.onBackgroundMessageHandler){const e=function(e){const t={from:e.from,collapseKey:e.collapse_key,messageId:e.fcmMessageId};return function(e,t){if(!t.notification)return;e.notification={};const n=t.notification.title;n&&(e.notification.title=n);const i=t.notification.body;i&&(e.notification.body=i);const r=t.notification.image;r&&(e.notification.image=r);const a=t.notification.icon;a&&(e.notification.icon=a)}(t,e),function(e,t){t.data&&(e.data=t.data)}(t,e),function(e,t){var n,i,r,a,o;if(!t.fcmOptions&&!(null===(n=t.notification)||void 0===n?void 0:n.click_action))return;e.fcmOptions={};const s=null!==(r=null===(i=t.fcmOptions)||void 0===i?void 0:i.link)&&void 0!==r?r:null===(a=t.notification)||void 0===a?void 0:a.click_action;s&&(e.fcmOptions.link=s);const c=null===(o=t.fcmOptions)||void 0===o?void 0:o.analytics_label;c&&(e.fcmOptions.analyticsLabel=c)}(t,e),t}(n);"function"==typeof t.onBackgroundMessageHandler?await t.onBackgroundMessageHandler(e):t.onBackgroundMessageHandler.next(e)}}function on(){return self.clients.matchAll({type:"window",includeUncontrolled:!0})}function sn(e){return Yt.create("missing-app-config-values",{valueName:e})}rn("hts/frbslgigp.ogepscmv/ieo/eaylg","tp:/ieaeogn-agolai.o/1frlglgc/o"),rn("AzSCbw63g1R0nCw85jG8","Iaya3yLKwmgvh7cF0q4");class cn{constructor(e,t,n){this.deliveryMetricsExportedToBigQueryEnabled=!1,this.onBackgroundMessageHandler=null,this.onMessageHandler=null,this.logEvents=[],this.isLogServiceStarted=!1;const i=function(e){if(!e||!e.options)throw sn("App Configuration Object");if(!e.name)throw sn("App Name");const t=["projectId","apiKey","appId","messagingSenderId"],{options:n}=e;for(const e of t)if(!n[e])throw sn(e);return{appName:e.name,projectId:n.projectId,apiKey:n.apiKey,appId:n.appId,senderId:n.messagingSenderId}}(e);this.firebaseDependencies={app:e,appConfig:i,installations:t,analyticsProvider:n}}_delete(){return Promise.resolve()}}De(new m("messaging-sw",(e=>{const t=new cn(e.getProvider("app").getImmediate(),e.getProvider("installations-internal").getImmediate(),e.getProvider("analytics-internal"));return self.addEventListener("push",(e=>{e.waitUntil(an(e,t))})),self.addEventListener("pushsubscriptionchange",(e=>{e.waitUntil(async function(e,t){var n,i;const{newSubscription:r}=e;if(!r)return void await tn(t);const a=await qt(t.firebaseDependencies);await tn(t),t.vapidKey=null!==(i=null===(n=null==a?void 0:a.subscriptionOptions)||void 0===n?void 0:n.vapidKey)&&void 0!==i?i:Ot,await async function(e){const t=await async function(e,t){return await e.pushManager.getSubscription()||e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Ht(t)})}(e.swRegistration,e.vapidKey),n={vapidKey:e.vapidKey,swScope:e.swRegistration.scope,endpoint:t.endpoint,auth:$t(t.getKey("auth")),p256dh:$t(t.getKey("p256dh"))},i=await qt(e.firebaseDependencies);if(i){if(function(e,t){const n=t.vapidKey===e.vapidKey,i=t.endpoint===e.endpoint,r=t.auth===e.auth,a=t.p256dh===e.p256dh;return n&&i&&r&&a}(i.subscriptionOptions,n))return Date.now()>=i.createTime+6048e5?async function(e,t){try{const n=await async function(e,t){const n=await Xt(e),i=en(t.subscriptionOptions),r={method:"PATCH",headers:n,body:JSON.stringify(i)};let a;try{const n=await fetch(`${Qt(e.appConfig)}/${t.token}`,r);a=await n.json()}catch(e){throw Yt.create("token-update-failed",{errorInfo:null==e?void 0:e.toString()})}if(a.error){const e=a.error.message;throw Yt.create("token-update-failed",{errorInfo:e})}if(!a.token)throw Yt.create("token-update-no-token");return a.token}(e.firebaseDependencies,t),i=Object.assign(Object.assign({},t),{token:n,createTime:Date.now()});return await Gt(e.firebaseDependencies,i),n}catch(e){throw e}}(e,{token:i.token,createTime:Date.now(),subscriptionOptions:n}):i.token;try{await Zt(e.firebaseDependencies,i.token)}catch(e){console.warn(e)}return nn(e.firebaseDependencies,n)}return nn(e.firebaseDependencies,n)}(t)}(e,t))})),self.addEventListener("notificationclick",(e=>{e.waitUntil(async function(e){var t,n;const i=null===(n=null===(t=e.notification)||void 0===t?void 0:t.data)||void 0===n?void 0:n[Nt];if(!i)return;if(e.action)return;e.stopImmediatePropagation(),e.notification.close();const r=function(e){var t,n,i;return(null!==(n=null===(t=e.fcmOptions)||void 0===t?void 0:t.link)&&void 0!==n?n:null===(i=e.notification)||void 0===i?void 0:i.click_action)||("object"==typeof(r=e.data)&&r&&"google.c.a.c_id"in r?self.location.origin:null);var r}(i);if(!r)return;const a=new URL(r,self.location.href),o=new URL(self.location.origin);if(a.host!==o.host)return;let s=await async function(e){const t=await on();for(const n of t){const t=new URL(n.url,self.location.href);if(e.host===t.host)return n}return null}(a);return s?s=await s.focus():(s=await self.clients.openWindow(r),await new Promise((e=>{setTimeout(e,3e3)}))),s?(i.messageType=Lt.NOTIFICATION_CLICKED,i.isFirebaseMessaging=!0,s.postMessage(i)):void 0}(e))})),t}),"PUBLIC"));!function(e){!function(e,t){if(void 0!==self.document)throw Yt.create("only-available-in-sw");e.onBackgroundMessageHandler=t}(e=g(e),(e=>{console.log("[firebase-messaging-sw.js] Received background message ",e),self.registration.showNotification("Background Message Title",{body:"Background Message body.",icon:"/firebase-logo.png"})}))}(function(e=function(e=ve){const t=Se.get(e);if(!t&&e===ve&&o())return Oe();if(!t)throw Te.create("no-app",{appName:e});return t}()){return async function(){return c()&&await l()&&"PushManager"in self&&"Notification"in self&&ServiceWorkerRegistration.prototype.hasOwnProperty("showNotification")&&PushSubscription.prototype.hasOwnProperty("getKey")}().then((e=>{if(!e)throw Yt.create("unsupported-browser")}),(e=>{throw Yt.create("indexed-db-unsupported")})),ke(g(e),"messaging-sw").getImmediate()}(Oe({apiKey:"AIzaSyCsEEl7bhST8VHrK3ovbEfMxCUcHZngKg0",authDomain:"geraipi.firebaseapp.com",projectId:"geraipi",storageBucket:"geraipi.appspot.com",messagingSenderId:"1071852496864",appId:"1:1071852496864:web:c5e8338dc67fa12d9bad85",measurementId:"G-SW3CZ09N71"})))})();
\ No newline at end of file
+importScripts('https://www.gstatic.com/firebasejs/8.1.1/firebase-app.js');
+importScripts('https://www.gstatic.com/firebasejs/8.1.1/firebase-messaging.js');
+self.addEventListener('notificationclick', event => {
+ console.log(event)
+});
+const firebaseConfig = {
+ apiKey: "AIzaSyC0lUXHwQdTFXz8KkC5D7zy-t47RrkIvsY",
+ authDomain: "geraipi-indonesia.firebaseapp.com",
+ projectId: "geraipi-indonesia",
+ storageBucket: "geraipi-indonesia.appspot.com",
+ messagingSenderId: "981139646267",
+ appId: "1:981139646267:web:53cc230affb50210a5391e",
+ measurementId: "G-F368X3MB4J"
+};
+firebase.initializeApp(firebaseConfig);
+const messaging = firebase.messaging();
+messaging.onBackgroundMessage((payload) => {
+ console.log('[firebase-messaging-sw.js] Received background message ', payload);
+ const notificationTitle = payload.notification.title;
+ const notificationOptions = {
+ body: payload.notification.body,
+ };
+ return self.registration.showNotification(notificationTitle,
+ notificationOptions);
+});
+
+
diff --git a/frontend/templates/layout.html b/frontend/templates/layout.html
index 4990dc3..f193d14 100644
--- a/frontend/templates/layout.html
+++ b/frontend/templates/layout.html
@@ -1,6 +1,5 @@
-{% load static tailwind_tags %}
-{% load i18n translater %}
+{% load static tailwind_tags i18n translater %}
@@ -221,31 +220,31 @@
-->
-
+{% endblock %}
+
+{% block bodyclass %}{{ block.super }} {{ opts.app_label }}-{{ opts.model_name }} change-form{% endblock %}
+{% if not is_popup %}
+ {% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {{ opts.verbose_name_plural|capfirst }}
+ {{ original|truncatewords:"18" }}
+ {% trans 'Change password' %}
+
+ {% endblock %}
+{% endif %}
+
+{% block content_title %} {% trans 'Change password' %} {% endblock %}
+
+{% block content %}
+
+
+ {% if form.errors %}
+
+ {% if errors|length == 1 %}
+ {% trans "Please correct the error below." %}
+ {% else %}
+ {% trans "Please correct the errors below." %}
+ {% endif %}
+
+ {% endif %}
+
+
+
+
+{% endblock %}
+
+{% block extrajs %}
+
+{% endblock %}
diff --git a/templates/admin/base.html b/templates/admin/base.html
new file mode 100644
index 0000000..85ff041
--- /dev/null
+++ b/templates/admin/base.html
@@ -0,0 +1,386 @@
+{% load i18n static jazzmin admin_urls %}
+{% get_current_language as LANGUAGE_CODE %}
+{% get_current_language_bidi as LANGUAGE_BIDI %}
+{% get_jazzmin_settings request as jazzmin_settings %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+
+
+
+
+
+
+
+
+
+ {% block title %}{{ title }} | {{ jazzmin_settings.site_title }}{% endblock %}
+
+
+
+
+
+
+
+
+ {% if jazzmin_ui.theme.name != 'default' %}
+
+ {% endif %}
+
+ {% if jazzmin_ui.dark_mode_theme %}
+
+ {% endif %}
+
+
+
+
+ {% if jazzmin_settings.custom_css %}
+
+
+ {% endif %}
+
+
+
+
+
+ {% if jazzmin_settings.use_google_fonts_cdn %}
+
+
+ {% endif %}
+
+ {% block extrastyle %} {% endblock %}
+ {% block extrahead %} {% endblock %}
+
+
+
+
+
+ {% if not is_popup %}
+
+
+
+ {% if jazzmin_settings.show_sidebar %}
+
+
+
+ {% else %}
+
+
+
+
+
+ {% endif %}
+
+ {% get_top_menu user request.current_app|default:"admin" as top_menu %}
+ {% for link in top_menu %}
+
+ {% if link.children %}
+
+ {{ link.name }}
+
+
+ {% else %}
+ {{ link.name }}
+ {% endif %}
+
+ {% endfor %}
+
+
+ {% if jazzmin_settings.search_model %}
+ {% for search_model in jazzmin_settings.search_models_parsed %}
+
+ {% endfor %}
+ {% endif %}
+
+
+
+ {% if jazzmin_settings.show_ui_builder %}
+
+
+
+
+
+ {% endif %}
+ {% if 'django.contrib.admindocs'|app_is_installed %}
+
+
+
+
+
+ {% endif %}
+
+ {% if jazzmin_settings.language_chooser %}
+ {% get_available_languages as LANGUAGES %}
+ {% get_language_info_list for LANGUAGES as languages %}
+
+
+
+
+
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
+
+ {% block sidebar %}
+ {% if jazzmin_settings.show_sidebar %}
+ {% get_side_menu as side_menu_list %}
+
+
+ {% endif %}
+ {% endblock %}
+ {% endif %}
+
+
+ {% block page_content %}
+ {% if not is_popup %}
+
+
+
+
+
{% block content_title %}{% endblock %}
+ {% block breadcrumbs %}{% endblock %}
+
+ {% block page_actions %}{% endblock %}
+
+
+
+ {% endif %}
+
+
+
+
+ {% block messages %}
+ {% for message in messages %}
+ {% if message.tags == 'success' %}
+
+ ×
+
+ {{ message|capfirst }}
+
+ {% elif message.tags == 'error' %}
+
+ ×
+
+ {{ message|capfirst }}
+
+ {% elif message.tags == 'warning' %}
+
+ ×
+
+ {{ message|capfirst }}
+
+ {% elif message.tags == 'info' %}
+
+ ×
+
+ {{ message|capfirst }}
+
+ {% endif %}
+ {% endfor %}
+ {% endblock messages %}
+
+ {% block content %} {% endblock %}
+
+
+
+
+
+
+ {% endblock %}
+
+
+{% block footer %}
+ {% if not is_popup %}
+
+ {% if jazzmin_settings.show_ui_builder %}
+ {% include 'jazzmin/includes/ui_builder_panel.html' %}
+ {% endif %}
+ {% endif %}
+{% endblock %}
+
+
+
+{% if jazzmin_settings.show_ui_builder %}
+
+
+
+
+
+
{% trans 'Copy this info your settings file to persist these UI changes' %}
+
+
+
+
+
+
+
+{% endif %}
+
+
+
+
+
+
+
+
+
+
+{% if jazzmin_settings.custom_js %}
+
+{% endif %}
+
+{% if jazzmin_settings.show_ui_builder %}
+
+
+{% endif %}
+
+{% block extrajs %}{% endblock %}
+
+
+
diff --git a/templates/admin/base_site.html b/templates/admin/base_site.html
new file mode 100644
index 0000000..02f53be
--- /dev/null
+++ b/templates/admin/base_site.html
@@ -0,0 +1 @@
+{% extends 'admin/base.html' %}
\ No newline at end of file
diff --git a/templates/admin/change_form.html b/templates/admin/change_form.html
new file mode 100644
index 0000000..5be7d3b
--- /dev/null
+++ b/templates/admin/change_form.html
@@ -0,0 +1,128 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_urls static admin_modify jazzmin %}
+{% get_jazzmin_settings request as jazzmin_settings %}
+
+{% block extrastyle %}
+ {{ block.super }}
+
+{% endblock %}
+
+{% block extrahead %}
+ {{ block.super }}
+
+ {{ media }}
+{% endblock %}
+
+{% block coltype %}colM{% endblock %}
+
+{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %}
+
+{% if not is_popup %}
+ {% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+
+ {% if has_view_permission %}
+ {{ opts.verbose_name_plural|capfirst }}
+ {% else %}
+ {{ opts.verbose_name_plural|capfirst }}
+ {% endif %}
+
+
+ {% if add %}
+ {% blocktrans with name=opts.verbose_name %}Add {{ name }}{% endblocktrans %}
+ {% else %}
+ {{ original|truncatewords:"18" }}
+ {% endif %}
+
+
+ {% endblock %}
+{% endif %}
+
+{% block content_title %} {{ opts.verbose_name_plural|capfirst }} {% endblock %}
+
+{% block content %}
+
+
+
+{% endblock %}
+
+{% block extrajs %}
+ {{ block.super }}
+
+
+ {% if jazzmin_settings.related_modal_active %}
+
+
+ {% endif %}
+{% endblock %}
diff --git a/templates/admin/change_form_object_tools.html b/templates/admin/change_form_object_tools.html
new file mode 100644
index 0000000..9786a99
--- /dev/null
+++ b/templates/admin/change_form_object_tools.html
@@ -0,0 +1,10 @@
+{% load i18n admin_urls jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block object-tools-items %}
+ {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
+ {% trans 'History' %}
+ {% if has_absolute_url %}
+ {% trans "View on site" %}
+ {% endif %}
+{% endblock %}
diff --git a/templates/admin/change_list.html b/templates/admin/change_list.html
new file mode 100644
index 0000000..d7d35a1
--- /dev/null
+++ b/templates/admin/change_list.html
@@ -0,0 +1,122 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_urls static admin_list jazzmin %}
+
+{% block extrastyle %}
+ {{ block.super }}
+
+
+ {% if cl.formset or action_form %}
+
+ {% endif %}
+ {{ media.css }}
+ {% if not actions_on_top and not actions_on_bottom %}
+
+ {% endif %}
+{% endblock %}
+
+{% block extrahead %}
+ {{ block.super }}
+ {{ media.js }}
+{% endblock %}
+
+{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %}
+
+{% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {{ cl.opts.verbose_name_plural|capfirst }}
+
+{% endblock %}
+
+{% block content_title %} {{ cl.opts.verbose_name_plural|capfirst }} {% endblock %}
+
+{% block coltype %}flex{% endblock %}
+
+ {% block page_actions %}
+
+ {% block object-tools %}
+ {% block object-tools-items %}
+ {% change_list_object_tools %}
+ {% endblock %}
+ {% endblock %}
+
+ {% endblock %}
+
+
+{% block content %}
+
+ {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %}
+
+ {% block search %}
+ {% search_form cl %}
+ {% endblock %}
+
+
+{% endblock %}
+
+{% block extrajs %}
+ {{ block.super }}
+
+
+
+{% endblock %}
diff --git a/templates/admin/change_list_object_tools.html b/templates/admin/change_list_object_tools.html
new file mode 100644
index 0000000..18b3c4e
--- /dev/null
+++ b/templates/admin/change_list_object_tools.html
@@ -0,0 +1,11 @@
+{% load i18n admin_urls jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block object-tools-items %}
+ {% if has_add_permission %}
+ {% url cl.opts|admin_urlname:'add' as add_url %}
+
+ {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
+
+ {% endif %}
+{% endblock %}
diff --git a/templates/admin/change_list_results.html b/templates/admin/change_list_results.html
new file mode 100644
index 0000000..f928548
--- /dev/null
+++ b/templates/admin/change_list_results.html
@@ -0,0 +1,48 @@
+{% load i18n static jazzmin %}
+
+{% if result_hidden_fields %}
+
+ {% for item in result_hidden_fields %}{{ item }}{% endfor %}
+
+{% endif %}
+
+{% if results %}
+
+
+
+
+
+ {% for header in result_headers %}
+
+ {% endfor %}
+
+
+
+ {% for result in results %}
+
+ {% for item in result %}{{ item }}{% endfor %}
+
+ {% endfor %}
+
+
+
+
+{% endif %}
diff --git a/templates/admin/date_hierarchy.html b/templates/admin/date_hierarchy.html
new file mode 100644
index 0000000..6e5d5b1
--- /dev/null
+++ b/templates/admin/date_hierarchy.html
@@ -0,0 +1,23 @@
+{% load jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% if show %}
+
+
+ {% block date-hierarchy-toplinks %}
+ {% block date-hierarchy-back %}
+ {% if back %}
+
‹ {{ back.title }}
+ {% endif %}
+ {% endblock %}
+ {% block date-hierarchy-choices %}
+ {% for choice in choices %}
+
+ {{ choice.title }}
+
+ {% endfor %}
+ {% endblock %}
+ {% endblock %}
+
+
+{% endif %}
diff --git a/templates/admin/delete_confirmation.html b/templates/admin/delete_confirmation.html
new file mode 100644
index 0000000..3a54bdc
--- /dev/null
+++ b/templates/admin/delete_confirmation.html
@@ -0,0 +1,79 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_urls static jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block extrahead %}
+{{ block.super }}
+{{ media }}
+
+{% endblock %}
+
+{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation{% endblock %}
+
+{% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {{ opts.verbose_name_plural|capfirst }}
+ {{ object|truncatewords:"18" }}
+ {% trans 'Delete' %}
+
+{% endblock %}
+
+{% block content_title %} {% trans 'Delete' %} {% endblock %}
+
+{% block content %}
+
+
+
+
+
+
+
+ {% if perms_lacking %}
+
{% blocktrans with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}
+
+ {% for obj in perms_lacking %}
+ {{ obj }}
+ {% endfor %}
+
+ {% elif protected %}
+
{% blocktrans with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktrans %}
+
+ {% for obj in protected %}
+ {{ obj }}
+ {% endfor %}
+
+ {% else %}
+
{% blocktrans with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktrans %}
+
+
+
{% trans "Objects" %}
+
{{ deleted_objects|unordered_list }}
+
+
+ {% include "admin/includes/object_delete_summary.html" %}
+
+
+
+ {% endif %}
+
+
+
+
+
+{% endblock %}
diff --git a/templates/admin/delete_selected_confirmation.html b/templates/admin/delete_selected_confirmation.html
new file mode 100644
index 0000000..2061184
--- /dev/null
+++ b/templates/admin/delete_selected_confirmation.html
@@ -0,0 +1,83 @@
+{% extends "admin/base_site.html" %}
+{% load i18n l10n admin_urls static jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block extrahead %}
+ {{ block.super }}
+ {{ media }}
+
+{% endblock %}
+
+{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %}
+
+{% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {{ opts.verbose_name_plural|capfirst }}
+ {% trans 'Delete multiple objects' %}
+
+{% endblock %}
+
+{% block content_title %} {% trans 'Delete multiple objects' %} {% endblock %}
+
+{% block content %}
+
+
+
+
+
+
+
+ {% if perms_lacking %}
+
{% blocktrans %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}
+
+ {% for obj in perms_lacking %}
+ {{ obj }}
+ {% endfor %}
+
+ {% elif protected %}
+
{% blocktrans %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktrans %}
+
+ {% for obj in protected %}
+ {{ obj }}
+ {% endfor %}
+
+ {% else %}
+
{% blocktrans %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktrans %}
+
+
+
{% trans "Objects" %}
+ {% for deletable_object in deletable_objects %}
+
{{ deletable_object|unordered_list }}
+ {% endfor %}
+
+
+ {% include "admin/includes/object_delete_summary.html" %}
+
+
+
+
+ {% endif %}
+
+
+
+
+{% endblock %}
diff --git a/templates/admin/edit_inline/stacked.html b/templates/admin/edit_inline/stacked.html
new file mode 100644
index 0000000..97276f9
--- /dev/null
+++ b/templates/admin/edit_inline/stacked.html
@@ -0,0 +1,58 @@
+{% load i18n admin_urls static %}
+
diff --git a/templates/admin/edit_inline/tabular.html b/templates/admin/edit_inline/tabular.html
new file mode 100644
index 0000000..66ae83b
--- /dev/null
+++ b/templates/admin/edit_inline/tabular.html
@@ -0,0 +1,94 @@
+{% load i18n admin_urls static admin_modify %}
+
diff --git a/templates/admin/filer/breadcrumbs.html b/templates/admin/filer/breadcrumbs.html
new file mode 100644
index 0000000..695041f
--- /dev/null
+++ b/templates/admin/filer/breadcrumbs.html
@@ -0,0 +1,30 @@
+{% load i18n %}
+
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {% if not instance.is_root and instance.is_smart_folder %}
+
+ {% trans "root" %}
+
+ {% endif %}
+ {% for ancestor_folder in instance.logical_path %}
+
+
+ {% if ancestor_folder.label %}
+ {{ ancestor_folder.label }}
+ {% else %}
+ {{ ancestor_folder.name }}
+ {% endif %}
+
+
+ {% endfor %}
+ {% if breadcrumbs_action %}
+ {% if instance.label or instance.name %}
+ {% if instance.label %}{{ instance.label }}{% else %}{{ instance.name }}{% endif %}
+ {% endif %}
+ {{ breadcrumbs_action }}
+ {% else %}
+ {% if instance.label %}{{ instance.label }}{% else %}{{ instance.name }}{% endif %}
+ {% endif %}
+
diff --git a/templates/admin/filer/change_form.html b/templates/admin/filer/change_form.html
new file mode 100644
index 0000000..c6f46e8
--- /dev/null
+++ b/templates/admin/filer/change_form.html
@@ -0,0 +1,33 @@
+{% extends "admin/change_form.html" %}
+{% load i18n admin_modify static filer_admin_tags %}
+
+{% block breadcrumbs %}
+ {% with original as instance %}
+ {% include "admin/filer/breadcrumbs.html" %}
+ {% endwith %}
+{% endblock %}
+
+{% block extrastyle %}
+ {{ block.super }}
+
+{% endblock %}
+
+
+{% block after_field_sets %}
+ {% filer_admin_context_hidden_formfields %}
+{% endblock %}
+
+{% block file_sidebar %}
+ {% with original.duplicates as duplicates %}
+ {% if duplicates %}
+
+
{% trans "Duplicates" %}
+
+
+ {% endif %}
+ {% endwith %}
+{% endblock %}
diff --git a/templates/admin/filer/delete_selected_files_confirmation.html b/templates/admin/filer/delete_selected_files_confirmation.html
new file mode 100644
index 0000000..cca72ad
--- /dev/null
+++ b/templates/admin/filer/delete_selected_files_confirmation.html
@@ -0,0 +1,75 @@
+{% extends "admin/delete_selected_confirmation.html" %}
+{% load i18n static admin_urls static jazzmin %}
+
+{% block breadcrumbs %}
+ {% include "admin/filer/breadcrumbs.html" %}
+{% endblock %}
+
+{% block content %}
+
+
+
+
+
+
+
+ {% if perms_lacking or protected %}
+ {% if perms_lacking %}
+
{% blocktrans %}Deleting the selected files and/or folders would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}
+
+ {% for obj in perms_lacking %}
+ {{ obj }}
+ {% endfor %}
+
+ {% endif %}
+ {% if protected %}
+
{% blocktrans %}Deleting the selected files and/or folders would require deleting the following protected related objects:{% endblocktrans %}
+
+ {% for obj in protected %}
+ {{ obj }}
+ {% endfor %}
+
+ {% endif %}
+ {% else %}
+
{% blocktrans %}Are you sure you want to delete the selected files and/or folders? All of the following objects and their related items will be deleted:{% endblocktrans %}
+
+
+
{% trans "Objects" %}
+ {% for deletable_object in deletable_objects %}
+
{{ deletable_object|unordered_list }}
+ {% endfor %}
+
+
+
+ {% endif %}
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/templates/admin/filer/file/change_form.html b/templates/admin/filer/file/change_form.html
new file mode 100644
index 0000000..b3c4fb3
--- /dev/null
+++ b/templates/admin/filer/file/change_form.html
@@ -0,0 +1,36 @@
+{% extends "admin/filer/change_form.html" %}
+{% load admin_modify static %}
+
+{% block extrahead %}
+ {{ block.super }}
+
+ {# upload stuff #}
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
+
+{% block submit_buttons_bottom %}
+ {% include "admin/filer/tools/detail_info.html" with file=True %}
+ {{ block.super }}
+{% endblock %}
diff --git a/templates/admin/filer/folder/change_form.html b/templates/admin/filer/folder/change_form.html
new file mode 100644
index 0000000..78582e7
--- /dev/null
+++ b/templates/admin/filer/folder/change_form.html
@@ -0,0 +1,33 @@
+{% extends "admin/change_form.html" %}
+{% load i18n admin_modify static filer_admin_tags %}
+
+{% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+
+ {% trans "root"|title %}
+
+ {% for ancestor_folder in original.get_ancestors %}
+
+ {{ ancestor_folder.name }}
+
+ {% endfor %}
+ {{ original.name }}
+
+{% endblock %}
+
+{% block coltype %}{% if is_popup %}colM{% else %}colMS{% endif %}{% endblock %}
+
+{% block object-tools %}
+ {% if change and not is_popup %}
+ {% trans 'History' %}
+ {% if has_absolute_url %}
+ {% trans "View on site" %}
+ {% endif%}
+ {% endif %}
+{% endblock %}
+
+{% block after_field_sets %}
+ {% filer_admin_context_hidden_formfields %}
+{% endblock %}
diff --git a/templates/admin/filer/folder/directory_listing.html b/templates/admin/filer/folder/directory_listing.html
new file mode 100644
index 0000000..8bb6d3c
--- /dev/null
+++ b/templates/admin/filer/folder/directory_listing.html
@@ -0,0 +1,258 @@
+{% extends "admin/filer/base_site.html" %}
+{% load i18n static filer_admin_tags %}
+
+{% block extrahead %}
+ {{ block.super }}
+
+ {% if action_form and actions_on_top or actions_on_bottom %}
+
+ {% endif %}
+{% endblock %}
+
+{% block coltype %}{% endblock %}
+{% block bodyclass %}change-list filebrowser{% endblock %}
+
+
+{% block extrastyle %}
+ {{ block.super }}
+
+ {{ media.css }}
+ {% if action_form %}
+ {% url 'admin:jsi18n' as jsi18nurl %}
+
+ {% endif %}
+ {% if query.pop %}
+
+ {% endif %}
+{% endblock %}
+
+{% block breadcrumbs %}
+ {% if not is_popup %}
+
+ {% trans 'Home' %}
+ Файлы
+ {% if not folder.is_root and folder.is_smart_folder %}
+ {% trans "root" %}
+ {% endif %}
+ {% for ancestor_folder in folder.logical_path %}
+
+
+ {% if ancestor_folder.label %}{{ ancestor_folder.label }}{% else %}{{ ancestor_folder.name }}{% endif %}
+
+
+ {% endfor %}
+ {% if breadcrumbs_action %}
+
+
+ {% if folder.label %}
+ {{ folder.label }}
+ {% else %}
+ {{ folder.name }}
+ {% endif %}
+
+
+ {{ breadcrumbs_action }}
+ {% else %}
+ {% if folder.label %}
+ {{ folder.label }}
+ {% else %}
+ {{ folder.name }}
+ {% endif %}
+ {% endif %}
+
+
+
+
+
+
+ {% endif %}
+{% endblock %}
+
+{% block content %}
+
+
+
+
+ {% for ancestor_folder in instance.logical_path %}
+ {{ ancestor_folder }}
+ {% endfor %}
+
+
+
+ {% if not folder.is_root or folder.is_smart_folder %}
+
+ {% endif %}
+
+
+ {% if not folder.is_root or folder.is_smart_folder %}
+
+
+
+
+ {{ folder.name }}
+
+
+
+
+
+ {% if not is_popup and folder.file_type == 'Folder' and permissions.has_edit_permission %}
+
+
+
+
+ {% endif %}
+
+ {% endif %}
+
+
+
+
+
+
+
+
+
+ {% include "admin/filer/tools/search_form.html" %}
+
+
+
+
+{% endblock %}
diff --git a/templates/admin/filer/image/change_form.html b/templates/admin/filer/image/change_form.html
new file mode 100644
index 0000000..3951695
--- /dev/null
+++ b/templates/admin/filer/image/change_form.html
@@ -0,0 +1,36 @@
+{% extends "admin/filer/change_form.html" %}
+{% load admin_modify static %}
+
+{% block extrahead %}
+ {{ block.super }}
+
+ {# upload stuff #}
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
+
+{% block submit_buttons_bottom %}
+ {% include "admin/filer/tools/detail_info.html" %}
+ {{ block.super }}
+{% endblock %}
\ No newline at end of file
diff --git a/templates/admin/filer/tools/detail_info.html b/templates/admin/filer/tools/detail_info.html
new file mode 100644
index 0000000..dea4d07
--- /dev/null
+++ b/templates/admin/filer/tools/detail_info.html
@@ -0,0 +1,55 @@
+{% load filer_admin_tags i18n static jazzmin %}
+
+
+
+
+
+ {% if file %}
+
+ {% else %}
+
+
+
+
+ {% endif %}
+
+ {% if original.file_type or original.modified_at or original.uploaded_at or original.width or original.height or original.size or original.owner %}
+
+ {% if original.file_type %}
+ {% trans "Type" %} : {{ original.extension|upper }} {{ original.file_type }}
+ {% endif %}
+ {% if original.width or original.height %}
+ {% trans "Size" %} : {{ original.width }}x{{ original.height }} px
+ {% endif %}
+ {% if original.size %}
+ {% trans "File-size" %} : {{ original.size|filesizeformat }}
+ {% endif %}
+ {% if original.modified_at %}
+ {% trans "Modified" %} : {{ original.modified_at }}
+ {% endif %}
+ {% if original.uploaded_at %}
+ {% trans "Created" %} : {{ original.uploaded_at }}
+ {% endif %}
+ {% if original.owner %}
+ {% trans "Owner" %} : {{ original.owner }}
+ {% endif %}
+
+ {% endif %}
+
+
+
diff --git a/templates/admin/filter.html b/templates/admin/filter.html
new file mode 100644
index 0000000..40750af
--- /dev/null
+++ b/templates/admin/filter.html
@@ -0,0 +1,15 @@
+{% load i18n %}
+
+
+
+ {{ title }}
+ ---------
+ {% for choice in choices %}
+ {% if choice.name %}
+
+ {{ choice.display }}
+
+ {% endif %}
+ {% endfor %}
+
+
diff --git a/templates/admin/import_export/base.html b/templates/admin/import_export/base.html
new file mode 100644
index 0000000..904b8e0
--- /dev/null
+++ b/templates/admin/import_export/base.html
@@ -0,0 +1,19 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_modify %}
+{% load admin_urls %}
+{% load static %}
+
+{% block extrastyle %}{{ block.super }} {% endblock %}
+{% block bodyclass %}{{ block.super }} {{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
+{% if not is_popup %}
+{% block breadcrumbs %}
+
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {{ opts.verbose_name_plural|capfirst }}
+ {% block breadcrumbs_last %}{% endblock %}
+
+
+{% endblock %}
+{% endif %}
diff --git a/templates/admin/import_export/change_list.html b/templates/admin/import_export/change_list.html
new file mode 100644
index 0000000..0f23dc7
--- /dev/null
+++ b/templates/admin/import_export/change_list.html
@@ -0,0 +1,13 @@
+{% extends "admin/change_list.html" %}
+
+{# Original template renders object-tools only when has_add_permission is True. #}
+{# This hack allows sub templates to add to object-tools #}
+{% block object-tools %}
+
+{% endblock %}
diff --git a/templates/admin/import_export/change_list_export.html b/templates/admin/import_export/change_list_export.html
new file mode 100644
index 0000000..9af1f73
--- /dev/null
+++ b/templates/admin/import_export/change_list_export.html
@@ -0,0 +1,6 @@
+{% extends "admin/import_export/change_list.html" %}
+
+{% block object-tools-items %}
+ {% include "admin/import_export/change_list_export_item.html" %}
+ {{ block.super }}
+{% endblock %}
diff --git a/templates/admin/import_export/change_list_export_item.html b/templates/admin/import_export/change_list_export_item.html
new file mode 100644
index 0000000..a63791d
--- /dev/null
+++ b/templates/admin/import_export/change_list_export_item.html
@@ -0,0 +1,8 @@
+{% load i18n %}
+{% load admin_urls %}
+
+{% if has_export_permission %}
+
+ {% trans "Export" %}
+
+{% endif %}
diff --git a/templates/admin/import_export/change_list_import.html b/templates/admin/import_export/change_list_import.html
new file mode 100644
index 0000000..9aa1860
--- /dev/null
+++ b/templates/admin/import_export/change_list_import.html
@@ -0,0 +1,6 @@
+{% extends "admin/import_export/change_list.html" %}
+
+{% block object-tools-items %}
+ {% include "admin/import_export/change_list_import_item.html" %}
+ {{ block.super }}
+{% endblock %}
diff --git a/templates/admin/import_export/change_list_import_export.html b/templates/admin/import_export/change_list_import_export.html
new file mode 100644
index 0000000..6b30773
--- /dev/null
+++ b/templates/admin/import_export/change_list_import_export.html
@@ -0,0 +1,9 @@
+{% extends "admin/import_export/change_list.html" %}
+
+{% block object-tools-items %}
+
+ {% include "admin/import_export/change_list_import_item.html" %}
+ {% include "admin/import_export/change_list_export_item.html" %}
+ {{ block.super }}
+
+{% endblock %}
diff --git a/templates/admin/import_export/change_list_import_item.html b/templates/admin/import_export/change_list_import_item.html
new file mode 100644
index 0000000..561e105
--- /dev/null
+++ b/templates/admin/import_export/change_list_import_item.html
@@ -0,0 +1,8 @@
+{% load i18n admin_urls jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% if has_import_permission %}
+
+ {% trans "Import" %}
+
+{% endif %}
diff --git a/templates/admin/import_export/export.html b/templates/admin/import_export/export.html
new file mode 100644
index 0000000..c7a9d5e
--- /dev/null
+++ b/templates/admin/import_export/export.html
@@ -0,0 +1,74 @@
+{% extends "admin/import_export/base.html" %}
+{% load i18n admin_urls static import_export_tags jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block extrastyle %}
+ {{ block.super }}
+
+{% endblock %}
+
+{% block breadcrumbs_last %}
+ {% trans "Export" %}
+{% endblock %}
+
+{% block content %}
+
+{% endblock %}
+
+{% block extrajs %}
+ {{ block.super }}
+
+
+{% endblock %}
diff --git a/templates/admin/import_export/import.html b/templates/admin/import_export/import.html
new file mode 100644
index 0000000..5cb4b33
--- /dev/null
+++ b/templates/admin/import_export/import.html
@@ -0,0 +1,272 @@
+{% extends "admin/import_export/base.html" %}
+{% load i18n admin_urls import_export_tags static jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block extrastyle %}
+ {{ block.super }}
+
+
+{% endblock %}
+
+{% block breadcrumbs_last %}
+ {% trans "Import" %}
+{% endblock %}
+
+{% block content %}
+
+ {% if confirm_form %}
+
+ {% else %}
+
+ {% endif %}
+
+ {% if result %}
+
+ {% if result.has_errors %}
+
+
+ {% elif result.has_validation_errors %}
+
+
{% trans "Some rows failed to validate" %}
+
+
{% trans "Please correct these errors in your data where possible, then reupload it using the form above." %}
+
+
+
+
+ {% trans "Row" %}
+ {% trans "Errors" %}
+ {% for field in result.diff_headers %}
+ {{ field }}
+ {% endfor %}
+
+
+
+ {% for row in result.invalid_rows %}
+
+ {{ row.number }}
+
+ {{ row.error_count }}
+
+
+ {% for field_name, error_list in row.field_specific_errors.items %}
+
+ {{ field_name }}
+
+ {% for error in error_list %}
+ {{ error }}
+ {% endfor %}
+
+
+ {% endfor %}
+ {% if row.non_field_specific_errors %}
+
+ {% trans "Non field specific" %}
+
+ {% for error in row.non_field_specific_errors %}
+ {{ error }}
+ {% endfor %}
+
+
+ {% endif %}
+
+
+
+ {% for field in row.values %}
+ {{ field }}
+ {% endfor %}
+
+ {% endfor %}
+
+
+
+ {% else %}
+
+
+
+
+
+
+
+
+
+
+ {% for field in result.diff_headers %}
+ {{ field }}
+ {% endfor %}
+
+
+ {% for row in result.valid_rows %}
+
+
+ {% if row.import_type == 'new' %}
+ {% trans "New" %}
+ {% elif row.import_type == 'skip' %}
+ {% trans "Skipped" %}
+ {% elif row.import_type == 'delete' %}
+ {% trans "Delete" %}
+ {% elif row.import_type == 'update' %}
+ {% trans "Update" %}
+ {% endif %}
+
+ {% for field in row.diff %}
+ {{ field }}
+ {% endfor %}
+
+ {% endfor %}
+
+
+
+
+
+
+ {% endif %}
+ {% endif %}
+
+{% endblock %}
+
+{% block extrajs %}
+ {{ block.super }}
+
+
+{% endblock %}
diff --git a/templates/admin/includes/fieldset.html b/templates/admin/includes/fieldset.html
new file mode 100644
index 0000000..0189fc1
--- /dev/null
+++ b/templates/admin/includes/fieldset.html
@@ -0,0 +1,59 @@
+{% load jazzmin %}
+{% if card %}
+
+ {% if card_header and fieldset.name %}
+
+ {%elif fieldset.description %}
+
+ {%endif%}
+
+
+{% endif %}
+
+ {% for line in fieldset %}
+
+ {% endfor %}
+
+{% if card %}
+
+
+{% endif %}
\ No newline at end of file
diff --git a/templates/admin/includes/object_delete_summary.html b/templates/admin/includes/object_delete_summary.html
new file mode 100644
index 0000000..0057af8
--- /dev/null
+++ b/templates/admin/includes/object_delete_summary.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+{% trans "Summary" %}
+
+
+ {% for model_name, object_count in model_count %}
+
+ {{ model_name|capfirst }}
+ {{ object_count }}
+
+ {% endfor %}
+
+
diff --git a/templates/admin/index.html b/templates/admin/index.html
new file mode 100644
index 0000000..abc77db
--- /dev/null
+++ b/templates/admin/index.html
@@ -0,0 +1,133 @@
+{% extends "admin/base_site.html" %}
+{% load i18n static jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block bodyclass %}{{ block.super }} dashboard{% endblock %}
+
+{% block content_title %} {% trans 'Dashboard' %} {% endblock %}
+
+{% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {% trans 'Dashboard' %}
+
+{% endblock %}
+
+
+{% block content %}
+ {% get_side_menu using="app_list" as dashboard_list %}
+ {% if dashboard_list %}
+ {% widthratio dashboard_list|length 2 1 as middle %}
+ {% endif %}
+
+
+
+
+ {% for app in dashboard_list %}
+
+
+
+
+
+ {% for model in app.models %}
+
+
+ {% if model.url %}{{ model.name }} {% else %}{{ model.name }}{% endif %}
+
+
+
+
+
+ {% endfor %}
+
+
+
+
+
+ {% if forloop.counter == middle|add:"0" %}
+
+
+ {% endif %}
+
+ {% endfor %}
+
+
+
+
+
+
+
+
{% trans 'Recent actions' %}
+ {% load log %}
+ {% get_admin_log 6 as admin_log for_user user %}
+ {% if not admin_log %}
+
{% trans 'None available' %}
+ {% else %}
+
+ {% for entry in admin_log %}
+
+ {% if entry.is_change %}
+
+ {% elif entry.is_deletion %}
+
+ {% elif entry.is_addition %}
+
+ {% endif %}
+
+
+
{% blocktrans with timesince=entry.action_time|timesince %}{{ timesince }} ago{% endblocktrans %}
+
+ {% if not entry.is_deletion %}
+
+ {% if entry.is_addition %}
+ {{ entry }}
+ {% else %}
+
+ {% action_message_to_list entry as action_message_list %}
+ {% for action_message in action_message_list %}
+ {{ action_message.msg|style_bold_first_word }}
+ {% endfor %}
+
+ {% endif %}
+
+ {% endif %}
+
+
+ {% endfor %}
+
+
+
+
+ {% endif %}
+
+
+
+
+{% endblock %}
diff --git a/templates/admin/login.html b/templates/admin/login.html
new file mode 100644
index 0000000..5c41ffc
--- /dev/null
+++ b/templates/admin/login.html
@@ -0,0 +1,76 @@
+{% extends "registration/base.html" %}
+
+{% load i18n jazzmin %}
+{% get_jazzmin_settings request as jazzmin_settings %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block content %}
+ {{ jazzmin_settings.welcome_sign }}
+
+ {% endif %}
+ {% if form.errors %}
+ {% if form.username.errors %}
+
+
{{ form.username.label }}: {{ form.username.errors|join:', ' }}
+
+ {% endif %}
+ {% if form.password.errors %}
+
+
{{ form.password.label }}: {{ form.password.errors|join:', ' }}
+
+ {% endif %}
+ {% if form.non_field_errors %}
+
+ {% for error in form.non_field_errors %}
+
{{ error }}
+ {% endfor %}
+
+ {% endif %}
+ {% endif %}
+
+
+ {% url 'admin_password_reset' as password_reset_url %}
+ {% if password_reset_url %}
+
+ {% endif %}
+
+
+
+ {% trans "Log in" %}
+
+
+
+
+{% endblock %}
diff --git a/templates/admin/mptt_filter.html b/templates/admin/mptt_filter.html
new file mode 100644
index 0000000..ef78514
--- /dev/null
+++ b/templates/admin/mptt_filter.html
@@ -0,0 +1,16 @@
+{% load i18n %}
+{% load mptt_admin %}
+
+
+
+ {{ title }}
+ ---------
+ {% for choice in choices %}
+ {% if choice.name %}
+
+ {{ choice.display }}
+
+ {% endif %}
+ {% endfor %}
+
+
\ No newline at end of file
diff --git a/templates/admin/object_history.html b/templates/admin/object_history.html
new file mode 100644
index 0000000..9ce281a
--- /dev/null
+++ b/templates/admin/object_history.html
@@ -0,0 +1,72 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_urls static jazzmin %}
+
+{% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {{ module_name }}
+ {{ object|truncatewords:"18" }}
+ {% trans 'History' %}
+
+{% endblock %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+
+
+
+ {% for action in action_list reversed %}
+
+ {{ action.action_time|date:"DATETIME_FORMAT" }}
+
+
+ {% action_message_to_list action as action_message_list %}
+ {% for action_message in action_message_list %}
+
+ {% endfor %}
+
+ {% endfor %}
+
+
+
+ {% if not action_list %}
+
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
diff --git a/templates/admin/pagination.html b/templates/admin/pagination.html
new file mode 100644
index 0000000..a3f4d09
--- /dev/null
+++ b/templates/admin/pagination.html
@@ -0,0 +1,30 @@
+{% load admin_list jazzmin i18n %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+
+
+ {{ cl.result_count }}
+ {% if cl.result_count == 1 %}
+ {{ cl.opts.verbose_name }}
+ {% else %}
+ {{ cl.opts.verbose_name_plural }}
+ {% endif %}
+
+ {% if show_all_url %}
+
{% trans 'Show all' %}
+ {% endif %}
+ {% if cl.formset and cl.result_count %}
+
+ {% endif %}
+
+
+
+
+
+
diff --git a/templates/admin/popup_response.html b/templates/admin/popup_response.html
new file mode 100644
index 0000000..20fcbfc
--- /dev/null
+++ b/templates/admin/popup_response.html
@@ -0,0 +1,17 @@
+{% load i18n static %}
+
+
+
+ {% trans 'Popup closing...' %}
+
+
+
+
\ No newline at end of file
diff --git a/templates/admin/search_form.html b/templates/admin/search_form.html
new file mode 100644
index 0000000..db22136
--- /dev/null
+++ b/templates/admin/search_form.html
@@ -0,0 +1,42 @@
+{% load i18n static admin_list jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+
\ No newline at end of file
diff --git a/templates/admin/solo/change_form.html b/templates/admin/solo/change_form.html
new file mode 100644
index 0000000..ff667a6
--- /dev/null
+++ b/templates/admin/solo/change_form.html
@@ -0,0 +1,18 @@
+{% extends "admin/change_form.html" %}
+{% load admin_urls i18n jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {{ opts.verbose_name|capfirst }}
+
+{% endblock %}
+
+{% block object-tools-items %}
+ {% trans 'History' %}
+ {% if has_absolute_url %}
+ {% trans "View on site" %}
+ {% endif %}
+{% endblock %}
diff --git a/templates/admin/solo/object_history.html b/templates/admin/solo/object_history.html
new file mode 100644
index 0000000..ebb6c28
--- /dev/null
+++ b/templates/admin/solo/object_history.html
@@ -0,0 +1,11 @@
+{% extends "admin/object_history.html" %}
+{% load admin_urls i18n %}
+
+{% block breadcrumbs %}
+
+ {% trans 'Home' %}
+ {{ opts.app_config.verbose_name }}
+ {{ module_name }}
+ {% trans 'History' %}
+
+{% endblock %}
diff --git a/templates/admin/submit_line.html b/templates/admin/submit_line.html
new file mode 100644
index 0000000..c3a553e
--- /dev/null
+++ b/templates/admin/submit_line.html
@@ -0,0 +1,42 @@
+{% load i18n admin_urls jazzmin %}
+{% get_jazzmin_ui_tweaks as jazzmin_ui %}
+
+{% block submit-row %}
+
+{% endblock %}
+
diff --git a/uv.lock b/uv.lock
index 372a9c4..1ed04e6 100644
--- a/uv.lock
+++ b/uv.lock
@@ -41,6 +41,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 },
]
+[[package]]
+name = "asttokens"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764 },
+]
+
+[[package]]
+name = "async-timeout"
+version = "4.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/87/d6/21b30a550dafea84b1b8eee21b5e23fa16d010ae006011221f33dcd8d7f8/async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", size = 8345 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", size = 5721 },
+]
+
[[package]]
name = "beautifulsoup4"
version = "4.12.3"
@@ -345,6 +366,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a2/80/fb7d668f1be5e4443b7ac191f68390be24f7c2ebd36011741f62c7645eb2/cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84", size = 2989208 },
]
+[[package]]
+name = "decorator"
+version = "5.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 },
+]
+
[[package]]
name = "deep-translator"
version = "1.11.4"
@@ -369,16 +399,16 @@ wheels = [
[[package]]
name = "django"
-version = "5.0"
+version = "5.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "asgiref" },
{ name = "sqlparse" },
{ name = "tzdata", marker = "sys_platform == 'win32'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/be/a6/46e250737d46e955e048f6bbc2948fb22f0de3f3ab828d3803070dc1260e/Django-5.0.tar.gz", hash = "sha256:7d29e14dfbc19cb6a95a4bd669edbde11f5d4c6a71fdaa42c2d40b6846e807f7", size = 10585390 }
+sdist = { url = "https://files.pythonhosted.org/packages/1e/0c/d854d25bb74a8a3b41e642bbd27fe6af12fadd0edfd07d487809cf0ef719/Django-5.1.tar.gz", hash = "sha256:848a5980e8efb76eea70872fb0e4bc5e371619c70fffbe48e3e1b50b2c09455d", size = 10681050 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ba/c7/61b02c0ef9e129080a8c2bffefb3cb2b9ddddece4c44dc473c1c4f0647c1/Django-5.0-py3-none-any.whl", hash = "sha256:3a9fd52b8dbeae335ddf4a9dfa6c6a0853a1122f1fb071a8d5eca979f73a05c8", size = 8136382 },
+ { url = "https://files.pythonhosted.org/packages/28/b4/110532cebfea2244d76119904da98c6fa045ebb202aee9ec7cbf36ea3cad/Django-5.1-py3-none-any.whl", hash = "sha256:d3b811bf5371a26def053d7ee42a9df1267ef7622323fe70a601936725aa4557", size = 8246099 },
]
[[package]]
@@ -431,6 +461,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/09/b1/92f1c30b47c1ebf510c35a2ccad9448f73437e5891bbd2b4febe357cc3de/django_filter-24.3-py3-none-any.whl", hash = "sha256:c4852822928ce17fb699bcfccd644b3574f1a2d80aeb2b4ff4f16b02dd49dc64", size = 95011 },
]
+[[package]]
+name = "django-htmx"
+version = "1.19.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "asgiref" },
+ { name = "django" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c7/38/3b5b53b158f3e75da6b68f798514f1b533b0c88f87dd7bb59eb3e4836c32/django_htmx-1.19.0.tar.gz", hash = "sha256:e7e17304e78e07f96eca0affc3ce1806edfdf3538bb7cb1912452b101f3e627d", size = 9791 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/af/a8/831374e1b117c345ee63690186bfdc56ad0b578b0f5ad2361de65d82757e/django_htmx-1.19.0-py3-none-any.whl", hash = "sha256:875a642814e52278c1728842436beda2001847a493ab79fd82da3fb46ead140f", size = 6904 },
+]
+
[[package]]
name = "django-import-export"
version = "4.1.1"
@@ -487,6 +530,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/05/ef/a3ad9941f14a13a5dc9f2bdc8992bf21cc09c462c718711a0281acfab67c/django_resized-1.0.2-py3-none-any.whl", hash = "sha256:d55a8d4125838486a1e76ffb689f8364f7d579bc7562b04400065602ec2ba7cc", size = 5141 },
]
+[[package]]
+name = "django-sesame"
+version = "3.2.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "django" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/88/584aa0c56b0788ef506ca178ba647fc4403b35f4660064dffd43014c3133/django_sesame-3.2.2.tar.gz", hash = "sha256:5d753a309166356b6a0d7fc047690943b9e80b4aa7952f1a6400fe6ce60d573c", size = 17615 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dd/e7/951f35106972668b61e79635c93933c51c2d58f49a9c8ebf0a8ff7262331/django_sesame-3.2.2-py3-none-any.whl", hash = "sha256:523ebd4d04e28c897c262f25b78b6fd8f37e11cdca6e277fdc8bf496bd686cf5", size = 20289 },
+]
+
[[package]]
name = "django-solo"
version = "2.3.0"
@@ -512,6 +567,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cf/14/20c40882d9ee91f7a2a20d3c0175cf813340c02ae31c975ce567de2c7c67/django_tailwind-3.8.0-py3-none-any.whl", hash = "sha256:fa969c5b95d314b173fe2b2ed2cb2c03f2e2c94fdc2c01ff73a993fa159085da", size = 12936 },
]
+[[package]]
+name = "django-unfold"
+version = "0.39.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "django" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/19/4c/808b551f5c75d24c0a6aabf3275c6f661e0b0ab24bd50236fb13b2b16feb/django_unfold-0.39.0.tar.gz", hash = "sha256:927218e8a14f951dd82212a980f3f02608a160f966da656d13ef51be887a610c", size = 811917 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4f/41/855b6d650bf11455e697948f194780d6704e89a2965b18985a5277172099/django_unfold-0.39.0-py3-none-any.whl", hash = "sha256:5393742d0755fc3983ee805ac27213cb7abbe06b563a0cdfd24103ff22480322", size = 877521 },
+]
+
+[[package]]
+name = "django-vite-plugin"
+version = "3.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3a/ec/24786da10b7d32906e99e22f6312333b51fb3d6322647d056ef090d99e64/django_vite_plugin-3.0.4.tar.gz", hash = "sha256:e5964597daa53ad5992f23e99e61dc4168c07ed51077851a3e3f02989697d41c", size = 5825 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5d/e0/4bc110d278d213d3dbccfac6d6f8ab229199d1876251eaa7e7f945de251a/django_vite_plugin-3.0.4-py3-none-any.whl", hash = "sha256:5cc0425cd9a56afc0d1d27d5016e61a6929ad93024307af4195e4b25db340574", size = 8569 },
+]
+
[[package]]
name = "django-webpack-loader"
version = "3.1.1"
@@ -533,6 +609,24 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/7c/b6/fa99d8f05eff3a9310286ae84c4059b08c301ae4ab33ae32e46e8ef76491/djangorestframework-3.15.2-py3-none-any.whl", hash = "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20", size = 1071235 },
]
+[[package]]
+name = "exceptiongroup"
+version = "1.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 },
+]
+
+[[package]]
+name = "executing"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8c/e3/7d45f492c2c4a0e8e0fad57d081a7c8a0286cdd86372b070cca1ec0caa1e/executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab", size = 977485 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 },
+]
+
[[package]]
name = "firebase-admin"
version = "6.5.0"
@@ -575,18 +669,24 @@ dependencies = [
{ name = "django-ckeditor" },
{ name = "django-cors-headers" },
{ name = "django-filter" },
+ { name = "django-htmx" },
{ name = "django-import-export" },
{ name = "django-jazzmin" },
{ name = "django-loginas" },
{ name = "django-resized" },
+ { name = "django-sesame" },
{ name = "django-solo" },
{ name = "django-tailwind" },
+ { name = "django-unfold" },
+ { name = "django-vite-plugin" },
{ name = "djangorestframework" },
{ name = "firebase-admin" },
+ { name = "ipython" },
{ name = "mysqlclient" },
{ name = "pillow" },
{ name = "pip" },
{ name = "python-dotenv" },
+ { name = "redis" },
{ name = "stellar-sdk" },
]
@@ -603,22 +703,28 @@ dev = [
requires-dist = [
{ name = "celery", specifier = ">=5.4.0" },
{ name = "deep-translator", specifier = ">=1.11.4" },
- { name = "django", specifier = "==5.0" },
+ { name = "django", specifier = "==5.1" },
{ name = "django-ckeditor", specifier = ">=6.7.1" },
{ name = "django-cors-headers", specifier = ">=4.4.0" },
{ name = "django-filter", specifier = ">=24.3" },
+ { name = "django-htmx", specifier = ">=1.19.0" },
{ name = "django-import-export", specifier = ">=4.1.1" },
{ name = "django-jazzmin", specifier = ">=3.0.0" },
{ name = "django-loginas", specifier = ">=0.3.11" },
{ name = "django-resized", specifier = ">=1.0.2" },
+ { name = "django-sesame", specifier = ">=3.2.2" },
{ name = "django-solo", specifier = ">=2.3.0" },
{ name = "django-tailwind", specifier = ">=3.8.0" },
+ { name = "django-unfold", specifier = ">=0.39.0" },
+ { name = "django-vite-plugin", specifier = ">=3.0.4" },
{ name = "djangorestframework", specifier = ">=3.15.2" },
{ name = "firebase-admin", specifier = ">=6.5.0" },
+ { name = "ipython", specifier = ">=8.27.0" },
{ name = "mysqlclient", specifier = ">=2.2.4" },
{ name = "pillow", specifier = ">=10.4.0" },
{ name = "pip", specifier = ">=24.2" },
{ name = "python-dotenv", specifier = ">=1.0.1" },
+ { name = "redis", specifier = ">=5.0.8" },
{ name = "stellar-sdk", specifier = ">=11.0.0" },
]
@@ -862,6 +968,28 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
]
+[[package]]
+name = "ipython"
+version = "8.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "decorator" },
+ { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
+ { name = "jedi" },
+ { name = "matplotlib-inline" },
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
+ { name = "prompt-toolkit" },
+ { name = "pygments" },
+ { name = "stack-data" },
+ { name = "traitlets" },
+ { name = "typing-extensions", marker = "python_full_version < '3.12'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/57/24/d4fabaca03c8804bf0b8d994c8ae3a20e57e9330d277fb43d83e558dec5e/ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e", size = 5494984 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a8/a2/6c725958e6f135d8e5de081e69841bb2c1d84b3fc259d02eb092b8fc203a/ipython-8.27.0-py3-none-any.whl", hash = "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c", size = 818986 },
+]
+
[[package]]
name = "isort"
version = "5.13.2"
@@ -871,6 +999,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", size = 92310 },
]
+[[package]]
+name = "jedi"
+version = "0.19.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "parso" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d6/99/99b493cec4bf43176b678de30f81ed003fd6a647a301b9c927280c600f0a/jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", size = 1227821 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0", size = 1569361 },
+]
+
[[package]]
name = "kombu"
version = "5.4.1"
@@ -884,6 +1024,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c1/78/c556bf2954bd36f166959ac33d23cde4a8967e61cdb74678585a66edbae0/kombu-5.4.1-py3-none-any.whl", hash = "sha256:621d365f234e4c089596f3a2510f1ade07026efc28caca426161d8f458786cab", size = 201338 },
]
+[[package]]
+name = "matplotlib-inline"
+version = "0.1.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
+]
+
[[package]]
name = "mccabe"
version = "0.7.0"
@@ -984,6 +1136,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 },
]
+[[package]]
+name = "parso"
+version = "0.8.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 },
+]
+
[[package]]
name = "pathspec"
version = "0.12.1"
@@ -993,6 +1154,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 },
]
+[[package]]
+name = "pexpect"
+version = "4.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ptyprocess" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
+]
+
[[package]]
name = "pillow"
version = "10.4.0"
@@ -1108,6 +1281,24 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/51/3d/71fae0078424ba8ea70b222b6fa56ef771a9918ab91cee806c2abc9d57fa/protobuf-5.28.1-py3-none-any.whl", hash = "sha256:c529535e5c0effcf417682563719e5d8ac8d2b93de07a56108b4c2d436d7a29a", size = 169572 },
]
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 },
+]
+
+[[package]]
+name = "pure-eval"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 },
+]
+
[[package]]
name = "pyasn1"
version = "0.6.1"
@@ -1237,6 +1428,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d4/d7/f1b7db88d8e4417c5d47adad627a93547f44bdc9028372dbd2313f34a855/pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a", size = 62725 },
]
+[[package]]
+name = "pygments"
+version = "2.18.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 },
+]
+
[[package]]
name = "pyjwt"
version = "2.9.0"
@@ -1301,6 +1501,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
]
+[[package]]
+name = "redis"
+version = "5.0.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "async-timeout", marker = "python_full_version < '3.11.3'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/48/10/defc227d65ea9c2ff5244645870859865cba34da7373477c8376629746ec/redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870", size = 4595651 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c5/d1/19a9c76811757684a0f74adc25765c8a901d67f9f6472ac9d57c844a23c8/redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4", size = 255608 },
+]
+
[[package]]
name = "requests"
version = "2.32.3"
@@ -1367,6 +1579,20 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/5d/a5/b2860373aa8de1e626b2bdfdd6df4355f0565b47e51f7d0c54fe70faf8fe/sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", size = 44156 },
]
+[[package]]
+name = "stack-data"
+version = "0.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "asttokens" },
+ { name = "executing" },
+ { name = "pure-eval" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
+]
+
[[package]]
name = "stellar-sdk"
version = "11.0.0"
@@ -1412,6 +1638,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757 },
]
+[[package]]
+name = "traitlets"
+version = "5.14.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 },
+]
+
[[package]]
name = "typing-extensions"
version = "4.12.2"
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..2be9e8a
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,12 @@
+//vite.config.js
+import { defineConfig } from 'vite'
+import { djangoVitePlugin } from 'django-vite-plugin'
+
+export default defineConfig({
+ plugins: [
+ djangoVitePlugin([
+ 'jsvite/js/main.js',
+ // 'templatevite/css/style.css',
+ ])
+ ],
+});
\ No newline at end of file
diff --git a/webpack-stats.json b/webpack-stats.json
deleted file mode 100644
index 7c64e2d..0000000
--- a/webpack-stats.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "status": "done",
- "assets": {
- "main.js": {
- "name": "main.js",
- "path": "D:\\Project\\Upload\\geraipi_test\\static\\webpack_bundles\\main.js",
- "publicPath": "auto"
- },
- "main.js.LICENSE.txt": {
- "name": "main.js.LICENSE.txt",
- "path": "D:\\Project\\Upload\\geraipi_test\\static\\webpack_bundles\\main.js.LICENSE.txt",
- "publicPath": "auto"
- },
- "other.js": {
- "name": "other.js",
- "path": "D:\\Project\\Upload\\geraipi_test\\static\\webpack_bundles\\other.js",
- "publicPath": "auto"
- },
- "other.js.LICENSE.txt": {
- "name": "other.js.LICENSE.txt",
- "path": "D:\\Project\\Upload\\geraipi_test\\static\\webpack_bundles\\other.js.LICENSE.txt",
- "publicPath": "auto"
- }
- },
- "chunks": {
- "main": [
- "main.js"
- ],
- "other": [
- "other.js"
- ]
- },
- "publicPath": "auto"
-}
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
deleted file mode 100644
index 1f7d44d..0000000
--- a/webpack.config.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var path = require("path");
-var BundleTracker = require("webpack-bundle-tracker");
-const FileManagerPlugin = require('filemanager-webpack-plugin');
-
-module.exports = {
- context: __dirname,
- entry: {
- main: "./assets/js/index",
- other: "./assets/js/other",
- },
- output: {
- path: path.resolve(__dirname, "static/webpack_bundles/"),
- publicPath: "auto",
- filename: "[name].js",
- },
-
- plugins: [
- new BundleTracker({ path: __dirname, filename: "webpack-stats.json" }),
- new FileManagerPlugin({
- events: {
- onEnd: {
- copy: [{
- source: './static/webpack_bundles/other.js',
- destination: './frontend/templates/firebase-messaging-sw.js',
- }],
- },
- }
- }),
- ],
-
- module: {
- rules: [
- // we pass the output from babel loader to react-hot loader
- {
- test: /\.jsx?$/,
- exclude: /node_modules/,
- use: {
- loader: "babel-loader",
- },
- },
- ],
- },
-
- resolve: {
- extensions: [".js", ".jsx"],
- },
-};
\ No newline at end of file