+ You are authenticated as {{ user.username }}. Go to my dashboard or login as a different user. +
+ {% endif %} + + + + +diff --git a/.ebextensions/01_packages.config b/.ebextensions/01_packages.config new file mode 100644 index 0000000..93cd0ad --- /dev/null +++ b/.ebextensions/01_packages.config @@ -0,0 +1,5 @@ +packages: + yum: + git: [] + postgresql-devel: [] + openssl-devel: [] diff --git a/.ebextensions/02_settings.config b/.ebextensions/02_settings.config new file mode 100644 index 0000000..2d78527 --- /dev/null +++ b/.ebextensions/02_settings.config @@ -0,0 +1,12 @@ +option_settings: + - namespace: aws:elasticbeanstalk:container:python + option_name: NumProcesses + value: '1' + - namespace: aws:elasticbeanstalk:container:python + option_name: NumThreads + value: '15' + - namespace: aws:elasticbeanstalk:container:python + option_name: WSGIPath + value: bigvince.wsgi:application + + diff --git a/.ebextensions/02_settings.config.20190621-1118.bk b/.ebextensions/02_settings.config.20190621-1118.bk new file mode 100644 index 0000000..12ef7bd --- /dev/null +++ b/.ebextensions/02_settings.config.20190621-1118.bk @@ -0,0 +1,17 @@ +option_settings: + - namespace: aws:elasticbeanstalk:container:python + option_name: NumProcesses + value: '1' + - namespace: aws:elasticbeanstalk:container:python + option_name: NumThreads + value: '15' + - namespace: aws:elasticbeanstalk:container:python + option_name: StaticFiles + value: /static/=static/ + - namespace: aws:elasticbeanstalk:container:python + option_name: WSGIPath + value: bigvince/wsgi.py + - namespace: aws:elasticbeanstalk:container:python:staticfiles + option_name: /static/ + value: vince/static/ + diff --git a/.ebextensions/02_settings.config.bk b/.ebextensions/02_settings.config.bk new file mode 100644 index 0000000..750fb9f --- /dev/null +++ b/.ebextensions/02_settings.config.bk @@ -0,0 +1,12 @@ +option_settings: + "aws:elasticbeanstalk:container:python": + NumProcesses: '1' + NumThreads: '15' + StaticFiles: /static/=static/ + WSGIPath: bigvince/wsgi.py + "aws:elasticbeanstalk:container:python:staticfiles": + /static/: vince/static/ + "aws:elasticbeanstalk:application": + "Name": default + "Application Healthcheck URL": /vince + diff --git a/.ebextensions/03_python.config b/.ebextensions/03_python.config new file mode 100644 index 0000000..ad9b897 --- /dev/null +++ b/.ebextensions/03_python.config @@ -0,0 +1,19 @@ +container_commands: + 01_migrate_vincetrack: + command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate --database=default --noinput" + test: '[ "X${VINCE_NAMESPACE}" == "Xvince" ]' + 02_migrate_vincecomm: + command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate --database=vincecomm --noinput" + test: '[ "X${VINCE_NAMESPACE}" != "Xvincepub" ]' + 03_collectstatic: + command: "source /var/app/venv/*/bin/activate && python3 manage.py collectstatic --noinput" + 04_createsu: + command: "source /var/app/venv/*/bin/activate && python3 manage.py createsu" + test: '[ "X${VINCE_NAMESPACE}" != "Xvincepub" ]' + 05_migrate_vincepub: + command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate --database=vincepub --noinput" + leader_only: true + 06_loadinitialdata: + command: "source /var/app/venv/*/bin/activate && python3 manage.py loadinitialdata" + test: '[ "X${VINCE_NAMESPACE}" != "Xvincepub" ]' + diff --git a/.ebextensions/wsgi_custom.conf b/.ebextensions/wsgi_custom.conf new file mode 100644 index 0000000..964659b --- /dev/null +++ b/.ebextensions/wsgi_custom.conf @@ -0,0 +1,7 @@ +files: + "/etc/httpd/conf.d/wsgi_custom.conf": + mode: "000644" + owner: root + group: root + content: | + WSGIPassAuthorization On \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c1df62 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +*~ +templates/vince/*~ +web/vince/migrations/* +management/commands/*~ +media/* +env/* +.idea +.aws-sam +bigvince/.env +app_versions/ +venv* +.swp + +# Elastic Beanstalk Files +.elasticbeanstalk/* +!.elasticbeanstalk/*.cfg.yml +!.elasticbeanstalk/*.global.yml +.elasticbeanstalk/config.yml diff --git a/.platform/nginx/conf.d/client_max_body_size.conf b/.platform/nginx/conf.d/client_max_body_size.conf new file mode 100644 index 0000000..5a4b1f0 --- /dev/null +++ b/.platform/nginx/conf.d/client_max_body_size.conf @@ -0,0 +1 @@ + client_max_body_size 25m; diff --git a/.platform/nginx/conf.d/timeout.conf b/.platform/nginx/conf.d/timeout.conf new file mode 100644 index 0000000..d71ef54 --- /dev/null +++ b/.platform/nginx/conf.d/timeout.conf @@ -0,0 +1,4 @@ + proxy_connect_timeout 605; + proxy_send_timeout 605; + proxy_read_timeout 605; + send_timeout 605; diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8cc2a1c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,6 @@ +# VINCE Changelog + +# Version 1.48.0: 2022-05-13 +============================= + +Initial Open Source Release diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..dacc64b --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,35 @@ +VINCE + +Copyright 2022 Carnegie Mellon University. + +MIT (SEI) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +VINCE includes and/or can make use of certain third party software ("Third +Party Software"). The Third Party Software that is used by VINCE is dependent +upon your system configuration, but typically includes the software identified +in the documentation and/or ReadMe files. By using VINCE, You agree to comply +with any and all relevant Third Party Software terms and conditions contained +in any such Third Party Software or separate license file distributed with +such Third Party Software. The parties who own the Third Party Software +("Third Party Licensors") are intended third party beneficiaries to this +License with respect to the terms applicable to their Third Party Software. +Third Party Software licenses only apply to the Third Party Software and not +any other portion of VINCE or VINCE as a whole. + +This material is based upon work funded and supported by the Department of +Homeland Security under Contract No. FA8702-15-D-0002 with Carnegie Mellon +University for the operation of the Software Engineering Institute, a +federally funded research and development center sponsored by the United +States Department of Defense. + +DM21-1126 diff --git a/README.md b/README.md new file mode 100644 index 0000000..f204f09 --- /dev/null +++ b/README.md @@ -0,0 +1,162 @@ +## VINCE + +### Description + +VINCE - The Vulnerability Information and Coordination Environment - Software +designed for multi-party vulnerability coordination. VINCE enables +collaborative and efficient coordination by allowing all involved parties to +tap into a central, web-based platform to communicate directly with one +another about a vulnerability. It is based on the decades of experience with +coordinated vulnerability disclosure (CVD) at the CERT Coordination Center +(CERT/CC) which is a part of the Software Engineering Institute at Carnegie +Mellon University. + +* The CERT Guide to Coordinated Vulnerability Disclosure: [https://vuls.cert.org/confluence/display/CVD](https://vuls.cert.org/confluence/display/CVD) +* Report a Vulnerability [https://www.kb.cert.org/vuls/report/](https://www.kb.cert.org/vuls/report/) +* VINCE User Documentation: [https://vuls.cert.org/confluence/display/VIN/VINCE+Documentation](https://vuls.cert.org/confluence/display/VIN/VINCE+Documentation) +* Vulnerability Note API Documentation: [https://vuls.cert.org/confluence/display/VIN/Vulnerability+Note+API](https://vuls.cert.org/confluence/display/VIN/Vulnerability+Note+API) +* VINCE API Documentation: [https://vuls.cert.org/confluence/display/VIN/VINCE+API](https://vuls.cert.org/confluence/display/VIN/VINCE+API) + +### Bugs and Feature Requests + +You can report a bug, feature request, or other issue in this GitHub project. VINCE users can also send [feedback](https://kb.cert.org/vince/comm/sendmsg/8/) through the Private Message feature. + +### About + +VINCE, a Django application, is designed to run in Amazon Web Services (AWS) +and is developed around many +of AWS services such as Cognito, S3, ElasticBeanstalk, Cloudfront, SQS, SNS, +and SES. VINCE users the python library, +[warrant](https://github.com/capless/warrant), for AWS Cognito +authentication. [Warrant](https://github.com/capless/warrant) has been +slightly modified and is included with VINCE. + +VINCE also uses and includes +the [django-bakery](https://github.com/palewire/django-bakery) project to +generate and publish flat HTML files of vulnerability notes that are served +via an AWS S3 bucket. The +[django-bakery](https://github.com/palewire/django-bakery) project has been +modified to generate the flat files in memory versus using the filesystem. + + +### Local Install + +1. Clone the repo + +2. Create a virtual environment and install requirements +``` +cd bigvince +mkvirtualenv --python=/usr/local/bin/python3.6 bigvince (python3 -m venv env) +source env/bin/activate +pip install -r requirements.txt +``` + +3. Create a postgres database using docker +``` +docker run --name bv-postgres -p 5432:5432 -e POSTGRES_PASSWORD=PASSWORD -d postgres +createdb -h localhost -U postgres bigvince +``` + +3. Alternate (not using docker): +``` +psql postgres +CREATE ROLE vince; +ALTER ROLE vince CREATEDB; +ALTER ROLE "vince" WITH LOGIN; +CREATE DATABASE vincetest; +GRANT ALL PRIVILEGES ON DATABASE vincetest TO vince; +CREATE DATABASE vincecommtest; +GRANT ALL PRIVILEGES ON DATABASE vincecommtest TO vince; +CREATE DATABASE vincepubtest; +GRANT ALL PRIVILEGES ON DATABASE vincepubtest TO vince; +``` + +4. Edit and copy VINCE.env to bigvince\.env with the environment variables needed to run VINCE locally - this includes the database connection string and password for the new database, AWS keys, Google reCAPTCHA keys, etc. +``` +DATABASE_URL=postgres://postgres@127.0.0.1:5432/bigvince +DATABASE_PASSWORD=PASSWORD +``` + +5. Create secret key +``` +python3 -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' +``` +Swap out any "$" characters if they exist. $ characters mess with API key generation. Or continue to regenerate until you get a key without a "$" +Add it to bigvince/.env + + +6. Edit bigvince/settings_.py as needed with your settings. Important settings to pay attention to: + +``` +EMAIL_BACKEND +BUILD_DIR +DEFAULT_FROM_EMAIL +DEFAULT_REPLY_EMAIL +DEFAULT_VISIBLE_NAME +STANDARD_VENDOR_EMAIL +STANDARD_PARTICIPANT_EMAIL +DEFAULT_PHONE_NUMBER +DEFAULT_EMAIL_SIGNATURE +STANDARD_EMAIL_SIGNATURE +WEB_TITLE +ORG_NAME +CONTACT_EMAIL +*_BASE_TEMPLATES +REPORT_IDENTIFIER +CASE_IDENTIFIER +SUPERUSER + +``` + +7. Run migrations +``` +python manage.py migrate +python manage.py migrate --database=vincecomm +python manage.py migrate --database=vincepub +``` + +8. Create a django super user. This will be used to login into the application. + + +It uses the credentials defined in the settings.py SUPERUSER variable. Alternatively +you can use Django's createsuperuser command to set your own username and password. + +NOTE: Skip this step if using cognito auth (the default) +``` +python manage.py createsu +``` + +9. Load initial data: +``` +python manage.py loadinitialdata +``` + +10. Start the development server. (Profit) +``` +python manage.py runserver +``` + +11. Attempt login +12. Set "is_superuser" to "true" for your user in vincecomm and vincetrack databases, auth_user relation. + +## Running tests + +Vince test are stored in vince/tests. To run tests: + +``` +python3 manage.py test vince +``` + +This will create a new database for the tests and will delete it when the tests completes. To speed up tests, you can tell Django to not delete the test DB. + +``` +python3 manage.py test vince -k +``` + +## Fresh deployment reminders + +Remember to give the "vince" group access to all of the Ticket Queues in admin console. + +### AWS Install + +See docs for full AWS configuration \ No newline at end of file diff --git a/api_examples/README.md b/api_examples/README.md new file mode 100644 index 0000000..82f9cf4 --- /dev/null +++ b/api_examples/README.md @@ -0,0 +1,19 @@ +# API Examples +This repo contains select examples about using the [VINCE]( API to generate outputs in different vulnerability reporting formats, such as the [CSAF](https://github.com/oasis-tcs/csaf) Common Vulnerability Reporting Framework (CVRF) and [CVE JSON](https://github.com/CVEProject/automation-working-group/tree/master/cve_json_schema). + +First, generate your API Key in your VINCE profile. For full VINCE API documentation including instructions on generating the key, please see the [VINCE FAQ](https://vuls.cert.org/confluence/display/VIN/API). + +# Sample outputs +sample_get_cases.json : Get all cases for a specific vendor, coordinator, or a participant. +`./get_vince.py > sample_get_cases.json` + +vu-257161-raw.json : Get case VU#257161 in raw VINCE JSON format with all available information. +`./get_vince.py 257161 raw > vu-257161-raw.json` + +cvrf-257161.json : Get case VU#257161 in CVRF format to import into another tool. +`./get_vince.py 257161 cvrf > cvrf-257161.json` + +When prompted, please enter your API key to use the above commands. + + + diff --git a/api_examples/csaf-vu-257161.json b/api_examples/csaf-vu-257161.json new file mode 100644 index 0000000..5c812af --- /dev/null +++ b/api_examples/csaf-vu-257161.json @@ -0,0 +1,918 @@ +{ + "document": { + "acknowledgments": [ + { + "urls": [ + "https://kb.cert.org/vuls/id/257161" + ] + } + ], + "category": "generic_csaf", + "csaf_version": "2.0", + "notes": [ + { + "category": "summary", + "text": "Treck Inc.designs and distributes software for real-time operating systems (RTOS) customers worldwide. Treck's sofware provide essential TCP/IP networking capability to these devices. Security researchers from JSOF have discovered a number of vulnerabilities that can have an impact on devices that have adopted Treck's embedded software to cause unexpected behavior and possibly further exploit these devices for nefarious purposes.", + "title": "Summary" + }, + { + "category": "legal_disclaimer", + "text": "THIS DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS AND DOES NOT IMPLY ANY KIND OF GUARANTEE OR WARRANTY, INCLUDING THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. YOUR USE OF THE INFORMATION ON THE DOCUMENT OR MATERIALS LINKED FROM THE DOCUMENT IS AT YOUR OWN RISK.", + "title": "Legal Disclaimer" + } + ], + "publisher": { + "category": "coordinator", + "contact_details": "Email: cert@cert.org, Phone: +1412 268 5800", + "issuing_authority": "CERT/CC under DHS/CISA https://www.cisa.gov/cybersecurity also see https://kb.cert.org/ ", + "name": "CERT/CC", + "namespace": "https://kb.cert.org/" + }, + "references": [ + { + "summary": "CERT/CC vulnerability disclosure policy", + "url": "https://vuls.cert.org/confluence/display/Wiki/Vulnerability+Disclosure+Policy" + }, + { + "category": "self", + "summary": "CERT/CC document released", + "url": "https://kb.cert.org/vuls/id/257161" + } + ], + "title": "Multiple vulnerabilities in Treck embedded software", + "tracking": { + "current_release_date": "2020-05-19T18:22:00Z", + "generator": { + "engine": { + "name": "VINCE", + "version": "1.30.0" + } + }, + "id": "VU#257161", + "initial_release_date": "2020-05-19T18:22:00Z", + "revision_history": [ + { + "date": "2020-05-19T18:22:00Z", + "number": "1.0.0", + "summary": "Public released after peer review" + } + ], + "status": "final", + "version": "1.0.0" + } + }, + "product_tree": { + "branches": [ + { + "branches": [ + { + "branches": [ + { + "category": "product_version", + "name": "< 6.0.1", + "product": { + "name": "Unknown Multiple vulnerabilities in Treck embedded software < 6.0.1", + "product_id": "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + } + } + ], + "category": "product_name", + "name": "Multiple vulnerabilities in Treck embedded software" + } + ], + "category": "vendor", + "name": "Unknown" + } + ] + }, + "vulnerabilities": [ + { + "cve": "CVE-2020-11904", + "notes": [ + { + "category": "summary", + "text": "Integer Overflow or Wraparound (CWE-190) in Memory Allocation component. An unauthorized network attacker can send a malicious packet that may result in corruption of sensitive information, a crash, or code execution on the target device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "LOW", + "baseScore": 7.3, + "baseSeverity": "HIGH", + "confidentialityImpact": "LOW", + "integrityImpact": "LOW", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has an Integer Overflow during Memory Allocation that causes an Out-of-Bounds Write." + }, + { + "cve": "CVE-2020-11900", + "notes": [ + { + "category": "summary", + "text": "Double Free (CWE-415) in IPv4 tunneling component when handling a packet. An unauthorized network attacker can use malicious packets that could lead to unexpected behavior of memory access that can be used to write or read values in arbitrary memory spaces." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "HIGH", + "baseScore": 8.2, + "baseSeverity": "HIGH", + "confidentialityImpact": "NONE", + "integrityImpact": "LOW", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:H", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.41 has an IPv4 tunneling Double Free." + }, + { + "cve": "CVE-2020-11907", + "notes": [ + { + "category": "summary", + "text": "Improper Handling of Length Parameter Inconsistency (CWE-130) in TCP component. A remote attacker can send a malformed TCP packet that can cause trigger an integer underflow event leading to unexpected behavior of a crash or segmentation fault on the target device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "ADJACENT_NETWORK", + "availabilityImpact": "LOW", + "baseScore": 6.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "LOW", + "integrityImpact": "LOW", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 improperly handles a Length Parameter Inconsistency in TCP." + }, + { + "cve": "CVE-2020-11898", + "notes": [ + { + "category": "summary", + "text": "Improper Handling of Length Parameter Inconsistency (CWE-130) in IPv4/ICMPv4 component. An unauthorized network attacker can send a malicious request that can lead to unintended exposure of sensitive information on the target device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "HIGH", + "baseScore": 9.1, + "baseSeverity": "CRITICAL", + "confidentialityImpact": "HIGH", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 improperly handles an IPv4/ICMPv4 Length Parameter Inconsistency, which might allow remote attackers to trigger an information leak." + }, + { + "cve": "CVE-2020-11903", + "notes": [ + { + "category": "summary", + "text": "Out-of-bounds Read (CWE-125) in DHCP component when handling a packet. A local network attacker can craft a malicious Layer-2 DHCP request that could lead to access of sensitive information on the destination device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "ADJACENT_NETWORK", + "availabilityImpact": "NONE", + "baseScore": 6.5, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "HIGH", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.28 has a DHCP Out-of-bounds Read." + }, + { + "cve": "CVE-2020-11909", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in IPv4 component. A remote attacker can send a malformed IPv4 packet that can cause trigger an integer underflow event leading to unexpected behavior of a crash or segmentation fault on the target\r\ndevice." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "NONE", + "baseScore": 5.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "LOW", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has an IPv4 Integer Underflow." + }, + { + "cve": "CVE-2020-11906", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in Ethernet Link Layer component. A local network attacker can send a malicious Layer-2 Ethernet packet that can cause trigger an integer underflow event leading to unexpected behavior of a crash or segmentation fault on the target device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "ADJACENT_NETWORK", + "availabilityImpact": "LOW", + "baseScore": 6.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "LOW", + "integrityImpact": "LOW", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has an Ethernet Link Layer Integer Underflow." + }, + { + "cve": "CVE-2020-11911", + "notes": [ + { + "category": "summary", + "text": "Improper Access Control (CWE-284) in ICMPv4 component. An unauthorized network attacker can send a malicious packet that can lead to higher privileges in permissions assignment for critical resources on the destination device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "NONE", + "baseScore": 5.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "NONE", + "integrityImpact": "LOW", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has Improper ICMPv4 Access Control." + }, + { + "cve": "CVE-2020-11912", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in TCP component. An unauthorized network attacker can send a malicious packet that may expose data that is present outside the bounds of allocated memory." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "LOW", + "baseScore": 5.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "NONE", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has a TCP Out-of-bounds Read." + }, + { + "cve": "CVE-2020-11896", + "notes": [ + { + "category": "summary", + "text": "Improper Handling of Length Parameter Inconsistency (CWE-130) in IPv4/UDP component. An unauthorized network attacker can send a malicious packet that can be used to inject arbitrary code on the target system." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "HIGH", + "baseScore": 10, + "baseSeverity": "CRITICAL", + "confidentialityImpact": "HIGH", + "integrityImpact": "HIGH", + "privilegesRequired": "NONE", + "scope": "CHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 allows Remote Code Execution, related to IPv4 tunneling." + }, + { + "cve": "CVE-2020-11897", + "notes": [ + { + "category": "summary", + "text": "Improper Handling of Length Parameter Inconsistency (CWE-130) in IPv6 component. An unauthorized network attacker can send a malicious packet that can lead to out of bounds write on the target device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "HIGH", + "baseScore": 10, + "baseSeverity": "CRITICAL", + "confidentialityImpact": "HIGH", + "integrityImpact": "HIGH", + "privilegesRequired": "NONE", + "scope": "CHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 5.0.1.35 has an Out-of-Bounds Write via multiple malformed IPv6 packets." + }, + { + "cve": "CVE-2020-11905", + "notes": [ + { + "category": "summary", + "text": "Out-of-bounds Read (CWE-125) in DHCP component. A local network attacker can send a malicious Layer-2 DHCP packet that could lead to an unintended exposure of sensitive information on the target device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "ADJACENT_NETWORK", + "availabilityImpact": "NONE", + "baseScore": 6.5, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "HIGH", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has a DHCPv6 Out-of-bounds Read." + }, + { + "cve": "CVE-2020-11908", + "notes": [ + { + "category": "summary", + "text": "Improper Null Termination (CWE-170) in DHCP component. A local network attacker can send a malicious Layer-2 DHCP packet that could lead to an unintended exposure of sensitive information on the target device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "ADJACENT_NETWORK", + "availabilityImpact": "LOW", + "baseScore": 4.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "NONE", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 4.7.1.27 mishandles '\\0' termination in DHCP." + }, + { + "cve": "CVE-2020-11913", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in IPv6 component. An unauthorized network attacker can send a malicious packet that may expose data that is present outside the bounds of allocated memory." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "NONE", + "baseScore": 5.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "LOW", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has an IPv6 Out-of-bounds Read." + }, + { + "cve": "CVE-2020-11901", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in DNS resolver component when handling a packet sent. An unauthorized network attacker can inject arbitrary code on the target system using a maliciously crafted packet." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "HIGH", + "attackVector": "NETWORK", + "availabilityImpact": "HIGH", + "baseScore": 9, + "baseSeverity": "CRITICAL", + "confidentialityImpact": "HIGH", + "integrityImpact": "HIGH", + "privilegesRequired": "NONE", + "scope": "CHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 allows Remote Code execution via a single invalid DNS response." + }, + { + "cve": "CVE-2020-11899", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in IPv6 component when handling a packet sent by an unauthorized network attacker. An unauthorized network attacker can send a malicious request that can lead to out of bounds read on the\r\ntarget device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "ADJACENT_NETWORK", + "availabilityImpact": "LOW", + "baseScore": 5.4, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "NONE", + "integrityImpact": "LOW", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has an IPv6 Out-of-bounds Read." + }, + { + "cve": "CVE-2020-11914", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in ARP component. A local network attacker can send a malicious Layer-2 ARP packet that could lead to an unintended exposure of sensitive information on the target device." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "ADJACENT_NETWORK", + "availabilityImpact": "NONE", + "baseScore": 4.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "LOW", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has an ARP Out-of-bounds Read." + }, + { + "cve": "CVE-2020-11902", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in IPv6overIPv4 tunneling component. An unauthorized network attacker can send a malicious packet that may expose data that is present outside the bounds of allocated memory." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "LOW", + "baseScore": 7.3, + "baseSeverity": "HIGH", + "confidentialityImpact": "LOW", + "integrityImpact": "LOW", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has an IPv6OverIPv4 tunneling Out-of-bounds Read." + }, + { + "cve": "CVE-2020-11910", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in ICMPv4 component. An unauthorized network attacker can send a malicious packet that may expose data that is present outside the bounds of allocated memory." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "NONE", + "baseScore": 5.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "LOW", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "The Treck TCP/IP stack before 6.0.1.66 has an ICMPv4 Out-of-bounds Read." + }, + { + "cve": "CVE-2020-8674", + "notes": [ + { + "category": "summary", + "text": "Out-of-bounds Read (CWE-125) in DHCP component. A local network attacker can send a malicious Layer-2 DHCP packet that could lead to an unintended exposure of sensitive information on the target device. This is Intel's version of CVE-2020-11905" + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "NONE", + "baseScore": 5.3, + "baseSeverity": "MEDIUM", + "confidentialityImpact": "LOW", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "Out-of-bounds read in DHCPv6 subsystem in Intel(R) AMT and Intel(R)ISM versions before 11.8.77, 11.12.77, 11.22.77, 12.0.64 and 14.0.33 may allow an unauthenticated user to potentially enable information disclosure via network access." + }, + { + "cve": "CVE-2020-0597", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in IPv6 component when handling a packet sent by an unauthorized network attacker. An unauthorized network attacker can send a malicious request that can lead to out of bounds read on the\r\ntarget device. Intel's specific implementation CVE for CVE-2020-11899" + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "HIGH", + "baseScore": 7.5, + "baseSeverity": "HIGH", + "confidentialityImpact": "NONE", + "integrityImpact": "NONE", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "Out-of-bounds read in IPv6 subsystem in Intel(R) AMT and Intel(R) ISM versions before 14.0.33 may allow an unauthenticated user to potentially enable denial of service via network access." + }, + { + "cve": "CVE-2020-0595", + "notes": [ + { + "category": "summary", + "text": "Double Free (CWE-415) in IPv4 tunneling component when handling a packet. An unauthorized network attacker can use malicious packets that could lead to unexpected behavior of memory access that can be used to write or read values in arbitrary memory spaces. This is Intel's version of CVE-2020-11900" + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "HIGH", + "baseScore": 9.8, + "baseSeverity": "CRITICAL", + "confidentialityImpact": "HIGH", + "integrityImpact": "HIGH", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "Use after free in IPv6 subsystem in Intel(R) AMT and Intel(R) ISM versions before 11.8.77, 11.12.77, 11.22.77 and 12.0.64 may allow an unauthenticated user to potentially enable escalation of privilege via network access." + }, + { + "cve": "CVE-2020-0594", + "notes": [ + { + "category": "summary", + "text": "Improper Input Validation (CWE-20) in IPv6 component when handling a packet sent by an unauthorized network attacker. An unauthorized network attacker can send a malicious request that can lead to out of bounds read on the\r\ntarget device. Intel obtained this CVE for CVE-2020-11899 , specific to their environment." + } + ], + "product_status": { + "known_affected": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + }, + "scores": [ + { + "cvss_v3": { + "attackComplexity": "LOW", + "attackVector": "NETWORK", + "availabilityImpact": "HIGH", + "baseScore": 9.8, + "baseSeverity": "CRITICAL", + "confidentialityImpact": "HIGH", + "integrityImpact": "HIGH", + "privilegesRequired": "NONE", + "scope": "UNCHANGED", + "userInteraction": "NONE", + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", + "version": "3.1" + }, + "products": [ + "CSAFPID-2b689fac-0145-11ec-9bbb-4d755f5d80cb" + ] + } + ], + "title": "Out-of-bounds read in IPv6 subsystem in Intel(R) AMT and Intel(R) ISM versions before 11.8.77, 11.12.77, 11.22.77 and 12.0.64 may allow an unauthenticated user to potentially enable escalation of privilege via network access." + } + ] +} diff --git a/api_examples/csaf_json_schema.json b/api_examples/csaf_json_schema.json new file mode 100644 index 0000000..83f08f3 --- /dev/null +++ b/api_examples/csaf_json_schema.json @@ -0,0 +1,1343 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://docs.oasis-open.org/csaf/csaf/v2.0/csaf_json_schema.json", + "title": "Common Security Advisory Framework", + "description": "Representation of security advisory information as a JSON document.", + "type": "object", + "$defs": { + "acknowledgments_t": { + "title": "List of acknowledgments", + "description": "Contains a list of acknowledgment elements.", + "type": "array", + "minItems": 1, + "items": { + "title": "Acknowledgment", + "description": "Acknowledges contributions by describing those that contributed.", + "type": "object", + "minProperties": 1, + "properties": { + "names": { + "title": "List of acknowledged names", + "description": "Contains the names of entities being recognized.", + "type": "array", + "minItems": 1, + "items": { + "title": "Name of entity being recognized", + "description": "Contains the name of a single person.", + "type": "string", + "minLength": 1, + "examples": [ + "Albert Einstein", + "Johann Sebastian Bach" + ] + } + }, + "organization": { + "title": "Contributing organization", + "description": "Contains the name of a contributing organization being recognized.", + "type": "string", + "minLength": 1, + "examples": [ + "CISA", + "Google Project Zero", + "Talos" + ] + }, + "summary": { + "title": "Summary of the acknowledgment", + "description": "SHOULD represent any contextual details the document producers wish to make known about the acknowledgment or acknowledged parties.", + "type": "string", + "minLength": 1, + "examples": [ + "First analysis of Coordinated Multi-Stream Attack (CMSA)" + ] + }, + "urls": { + "title": "List of URLs", + "description": "Specifies a list of URLs or location of the reference to be acknowledged.", + "type": "array", + "minItems": 1, + "items": { + "title": "URL of acknowledgment", + "description": "Contains the URL or location of the reference to be acknowledged.", + "type": "string", + "format": "uri" + } + } + } + } + }, + "branches_t": { + "title": "List of branches", + "description": "Contains branch elements as children of the current element.", + "type": "array", + "minItems": 1, + "items": { + "title": "Branch", + "description": "Is a part of the hierarchical structure of the product tree.", + "type": "object", + "maxProperties": 3, + "minProperties": 3, + "required": [ + "category", + "name" + ], + "properties": { + "branches": { + "$ref": "#/$defs/branches_t" + }, + "category": { + "title": "Category of the branch", + "description": "Describes the characteristics of the labeled branch.", + "type": "string", + "enum": [ + "architecture", + "host_name", + "language", + "legacy", + "patch_level", + "product_family", + "product_name", + "product_version", + "service_pack", + "specification", + "vendor" + ] + }, + "name": { + "title": "Name of the branch", + "description": "Contains the canonical descriptor or 'friendly name' of the branch.", + "type": "string", + "minLength": 1, + "examples": [ + "10", + "365", + "Microsoft", + "Office", + "PCS 7", + "SIMATIC", + "Siemens", + "Windows" + ] + }, + "product": { + "$ref": "#/$defs/full_product_name_t" + } + } + } + }, + "full_product_name_t": { + "title": "Full product name", + "description": "Specifies information about the product and assigns the product_id.", + "type": "object", + "required": [ + "name", + "product_id" + ], + "properties": { + "name": { + "title": "Textual description of the product", + "description": "The value should be the product’s full canonical name, including version number and other attributes, as it would be used in a human-friendly document.", + "type": "string", + "minLength": 1, + "examples": [ + "Cisco AnyConnect Secure Mobility Client 2.3.185", + "Microsoft Host Integration Server 2006 Service Pack 1" + ] + }, + "product_id": { + "$ref": "#/$defs/product_id_t" + }, + "product_identification_helper": { + "title": "Helper to identify the product", + "description": "Provides at least one method which aids in identifying the product in an asset database.", + "type": "object", + "minProperties": 1, + "properties": { + "cpe": { + "title": "Common Platform Enumeration representation", + "description": "The Common Platform Enumeration (CPE) attribute refers to a method for naming platforms external to this specification.", + "type": "string", + "pattern": "^(cpe:2\\.3:[aho\\*\\-](:(((\\?*|\\*?)([a-zA-Z0-9\\-\\._]|(\\\\[\\\\\\*\\?!\"#\\$%&'\\(\\)\\+,/:;<=>@\\[\\]\\^`\\{\\|\\}~]))+(\\?*|\\*?))|[\\*\\-])){5}(:(([a-zA-Z]{2,3}(-([a-zA-Z]{2}|[0-9]{3}))?)|[\\*\\-]))(:(((\\?*|\\*?)([a-zA-Z0-9\\-\\._]|(\\\\[\\\\\\*\\?!\"#\\$%&'\\(\\)\\+,/:;<=>@\\[\\]\\^`\\{\\|\\}~]))+(\\?*|\\*?))|[\\*\\-])){4})|([c][pP][eE]:/[AHOaho]?(:[A-Za-z0-9\\._\\-~%]*){0,6})$", + "minLength": 5 + }, + "hashes": { + "title": "List of hashes", + "description": "Contains a list of cryptographic hashes usable to identify files.", + "type": "array", + "minItems": 1, + "items": { + "title": "Cryptographic hashes", + "description": "Contains all information to identify a file based on its cryptographic hash values.", + "type": "object", + "required": [ + "file_hashes", + "filename" + ], + "properties": { + "file_hashes": { + "title": "List of file hashes", + "description": "Contains a list of cryptographic hashes for this file.", + "type": "array", + "minItems": 1, + "items": { + "title": "File hash", + "description": "Contains one hash value and algorithm of the file to be identified.", + "type": "object", + "required": [ + "algorithm", + "value" + ], + "properties": { + "algorithm": { + "title": "Algorithm of the cryptographic hash", + "description": "Contains the name of the cryptographic hash algorithm used to calculate the value.", + "type": "string", + "default": "sha256", + "minLength": 1, + "examples": [ + "blake2b512", + "sha256", + "sha3-512", + "sha384", + "sha512" + ] + }, + "value": { + "title": "Value of the cryptographic hash", + "description": "Contains the cryptographic hash value in hexadecimal representation.", + "type": "string", + "minLength": 32, + "pattern": "^[0-9a-fA-F]{32,}$", + "examples": [ + "37df33cb7464da5c7f077f4d56a32bc84987ec1d85b234537c1c1a4d4fc8d09dc29e2e762cb5203677bf849a2855a0283710f1f5fe1d6ce8d5ac85c645d0fcb3", + "4775203615d9534a8bfca96a93dc8b461a489f69124a130d786b42204f3341cc", + "9ea4c8200113d49d26505da0e02e2f49055dc078d1ad7a419b32e291c7afebbb84badfbd46dec42883bea0b2a1fa697c" + ] + } + } + } + }, + "filename": { + "title": "Filename", + "description": "Contains the name of the file which is identified by the hash values.", + "type": "string", + "minLength": 1, + "examples": [ + "WINWORD.EXE", + "msotadddin.dll", + "sudoers.so" + ] + } + } + } + }, + "purl": { + "title": "package URL representation", + "description": "The package URL (purl) attribute refers to a method for reliably identifying and locating software packages external to this specification.", + "type": "string", + "format": "uri", + "pattern": "^pkg:[A-Za-z\\.\\-\\+][A-Za-z0-9\\.\\-\\+]*/.+", + "minLength": 7 + }, + "sbom_urls": { + "title": "List of SBOM URLs", + "description": "Contains a list of URLs where SBOMs for this product can be retrieved.", + "type": "array", + "minItems": 1, + "items": { + "title": "SBOM URL", + "description": "Contains a URL of one SBOM for this product.", + "type": "string", + "format": "uri" + } + }, + "serial_numbers": { + "title": "List of serial numbers", + "description": "Contains a list of parts, or full serial numbers.", + "type": "array", + "minItems": 1, + "items": { + "title": "Serial number", + "description": "Contains a part, or a full serial number of the component to identify.", + "type": "string", + "minLength": 1 + } + }, + "skus": { + "title": "List of stock keeping units", + "description": "Contains a list of parts, or full stock keeping units.", + "type": "array", + "minItems": 1, + "items": { + "title": "Stock keeping unit", + "description": "Contains a part, or a full stock keeping unit (SKU) which is used in the ordering process to identify the component.", + "type": "string", + "minLength": 1 + } + }, + "x_generic_uris": { + "title": "List of generic URIs", + "description": "Contains a list of identifiers which are either vendor-specific or derived from a standard not yet supported.", + "type": "array", + "minItems": 1, + "items": { + "title": "Generic URI", + "description": "Provides a generic extension point for any identifier which is either vendor-specific or derived from a standard not yet supported.", + "type": "object", + "required": [ + "namespace", + "uri" + ], + "properties": { + "namespace": { + "title": "Namespace of the generic URI", + "description": "Refers to a URL which provides the name and knowledge about the specification used or is the namespace in which these values are valid.", + "type": "string", + "format": "uri" + }, + "uri": { + "title": "URI", + "description": "Contains the identifier itself.", + "type": "string", + "format": "uri" + } + } + } + } + } + } + } + }, + "lang_t": { + "title": "Language type", + "description": "Identifies a language, corresponding to IETF BCP 47 / RFC 5646. See IETF language registry: https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry", + "type": "string", + "pattern": "^(([A-Za-z]{2,3}(-[A-Za-z]{3}(-[A-Za-z]{3}){0,2})?|[A-Za-z]{4,8})(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-[A-WY-Za-wy-z0-9](-[A-Za-z0-9]{2,8})+)*(-[Xx](-[A-Za-z0-9]{1,8})+)?|[Xx](-[A-Za-z0-9]{1,8})+|[Ii]-[Dd][Ee][Ff][Aa][Uu][Ll][Tt]|[Ii]-[Mm][Ii][Nn][Gg][Oo])$", + "examples": [ + "de", + "en", + "fr", + "frc", + "jp" + ] + }, + "notes_t": { + "title": "List of notes", + "description": "Contains notes which are specific to the current context.", + "type": "array", + "minItems": 1, + "items": { + "title": "Note", + "description": "Is a place to put all manner of text blobs related to the current context.", + "type": "object", + "required": [ + "category", + "text" + ], + "properties": { + "audience": { + "title": "Audience of note", + "description": "Indicate who is intended to read it.", + "type": "string", + "minLength": 1, + "examples": [ + "all", + "executives", + "operational management and system administrators", + "safety engineers" + ] + }, + "category": { + "title": "Note category", + "description": "Choice of what kind of note this is.", + "type": "string", + "enum": [ + "description", + "details", + "faq", + "general", + "legal_disclaimer", + "other", + "summary" + ] + }, + "text": { + "title": "Note contents", + "description": "The contents of the note. Content varies depending on type.", + "type": "string", + "minLength": 1 + }, + "title": { + "title": "Title of note", + "description": "Provides a concise description of what is contained in the text of the note.", + "type": "string", + "minLength": 1, + "examples": [ + "Details", + "Executive summary", + "Technical summary", + "Impact on safety systems" + ] + } + } + } + }, + "product_group_id_t": { + "title": "Reference token for product group instance", + "description": "Token required to identify a group of products so that it can be referred to from other parts in the document. There is no predefined or required format for the product_group_id as long as it uniquely identifies a group in the context of the current document.", + "type": "string", + "minLength": 1, + "examples": [ + "CSAFGID-0001", + "CSAFGID-0002", + "CSAFGID-0020" + ] + }, + "product_groups_t": { + "title": "List of product_group_ids", + "description": "Specifies a list of product_group_ids to give context to the parent item.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "$ref": "#/$defs/product_group_id_t" + } + }, + "product_id_t": { + "title": "Reference token for product instance", + "description": "Token required to identify a full_product_name so that it can be referred to from other parts in the document. There is no predefined or required format for the product_id as long as it uniquely identifies a product in the context of the current document.", + "type": "string", + "minLength": 1, + "examples": [ + "CSAFPID-0004", + "CSAFPID-0008" + ] + }, + "products_t": { + "title": "List of product_ids", + "description": "Specifies a list of product_ids to give context to the parent item.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "$ref": "#/$defs/product_id_t" + } + }, + "references_t": { + "title": "List of references", + "description": "Holds a list of references.", + "type": "array", + "minItems": 1, + "items": { + "title": "Reference", + "description": "Holds any reference to conferences, papers, advisories, and other resources that are related and considered related to either a surrounding part of or the entire document and to be of value to the document consumer.", + "type": "object", + "required": [ + "summary", + "url" + ], + "properties": { + "category": { + "title": "Category of reference", + "description": "Indicates whether the reference points to the same document or vulnerability in focus (depending on scope) or to an external resource.", + "type": "string", + "default": "external", + "enum": [ + "external", + "self" + ] + }, + "summary": { + "title": "Summary of the reference", + "description": "Indicates what this reference refers to.", + "type": "string", + "minLength": 1 + }, + "url": { + "title": "URL of reference", + "description": "Provides the URL for the reference.", + "type": "string", + "format": "uri" + } + } + } + }, + "version_t": { + "title": "Version", + "description": "Specifies a version string to denote clearly the evolution of the content of the document. Format must be either integer or semantic versioning.", + "type": "string", + "pattern": "^(0|[1-9][0-9]*)$|^((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)$", + "examples": [ + "1", + "4", + "0.9.0", + "1.4.3", + "2.40.0+21AF26D3" + ] + } + }, + "required": [ + "document" + ], + "properties": { + "document": { + "title": "Document level meta-data", + "description": "Captures the meta-data about this document describing a particular set of security advisories.", + "type": "object", + "required": [ + "category", + "csaf_version", + "publisher", + "title", + "tracking" + ], + "properties": { + "acknowledgments": { + "title": "Document acknowledgments", + "description": "Contains a list of acknowledgment elements associated with the whole document.", + "$ref": "#/$defs/acknowledgments_t" + }, + "aggregate_severity": { + "title": "Aggregate severity", + "description": "Is a vehicle that is provided by the document producer to convey the urgency and criticality with which the one or more vulnerabilities reported should be addressed. It is a document-level metric and applied to the document as a whole — not any specific vulnerability. The range of values in this field is defined according to the document producer's policies and procedures.", + "type": "object", + "required": [ + "text" + ], + "properties": { + "namespace": { + "title": "Namespace of aggregate severity", + "description": "Points to the namespace so referenced.", + "type": "string", + "format": "uri" + }, + "text": { + "title": "Text of aggregate severity", + "description": "Provides a severity which is independent of - and in addition to - any other standard metric for determining the impact or severity of a given vulnerability (such as CVSS).", + "type": "string", + "minLength": 1, + "examples": [ + "Critical", + "Important", + "Moderate" + ] + } + } + }, + "category": { + "title": "Document category", + "description": "Defines a short canonical name, chosen by the document producer, which will inform the end user as to the category of document.", + "type": "string", + "minLength": 1, + "examples": [ + "Example Company Security Notice", + "generic_csaf", + "security_advisory", + "vex" + ] + }, + "csaf_version": { + "title": "CSAF version", + "description": "Gives the version of the CSAF specification which the document was generated for.", + "type": "string", + "enum": [ + "2.0" + ] + }, + "distribution": { + "title": "Rules for sharing document", + "description": "Describe any constraints on how this document might be shared.", + "type": "object", + "minProperties": 1, + "properties": { + "text": { + "title": "Textual description", + "description": "Provides a textual description of additional constraints.", + "type": "string", + "minLength": 1, + "examples": [ + "Copyright 2021, Example Company, All Rights Reserved.", + "Distribute freely.", + "Share only on a need-to-know-basis only." + ] + }, + "tlp": { + "title": "Traffic Light Protocol (TLP)", + "description": "Provides details about the TLP classification of the document.", + "type": "object", + "required": [ + "label" + ], + "properties": { + "label": { + "title": "Label of TLP", + "description": "Provides the TLP label of the document.", + "type": "string", + "enum": [ + "AMBER", + "GREEN", + "RED", + "WHITE" + ] + }, + "url": { + "title": "URL of TLP version", + "description": "Provides a URL where to find the textual description of the TLP version which is used in this document. Default is the URL to the definition by FIRST.", + "type": "string", + "default": "https://www.first.org/tlp/", + "format": "uri", + "examples": [ + "https://www.us-cert.gov/tlp", + "https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Kritis/Merkblatt_TLP.pdf" + ] + } + } + } + } + }, + "lang": { + "title": "Document language", + "description": "Identifies the language used by this document, corresponding to IETF BCP 47 / RFC 5646.", + "$ref": "#/$defs/lang_t" + }, + "notes": { + "title": "Document notes", + "description": "Holds notes associated with the whole document.", + "$ref": "#/$defs/notes_t" + }, + "publisher": { + "title": "Publisher", + "description": "Provides information about the publisher of the document.", + "type": "object", + "required": [ + "category", + "name", + "namespace" + ], + "properties": { + "category": { + "title": "Category of publisher", + "description": "Provides information about the category of publisher releasing the document.", + "type": "string", + "enum": [ + "coordinator", + "discoverer", + "other", + "translator", + "user", + "vendor" + ] + }, + "contact_details": { + "title": "Contact details", + "description": "Information on how to contact the publisher, possibly including details such as web sites, email addresses, phone numbers, and postal mail addresses.", + "type": "string", + "minLength": 1, + "examples": [ + "Example Company can be reached at contact_us@example.com, or via our website at https://www.example.com/contact." + ] + }, + "issuing_authority": { + "title": "Issuing authority", + "description": "Provides information about the authority of the issuing party to release the document, in particular, the party's constituency and responsibilities or other obligations.", + "type": "string", + "minLength": 1 + }, + "name": { + "title": "Name of publisher", + "description": "Contains the name of the issuing party.", + "type": "string", + "minLength": 1, + "examples": [ + "BSI", + "Cisco PSIRT", + "Siemens ProductCERT" + ] + }, + "namespace": { + "title": "Namespace of publisher", + "description": "Contains a URL which is under control of the issuing party and can be used as a globally unique identifier for that issuing party.", + "type": "string", + "format": "uri", + "examples": [ + "https://csaf.io", + "https://www.example.com" + ] + } + } + }, + "references": { + "title": "Document references", + "description": "Holds a list of references associated with the whole document.", + "$ref": "#/$defs/references_t" + }, + "source_lang": { + "title": "Source language", + "description": "If this copy of the document is a translation then the value of this property describes from which language this document was translated.", + "$ref": "#/$defs/lang_t" + }, + "title": { + "title": "Title of this document", + "description": "This SHOULD be a canonical name for the document, and sufficiently unique to distinguish it from similar documents.", + "type": "string", + "minLength": 1, + "examples": [ + "Cisco IPv6 Crafted Packet Denial of Service Vulnerability", + "Example Company Cross-Site-Scripting Vulnerability in Example Generator" + ] + }, + "tracking": { + "title": "Tracking", + "description": "Is a container designated to hold all management attributes necessary to track a CSAF document as a whole.", + "type": "object", + "required": [ + "current_release_date", + "id", + "initial_release_date", + "revision_history", + "status", + "version" + ], + "properties": { + "aliases": { + "title": "Aliases", + "description": "Contains a list of alternate names for the same document.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "Alternate name", + "description": "Specifies a non-empty string that represents a distinct optional alternative ID used to refer to the document.", + "type": "string", + "minLength": 1, + "examples": [ + "CVE-2019-12345" + ] + } + }, + "current_release_date": { + "title": "Current release date", + "description": "The date when the current revision of this document was released", + "type": "string", + "format": "date-time" + }, + "generator": { + "title": "Document generator", + "description": "Is a container to hold all elements related to the generation of the document. These items will reference when the document was actually created, including the date it was generated and the entity that generated it.", + "type": "object", + "required": [ + "engine" + ], + "properties": { + "date": { + "title": "Date of document generation", + "description": "This SHOULD be the current date that the document was generated. Because documents are often generated internally by a document producer and exist for a nonzero amount of time before being released, this field MAY be different from the Initial Release Date and Current Release Date.", + "type": "string", + "format": "date-time" + }, + "engine": { + "title": "Engine of document generation", + "description": "Contains information about the engine that generated the CSAF document.", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "title": "Engine name", + "description": "Represents the name of the engine that generated the CSAF document.", + "type": "string", + "minLength": 1, + "examples": [ + "Red Hat rhsa-to-cvrf", + "Secvisogram", + "TVCE" + ] + }, + "version": { + "title": "Engine version", + "description": "Contains the version of the engine that generated the CSAF document.", + "type": "string", + "minLength": 1, + "examples": [ + "0.6.0", + "1.0.0-beta+exp.sha.a1c44f85", + "2" + ] + } + } + } + } + }, + "id": { + "title": "Unique identifier for the document", + "description": "The ID is a simple label that provides for a wide range of numbering values, types, and schemes. Its value SHOULD be assigned and maintained by the original document issuing authority.", + "type": "string", + "minLength": 1, + "examples": [ + "Example Company - 2019-YH3234", + "RHBA-2019:0024", + "cisco-sa-20190513-secureboot" + ] + }, + "initial_release_date": { + "title": "Initial release date", + "description": "The date when this document was first published.", + "type": "string", + "format": "date-time" + }, + "revision_history": { + "title": "Revision history", + "description": "Holds one revision item for each version of the CSAF document, including the initial one.", + "type": "array", + "minItems": 1, + "items": { + "title": "Revision", + "description": "Contains all the information elements required to track the evolution of a CSAF document.", + "type": "object", + "required": [ + "date", + "number", + "summary" + ], + "properties": { + "date": { + "title": "Date of the revision", + "description": "The date of the revision entry", + "type": "string", + "format": "date-time" + }, + "number": { + "$ref": "#/$defs/version_t" + }, + "summary": { + "title": "Summary of the revision", + "description": "Holds a single non-empty string representing a short description of the changes.", + "type": "string", + "minLength": 1, + "examples": [ + "Initial version." + ] + } + } + } + }, + "status": { + "title": "Document status", + "description": "Defines the draft status of the document.", + "type": "string", + "enum": [ + "draft", + "final", + "interim" + ] + }, + "version": { + "$ref": "#/$defs/version_t" + } + } + } + } + }, + "product_tree": { + "title": "Product tree", + "description": "Is a container for all fully qualified product names that can be referenced elsewhere in the document.", + "type": "object", + "minProperties": 1, + "properties": { + "branches": { + "$ref": "#/$defs/branches_t" + }, + "full_product_names": { + "title": "List of full product names", + "description": "Contains a list of full product names.", + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/full_product_name_t" + } + }, + "product_groups": { + "title": "List of product groups", + "description": "Contains a list of product groups.", + "type": "array", + "minItems": 1, + "items": { + "title": "Product group", + "description": "Defines a new logical group of products that can then be referred to in other parts of the document to address a group of products with a single identifier.", + "type": "object", + "required": [ + "group_id", + "product_ids" + ], + "properties": { + "group_id": { + "$ref": "#/$defs/product_group_id_t" + }, + "product_ids": { + "title": "List of Product IDs", + "description": "Lists the product_ids of those products which known as one group in the document.", + "type": "array", + "minItems": 2, + "uniqueItems": true, + "items": { + "$ref": "#/$defs/product_id_t" + } + }, + "summary": { + "title": "Summary of the product group", + "description": "Gives a short, optional description of the group.", + "type": "string", + "minLength": 1, + "examples": [ + "Products supporting Modbus.", + "The x64 versions of the operating system." + ] + } + } + } + }, + "relationships": { + "title": "List of relationships", + "description": "Contains a list of relationships.", + "type": "array", + "minItems": 1, + "items": { + "title": "Relationship", + "description": "Establishes a link between two existing full_product_name_t elements, allowing the document producer to define a combination of two products that form a new full_product_name entry.", + "type": "object", + "required": [ + "category", + "full_product_name", + "product_reference", + "relates_to_product_reference" + ], + "properties": { + "category": { + "title": "Relationship category", + "description": "Defines the category of relationship for the referenced component.", + "type": "string", + "enum": [ + "default_component_of", + "external_component_of", + "installed_on", + "installed_with", + "optional_component_of" + ] + }, + "full_product_name": { + "$ref": "#/$defs/full_product_name_t" + }, + "product_reference": { + "title": "Product reference", + "description": "Holds a Product ID that refers to the Full Product Name element, which is referenced as the first element of the relationship.", + "$ref": "#/$defs/product_id_t" + }, + "relates_to_product_reference": { + "title": "Relates to product reference", + "description": "Holds a Product ID that refers to the Full Product Name element, which is referenced as the second element of the relationship.", + "$ref": "#/$defs/product_id_t" + } + } + } + } + } + }, + "vulnerabilities": { + "title": "Vulnerabilities", + "description": "Represents a list of all relevant vulnerability information items.", + "type": "array", + "minItems": 1, + "items": { + "title": "Vulnerability", + "description": "Is a container for the aggregation of all fields that are related to a single vulnerability in the document.", + "type": "object", + "minProperties": 1, + "properties": { + "acknowledgments": { + "title": "Vulnerability acknowledgments", + "description": "Contains a list of acknowledgment elements associated with this vulnerability item.", + "$ref": "#/$defs/acknowledgments_t" + }, + "cve": { + "title": "CVE", + "description": "Holds the MITRE standard Common Vulnerabilities and Exposures (CVE) tracking number for the vulnerability.", + "type": "string", + "pattern": "^CVE-[0-9]{4}-[0-9]{4,}$" + }, + "cwe": { + "title": "CWE", + "description": "Holds the MITRE standard Common Weakness Enumeration (CWE) for the weakness associated.", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Weakness ID", + "description": "Holds the ID for the weakness associated.", + "type": "string", + "pattern": "^CWE-[1-9]\\d{0,5}$", + "examples": [ + "CWE-22", + "CWE-352", + "CWE-79" + ] + }, + "name": { + "title": "Weakness name", + "description": "Holds the full name of the weakness as given in the CWE specification.", + "type": "string", + "minLength": 1, + "examples": [ + "Cross-Site Request Forgery (CSRF)", + "Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')", + "Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')" + ] + } + } + }, + "discovery_date": { + "title": "Discovery date", + "description": "Holds the date and time the vulnerability was originally discovered.", + "type": "string", + "format": "date-time" + }, + "id": { + "title": "ID", + "description": "Gives the document producer a place to publish a unique label or tracking ID for the vulnerability (if such information exists).", + "type": "object", + "required": [ + "system_name", + "text" + ], + "properties": { + "system_name": { + "title": "System name", + "description": "Indicates the name of the vulnerability tracking or numbering system.", + "type": "string", + "minLength": 1, + "examples": [ + "Cisco Bug ID", + "GitHub Issue" + ] + }, + "text": { + "title": "Text", + "description": "Is unique label or tracking ID for the vulnerability (if such information exists).", + "type": "string", + "minLength": 1, + "examples": [ + "CSCso66472", + "oasis-tcs/csaf#210" + ] + } + } + }, + "involvements": { + "title": "List of involvements", + "description": "Contains a list of involvements.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "title": "Involvement", + "description": "Is a container, that allows the document producers to comment on the level of involvement (or engagement) of themselves or third parties in the vulnerability identification, scoping, and remediation process.", + "type": "object", + "required": [ + "party", + "status" + ], + "properties": { + "date": { + "title": "Date of involvement", + "description": "Holds the date and time of the involvement entry.", + "type": "string", + "format": "date-time" + }, + "party": { + "title": "Party category", + "description": "Defines the category of the involved party.", + "type": "string", + "enum": [ + "coordinator", + "discoverer", + "other", + "user", + "vendor" + ] + }, + "status": { + "title": "Party status", + "description": "Defines contact status of the involved party.", + "type": "string", + "enum": [ + "completed", + "contact_attempted", + "disputed", + "in_progress", + "not_contacted", + "open" + ] + }, + "summary": { + "title": "Summary of the involvement", + "description": "Contains additional context regarding what is going on.", + "type": "string", + "minLength": 1 + } + } + } + }, + "notes": { + "title": "Vulnerability notes", + "description": "Holds notes associated with this vulnerability item.", + "$ref": "#/$defs/notes_t" + }, + "product_status": { + "title": "Product status", + "description": "Contains different lists of product_ids which provide details on the status of the referenced product related to the current vulnerability. ", + "type": "object", + "minProperties": 1, + "properties": { + "first_affected": { + "title": "First affected", + "description": "These are the first versions of the releases known to be affected by the vulnerability.", + "$ref": "#/$defs/products_t" + }, + "first_fixed": { + "title": "First fixed", + "description": "These versions contain the first fix for the vulnerability but may not be the recommended fixed versions.", + "$ref": "#/$defs/products_t" + }, + "fixed": { + "title": "Fixed", + "description": "These versions contain a fix for the vulnerability but may not be the recommended fixed versions.", + "$ref": "#/$defs/products_t" + }, + "known_affected": { + "title": "Known affected", + "description": "These versions are known to be affected by the vulnerability.", + "$ref": "#/$defs/products_t" + }, + "known_not_affected": { + "title": "Known not affected", + "description": "These versions are known not to be affected by the vulnerability.", + "$ref": "#/$defs/products_t" + }, + "last_affected": { + "title": "Last affected", + "description": "These are the last versions in a release train known to be affected by the vulnerability. Subsequently released versions would contain a fix for the vulnerability.", + "$ref": "#/$defs/products_t" + }, + "recommended": { + "title": "Recommended", + "description": "These versions have a fix for the vulnerability and are the vendor-recommended versions for fixing the vulnerability.", + "$ref": "#/$defs/products_t" + }, + "under_investigation": { + "title": "Under investigation", + "description": "It is not known yet whether these versions are or are not affected by the vulnerability. However, it is still under investigation - the result will be provided in a later release of the document.", + "$ref": "#/$defs/products_t" + } + } + }, + "references": { + "title": "Vulnerability references", + "description": "Holds a list of references associated with this vulnerability item.", + "$ref": "#/$defs/references_t" + }, + "release_date": { + "title": "Release date", + "description": "Holds the date and time the vulnerability was originally released into the wild.", + "type": "string", + "format": "date-time" + }, + "remediations": { + "title": "List of remediations", + "description": "Contains a list of remediations.", + "type": "array", + "minItems": 1, + "items": { + "title": "Remediation", + "description": "Specifies details on how to handle (and presumably, fix) a vulnerability.", + "type": "object", + "required": [ + "category", + "details" + ], + "properties": { + "category": { + "title": "Category of the remediation", + "description": "Specifies the category which this remediation belongs to.", + "type": "string", + "enum": [ + "mitigation", + "no_fix_planned", + "none_available", + "vendor_fix", + "workaround" + ] + }, + "date": { + "title": "Date of the remediation", + "description": "Contains the date from which the remediation is available.", + "type": "string", + "format": "date-time" + }, + "details": { + "title": "Details of the remediation", + "description": "Contains a thorough human-readable discussion of the remediation.", + "type": "string", + "minLength": 1 + }, + "entitlements": { + "title": "List of entitlements", + "description": "Contains a list of entitlements.", + "type": "array", + "minItems": 1, + "items": { + "title": "Entitlement of the remediation", + "description": "Contains any possible vendor-defined constraints for obtaining fixed software or hardware that fully resolves the vulnerability.", + "type": "string", + "minLength": 1 + } + }, + "group_ids": { + "$ref": "#/$defs/product_groups_t" + }, + "product_ids": { + "$ref": "#/$defs/products_t" + }, + "restart_required": { + "title": "Restart required by remediation", + "description": "Provides information on category of restart is required by this remediation to become effective.", + "type": "object", + "required": [ + "category" + ], + "properties": { + "category": { + "title": "Category of restart", + "description": "Specifies what category of restart is required by this remediation to become effective.", + "type": "string", + "enum": [ + "connected", + "dependencies", + "machine", + "none", + "parent", + "service", + "system", + "vulnerable_component", + "zone" + ] + }, + "details": { + "title": "Additional restart information", + "description": "Provides additional information for the restart. This can include details on procedures, scope or impact.", + "type": "string", + "minLength": 1 + } + } + }, + "url": { + "title": "URL to the remediation", + "description": "Contains the URL where to obtain the remediation.", + "type": "string", + "format": "uri" + } + } + } + }, + "scores": { + "title": "List of scores", + "description": "contains score objects for the current vulnerability.", + "type": "array", + "minItems": 1, + "items": { + "title": "Score", + "description": "specifies information about (at least one) score of the vulnerability and for which products the given value applies.", + "type": "object", + "minProperties": 2, + "required": [ + "products" + ], + "properties": { + "cvss_v2": { + "$ref": "https://www.first.org/cvss/cvss-v2.0.json" + }, + "cvss_v3": { + "oneOf": [ + { + "$ref": "https://www.first.org/cvss/cvss-v3.0.json" + }, + { + "$ref": "https://www.first.org/cvss/cvss-v3.1.json" + } + ] + }, + "products": { + "$ref": "#/$defs/products_t" + } + } + } + }, + "threats": { + "title": "List of threats", + "description": "Contains information about a vulnerability that can change with time.", + "type": "array", + "minItems": 1, + "items": { + "title": "Threat", + "description": "Contains the vulnerability kinetic information. This information can change as the vulnerability ages and new information becomes available.", + "type": "object", + "required": [ + "category", + "details" + ], + "properties": { + "category": { + "title": "Category of the threat", + "description": "Categorizes the threat according to the rules of the specification.", + "type": "string", + "enum": [ + "exploit_status", + "impact", + "target_set" + ] + }, + "date": { + "title": "Date of the threat", + "description": "Contains the date when the assessment was done or the threat appeared.", + "type": "string", + "format": "date-time" + }, + "details": { + "title": "Details of the threat", + "description": "Represents a thorough human-readable discussion of the threat.", + "type": "string", + "minLength": 1 + }, + "group_ids": { + "$ref": "#/$defs/product_groups_t" + }, + "product_ids": { + "$ref": "#/$defs/products_t" + } + } + } + }, + "title": { + "title": "Title", + "description": "Gives the document producer the ability to apply a canonical name or title to the vulnerability.", + "type": "string", + "minLength": 1 + } + } + } + } + } +} diff --git a/api_examples/get_vince.py b/api_examples/get_vince.py new file mode 100755 index 0000000..10d883e --- /dev/null +++ b/api_examples/get_vince.py @@ -0,0 +1,247 @@ +#!/usr/bin/python3 + +import requests +import json +import sys +import getpass +import argparse +import uuid + +################################################################################### +###################### Python Script to collect VINCE API ######################## +################################################################################### + +### Usage ### + +# To run this script you must have the following: +# use Python 3 +# Python modules requests,json,sys,getpass,argparse + +# Simply run following command in terminal to validate json file against schema: + +# ./get_vince.py [VU# case number] [output_type=cvrf] + + +# ***NOTE*** +# If you do not specify any arguments this code will prompt you for API key +# and will print all your cases in VINCE format. + +################################################################################### +################################################################################### + +def deepcheck(obj,dir): + x = obj + for s in dir.split("."): + if isinstance(x,dict) and s in x: + x = x[s] + elif isinstance(x,list) and int(s) < len(x): + x = x[int(s)] + else: + return None + return x + + +def error_exit(reason): + print(json.dumps({"error":reason})) + sys.exit(1) + +def fatal_exit(ex_cls, ex, tb): + #Send all locals into a error array back to exit + #errors = map(str,locals()) + errors = {"ex_cls":str(ex_cls),"ex":str(ex),"tb":str(tb)} + print(json.dumps({"error":"Program error","info":errors})) + sys.exit(2) + + +def safe_print(st): + print(json.dumps(st)) + + +def create_response(key,turl): + #print + r = requests.get(turl, headers=auth_header, stream=True) + result["debug_"+key] = {"ok":str(r.ok),"headers":dict(r.headers), + "url": turl, + "status_code": str(r.status_code)} + if r.status_code == 200: + result[key] = json.loads(str(r.text)) + +def vince_to_cvrf(vince): + case_id = vince["get_case"]["vuid"] + cvrf = { "document": { + "acknowledgments": [ + { + "urls": [ + "https://kb.cert.org/vuls/id/"+case_id + ] + } + ], + "category": "generic_csaf", + "csaf_version": "2.0", + "notes": [ + { + "category": "summary", + "text": vince["get_case"]["summary"], + "title": "Summary" + }, + { + "category": "legal_disclaimer", + "text": "THIS DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS AND DOES NOT IMPLY ANY KIND OF GUARANTEE OR WARRANTY, INCLUDING THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. YOUR USE OF THE INFORMATION ON THE DOCUMENT OR MATERIALS LINKED FROM THE DOCUMENT IS AT YOUR OWN RISK.", + "title": "Legal Disclaimer" + } + ], + "publisher": { + "category": "coordinator", + "contact_details": "Email: cert@cert.org, Phone: +1412 268 5800", + "issuing_authority": "CERT/CC under DHS/CISA https://www.cisa.gov/cybersecurity also see https://kb.cert.org/ ", + "name": "CERT/CC", + "namespace": "https://kb.cert.org/" + }, + "references": [ + { + "url": "https://vuls.cert.org/confluence/display/Wiki/Vulnerability+Disclosure+Policy", + "summary": "CERT/CC vulnerability disclosure policy" + }, + + { + "summary": "CERT/CC document released", + "category": "self", + "url": "https://kb.cert.org/vuls/id/"+case_id + } + ], + "title": vince["get_case"]["title"], + "tracking": { + "current_release_date": vince["get_case"]["due_date"], + "generator": { + "engine": { + "name": "VINCE", + "version": "1.30.0" + } + }, + "id": "VU#"+case_id, + "initial_release_date": vince["get_case"]["due_date"], + "revision_history": [ + { + "date": vince["get_case"]["due_date"], + "number": "1.0.0", + "summary": "Public released after peer review" + } + ], + "status": "final", + "version": "1.0.0" + } + }} + cvrf["vulnerabilities"] = [] + #map vulnerabilities to csaf + #for now assume a singe product vendor id + product_csafid = "CSAFPID-"+str(uuid.uuid1()) + for k in vince["get_vuls"]: + cve = k["name"].upper() + #We dont have a CVE title in VINCE, so get the first sentence + #to mimic a title per vulnerability. + # @tschmidtb51 also suggested something similar. + #https://github.com/CERTCC/VINCE/issues/17 + short_title = k["description"].split(".")[0]+"." + cvrf["vulnerabilities"].append({ + "title":short_title, + "notes":[{ + "category": "summary", + "text": k["description"] + }], + "cve": cve, + "product_status": { + "known_affected": [ + product_csafid + ] + } + }) + if cve.find("CVE-") > -1: + try: + cve_url = "https://olbat.github.io/nvdcve/"+cve+".json" + resp = requests.get(url=cve_url) + data = resp.json() + cvss_v3_data = deepcheck(data,"impact.baseMetricV3.cvssV3") + cvss_v2_data = deepcheck(data,"impact.baseMetricV2.cvssV2") + cve_title = deepcheck(data,"cve.description.description_data.0.value") + if cve_title: + #replace the title with CVE information + cvrf["vulnerabilities"][-1]["title"] = cve_title + #Add cvss_v3 or cvss_v2 data is available + if cvss_v3_data: + cvrf["vulnerabilities"][-1]["scores"] = [{"cvss_v3": cvss_v3_data, + "products": [product_csafid]}] + elif cvss_v2_data: + cvrf["vulnerabilities"][-1]["scores"] = [{"cvss_v2": cvss_v2_data, + "products": [product_csafid]}] + except: + pass + vendor_name = "Unknown" + if vince["get_original_report"]["vendor_name"]: + vendor_name = vince["get_original_report"]["vendor_name"] + product_name = "Unknown" + if vince["get_original_report"]["product_name"]: + product_name = vince["get_original_report"]["product_name"] + product_version = "1.0.0" + if vince["get_original_report"]["product_version"]: + product_version = vince["get_original_report"]["product_version"] + product_fullname = vendor_name + " " + product_name + " " + product_version + cvrf["product_tree"] = {"branches": [{ + "category": "vendor", + "name": vendor_name, + "branches": [{ + "category": "product_name", + "name": product_name, + "branches": [{ + "category": "product_version", + "name": product_version, + "product": { + "product_id": product_csafid, + "name": product_fullname + } + }] + }] + }]} + return cvrf + + +api_base = "https://kb.cert.org/vince/comm/api" +url_map = { "get_cases": api_base+'/cases/', + "get_case": api_base+"/case/$case/", + "get_posts": api_base+"/case/posts/$case/", + "get_original_report": api_base+"/case/report/$case/", + "get_vendors": api_base+"/case/vendors/$case/", + "get_vuls": api_base+"/case/vuls/$case/"} + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='VINCE API to get Case(s) and '+ + 'convert to output formats') + parser.add_argument('case number', nargs='?', type=str, help='VU#12345',default='') + parser.add_argument('output-type', nargs='?',type=str, help='cvrf',default='cvrf') + args = parser.parse_args() + token = getpass.getpass("Enter API Token:") + auth_header = {"Authorization": "Token {}".format(token)} + result = {} + sys.excepthook = fatal_exit + + if len(sys.argv) > 1: + result["query_info"] = "Getting a specified case data" + result["case"] = sys.argv[1].lower().replace("vu#","") + del url_map['get_cases'] + for k,url in url_map.items(): + url = url.replace("$case",result["case"]) + create_response(k,url) + if len(sys.argv) > 2: + if sys.argv[2].lower() == "cvrf": + #print CVRF data in JSON format + print(json.dumps((vince_to_cvrf(result)))) + else: + print(json.dumps(result)) + sys.exit(0) + else: + result["query_info"] ="Getting all cases " + create_response("get_cases",url_map["get_cases"]) + safe_print(result) + sys.exit(0) + + diff --git a/api_examples/sample_get_cases.json b/api_examples/sample_get_cases.json new file mode 100644 index 0000000..34a4265 --- /dev/null +++ b/api_examples/sample_get_cases.json @@ -0,0 +1,23 @@ +{ + "debug_get_cases": { + "headers": { + "Allow": "GET, HEAD, OPTIONS", + "Content-Type": "application/json", + "Date": "Wed, 16 Sep 2020 18:00:39 GMT", + "Expect-CT": "max-age=0" + }, + "status_code": "200" + }, + "get_cases": [ + { + "created": "2020-05-26T22:16:22.118758Z", + "due_date": "2020-05-18T17:59:42Z", + "status": "Active", + "summary": "Bluetooth Basic Rate / Enhanced Data Rate (BR/EDR) Core Configurations are used for low-power short-range communications. To establish an encrypted connection, two Bluetooth devices must pair with each other using a link key. It is possible for an unauthenticated, adjacent attacker to impersonate a previously paired/bonded device and successfully authenticate without knowing the link key. This could allow an attacker to gain full access to the paired device by performing a Bluetooth Impersonation Attack (BIAS).", + "title": "Bluetooth devices supporting BR/EDR are vulnerable to impersonation attacks", + "vuid": "647177" + } + ], + "query_info": "Getting all cases " +} + diff --git a/api_examples/vu-257161-raw.json b/api_examples/vu-257161-raw.json new file mode 100644 index 0000000..8fe28d1 --- /dev/null +++ b/api_examples/vu-257161-raw.json @@ -0,0 +1,142 @@ +{ + "case": "257161", + "debug_get_case": { + "headers": { + "Allow": "GET, HEAD, OPTIONS", + "Cache-control": "no-store", + "Connection": "keep-alive", + "Content-Length": "617" + }, + "ok": "True", + "status_code": "200", + "url": "https://kb.cert.org/vince/comm/api/case/257161/" + }, + "get_case": { + "created": "2020-06-04T20:31:25.554423Z", + "due_date": "2020-05-19T18:22:00Z", + "status": "Active", + "summary": "Treck Inc.designs and distributes software for real-time operating systems (RTOS) customers worldwide. Treck's sofware provide essential TCP/IP networking capability to these devices. Security researchers from JSOF have discovered a number of vulnerabilities that can have an impact on devices that have adopted Treck's embedded software to cause unexpected behavior and possibly further exploit these devices for nefarious purposes.", + "title": "Multiple vulnerabilities in Treck embedded software", + "vuid": "257161" + }, + "get_original_report": { + "contact_email": null, + "contact_name": null, + "contact_org": null, + "contact_phone": null, + "date_submitted": "2020-06-04T20:33:04.985073Z", + "disclosure_plans": "", + "exploit_references": "", + "product_name": "Multiple vulnerabilities in Treck embedded software", + "product_version": "< 6.0.1", + "public_references": "", + "share_release": true, + "vendor_name": null, + "vul_description": "", + "vul_disclose": true, + "vul_discovery": "", + "vul_exploit": "", + "vul_exploited": true, + "vul_impact": "", + "vul_public": true + }, + "get_vuls": [ + { + "date_added": "2020-06-05T17:08:59.798190Z", + "description": "Integer Overflow or Wraparound (CWE-190) in Memory Allocation component. An unauthorized network attacker can send a malicious packet that may result in corruption of sensitive information, a crash, or code execution on the target device.", + "name": "CVE-2020-11904" + }, + { + "date_added": "2020-06-05T17:06:27.030968Z", + "description": "Double Free (CWE-415) in IPv4 tunneling component when handling a packet. An unauthorized network attacker can use malicious packets that could lead to unexpected behavior of memory access that can be used to write or read values in arbitrary memory spaces.", + "name": "CVE-2020-11900" + }, + { + "date_added": "2020-06-05T17:11:04.587997Z", + "description": "Improper Handling of Length Parameter Inconsistency (CWE-130) in TCP component. A remote attacker can send a malformed TCP packet that can cause trigger an integer underflow event leading to unexpected behavior of a crash or segmentation fault on the target device.", + "name": "CVE-2020-11907" + }, + { + "date_added": "2020-06-05T17:05:01.916661Z", + "description": "Improper Handling of Length Parameter Inconsistency (CWE-130) in IPv4/ICMPv4 component. An unauthorized network attacker can send a malicious request that can lead to unintended exposure of sensitive information on the target device.", + "name": "CVE-2020-11898" + }, + { + "date_added": "2020-06-05T17:08:28.230926Z", + "description": "Out-of-bounds Read (CWE-125) in DHCP component when handling a packet. A local network attacker can craft a malicious Layer-2 DHCP request that could lead to access of sensitive information on the destination device.", + "name": "CVE-2020-11903" + }, + { + "date_added": "2020-06-05T17:12:07.208661Z", + "description": "Improper Input Validation (CWE-20) in IPv4 component. A remote attacker can send a malformed IPv4 packet that can cause trigger an integer underflow event leading to unexpected behavior of a crash or segmentation fault on the target\r\ndevice.", + "name": "CVE-2020-11909" + }, + { + "date_added": "2020-06-05T17:10:21.207114Z", + "description": "Improper Input Validation (CWE-20) in Ethernet Link Layer component. A local network attacker can send a malicious Layer-2 Ethernet packet that can cause trigger an integer underflow event leading to unexpected behavior of a crash or segmentation fault on the target device.", + "name": "CVE-2020-11906" + }, + { + "date_added": "2020-06-05T17:13:10.764243Z", + "description": "Improper Access Control (CWE-284) in ICMPv4 component. An unauthorized network attacker can send a malicious packet that can lead to higher privileges in permissions assignment for critical resources on the destination device.", + "name": "CVE-2020-11911" + }, + { + "date_added": "2020-06-05T17:13:42.090667Z", + "description": "Improper Input Validation (CWE-20) in TCP component. An unauthorized network attacker can send a malicious packet that may expose data that is present outside the bounds of allocated memory.", + "name": "CVE-2020-11912" + }, + { + "date_added": "2020-06-04T20:36:16.321413Z", + "description": "Improper Handling of Length Parameter Inconsistency (CWE-130) in IPv4/UDP component. An unauthorized network attacker can send a malicious packet that can be used to inject arbitrary code on the target system.", + "name": "CVE-2020-11896" + }, + { + "date_added": "2020-06-05T17:04:10.197779Z", + "description": "Improper Handling of Length Parameter Inconsistency (CWE-130) in IPv6 component. An unauthorized network attacker can send a malicious packet that can lead to out of bounds write on the target device.", + "name": "CVE-2020-11897" + }, + { + "date_added": "2020-06-05T17:09:30.095530Z", + "description": "Out-of-bounds Read (CWE-125) in DHCP component. A local network attacker can send a malicious Layer-2 DHCP packet that could lead to an unintended exposure of sensitive information on the target device.", + "name": "CVE-2020-11905" + }, + { + "date_added": "2020-06-05T17:11:37.989488Z", + "description": "Improper Null Termination (CWE-170) in DHCP component. A local network attacker can send a malicious Layer-2 DHCP packet that could lead to an unintended exposure of sensitive information on the target device.", + "name": "CVE-2020-11908" + }, + { + "date_added": "2020-06-05T17:14:06.349799Z", + "description": "Improper Input Validation (CWE-20) in IPv6 component. An unauthorized network attacker can send a malicious packet that may expose data that is present outside the bounds of allocated memory.", + "name": "CVE-2020-11913" + }, + { + "date_added": "2020-06-05T17:07:06.578530Z", + "description": "Improper Input Validation (CWE-20) in DNS resolver component when handling a packet sent. An unauthorized network attacker can inject arbitrary code on the target system using a maliciously crafted packet.", + "name": "CVE-2020-11901" + }, + { + "date_added": "2020-06-05T17:05:45.984192Z", + "description": "Improper Input Validation (CWE-20) in IPv6 component when handling a packet sent by an unauthorized network attacker. An unauthorized network attacker can send a malicious request that can lead to out of bounds read on the\r\ntarget device.", + "name": "CVE-2020-11899" + }, + { + "date_added": "2020-06-05T17:14:42.307068Z", + "description": "Improper Input Validation (CWE-20) in ARP component. A local network attacker can send a malicious Layer-2 ARP packet that could lead to an unintended exposure of sensitive information on the target device.", + "name": "CVE-2020-11914" + }, + { + "date_added": "2020-06-05T17:07:50.805056Z", + "description": "Improper Input Validation (CWE-20) in IPv6overIPv4 tunneling component. An unauthorized network attacker can send a malicious packet that may expose data that is present outside the bounds of allocated memory.", + "name": "CVE-2020-11902" + }, + { + "date_added": "2020-06-05T17:12:39.628929Z", + "description": "Improper Input Validation (CWE-20) in ICMPv4 component. An unauthorized network attacker can send a malicious packet that may expose data that is present outside the bounds of allocated memory.", + "name": "CVE-2020-11910" + } + ], + "query_info": "Getting a specified case data" +} + diff --git a/bakery/LICENSE b/bakery/LICENSE new file mode 100644 index 0000000..a77ee29 --- /dev/null +++ b/bakery/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Los Angeles Times Data Desk + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/bakery/README.md b/bakery/README.md new file mode 100644 index 0000000..929aa37 --- /dev/null +++ b/bakery/README.md @@ -0,0 +1,37 @@ +
+ # # # # #
+ __#_#_#_#_#__
+ {_` ` ` ` ` `_}
+ _{_._._._._._._}_
+ {_ D J A N G O _}
+ _{_._._._._._._._._}_
+ {_ B A K E R Y _}
+ .---{_._._._._._._._._._._}---.
+ ( `"""""""""""""""""""""""` )
+ `~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
+
+A set of helpers for baking your Django site out as flat files
+
+[](https://travis-ci.org/datadesk/django-bakery)
+[](http://badge.fury.io/py/django-bakery)
+[](https://coveralls.io/r/datadesk/django-bakery?branch=master)
+
+* Documentation: [http://django-bakery.rtfd.org](http://django-bakery.rtfd.org)
+* Issues: [https://github.com/datadesk/django-bakery/issues](https://github.com/datadesk/django-bakery/issues)
+* Packaging: [https://pypi.python.org/pypi/django-bakery](https://pypi.python.org/pypi/django-bakery)
+* Testing: [https://travis-ci.org/datadesk/django-bakery](https://travis-ci.org/datadesk/django-bakery)
+* Coverage: [https://coveralls.io/r/datadesk/django-bakery](https://coveralls.io/r/datadesk/django-bakery)
+* The dream, in Powerpoint form: [http://lat.ms/bakery-talk](http://lat.ms/bakery-talk)
+
+Features
+--------
+
+* Models, views and management commands that will build your site as flat files.
+* Management commands to sync your flat files with a bucket on Amazon S3.
+* Optional integration of a Celery job queue to automatically build and publish model objects when they are saved
+
+
+Credits
+-------
+
+ASCII art by Joan Stark
diff --git a/bakery/__init__.py b/bakery/__init__.py
new file mode 100644
index 0000000..0b9de91
--- /dev/null
+++ b/bakery/__init__.py
@@ -0,0 +1,35 @@
+default_app_config = 'bakery.apps.BakeryConfig'
+DEFAULT_GZIP_CONTENT_TYPES = (
+ "application/atom+xml",
+ "application/javascript",
+ "application/json",
+ "application/ld+json",
+ "application/manifest+json",
+ "application/rdf+xml",
+ "application/rss+xml",
+ "application/schema+json",
+ "application/vnd.geo+json",
+ "application/vnd.ms-fontobject",
+ "application/x-font-ttf",
+ "application/x-javascript",
+ "application/x-web-app-manifest+json",
+ "application/xhtml+xml",
+ "application/xml",
+ "font/eot",
+ "font/opentype",
+ "image/bmp",
+ "image/svg+xml",
+ "image/vnd.microsoft.icon",
+ "image/x-icon",
+ "text/cache-manifest",
+ "text/css",
+ "text/html",
+ "text/javascript",
+ "text/plain",
+ "text/vcard",
+ "text/vnd.rim.location.xloc",
+ "text/vtt",
+ "text/x-component",
+ "text/x-cross-domain-policy",
+ "text/xml"
+)
diff --git a/bakery/apps.py b/bakery/apps.py
new file mode 100644
index 0000000..1d576a1
--- /dev/null
+++ b/bakery/apps.py
@@ -0,0 +1,12 @@
+import fs
+import logging
+from django.conf import settings
+from django.apps import AppConfig
+logger = logging.getLogger(__name__)
+
+
+class BakeryConfig(AppConfig):
+ name = 'bakery'
+ verbose_name = "Bakery"
+ filesystem_name = getattr(settings, 'BAKERY_FILESYSTEM', "osfs:///")
+ filesystem = fs.open_fs(filesystem_name)
diff --git a/bakery/feeds.py b/bakery/feeds.py
new file mode 100644
index 0000000..49a5b5b
--- /dev/null
+++ b/bakery/feeds.py
@@ -0,0 +1,74 @@
+import os
+import six
+import logging
+from django.conf import settings
+from bakery.views import BuildableMixin
+from django.contrib.syndication.views import Feed
+logger = logging.getLogger(__name__)
+
+
+class BuildableFeed(Feed, BuildableMixin):
+ """
+ Extends the base Django Feed class to be buildable.
+ """
+ build_path = 'feed.xml'
+
+ def get_content(self, *args, **kwargs):
+ return self(self.request, *args, **kwargs).content
+
+ @property
+ def build_method(self):
+ return self.build_queryset
+
+ def _get_bakery_dynamic_attr(self, attname, obj, args=None, default=None):
+ """
+ Allows subclasses to provide an attribute (say, 'foo') in three
+ different ways: As a fixed class-level property or as a method
+ foo(self) or foo(self, obj). The second argument argument 'obj' is
+ the "subject" of the current Feed invocation. See the Django Feed
+ documentation for details.
+
+ This method was shamelessly stolen from the Feed class and extended
+ with the ability to pass additional arguments to subclass methods.
+ """
+ try:
+ attr = getattr(self, attname)
+ except AttributeError:
+ return default
+
+ if callable(attr) or args:
+ args = args[:] if args else []
+
+ # Check co_argcount rather than try/excepting the function and
+ # catching the TypeError, because something inside the function
+ # may raise the TypeError. This technique is more accurate.
+ try:
+ code = six.get_function_code(attr)
+ except AttributeError:
+ code = six.get_function_code(attr.__call__)
+ if code.co_argcount == 2 + len(args): # one argument is 'self'
+ args.append(obj)
+ return attr(*args)
+
+ return attr
+
+ def get_queryset(self):
+ return [None]
+
+ def build_queryset(self):
+ for obj in self.get_queryset():
+ build_path = self._get_bakery_dynamic_attr('build_path', obj)
+ url = self._get_bakery_dynamic_attr('feed_url', obj)
+
+ logger.debug("Building %s" % build_path)
+
+ self.request = self._get_bakery_dynamic_attr(
+ 'create_request',
+ obj,
+ args=[url or build_path]
+ )
+
+ self.prep_directory(build_path)
+ path = os.path.join(settings.BUILD_DIR, build_path)
+ content = self._get_bakery_dynamic_attr('get_content', obj)
+ self.build_file(path, content)
diff --git a/bakery/management/__init__.py b/bakery/management/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/bakery/management/commands/__init__.py b/bakery/management/commands/__init__.py
new file mode 100644
index 0000000..29e5157
--- /dev/null
+++ b/bakery/management/commands/__init__.py
@@ -0,0 +1,115 @@
+import boto3
+import logging
+from django.conf import settings
+from django.core.management.base import BaseCommand
+logger = logging.getLogger(__name__)
+
+
+def get_s3_client():
+ """
+ A DRY place to make sure AWS credentials in settings override
+ environment based credentials. Boto3 will fall back to:
+ http://boto3.readthedocs.io/en/latest/guide/configuration.html
+ """
+ session_kwargs = {}
+ if hasattr(settings, 'AWS_ACCESS_KEY_ID'):
+ session_kwargs['aws_access_key_id'] = settings.AWS_ACCESS_KEY_ID
+
+ if hasattr(settings, 'AWS_SECRET_ACCESS_KEY'):
+ session_kwargs['aws_secret_access_key'] = settings.AWS_SECRET_ACCESS_KEY
+ boto3.setup_default_session(**session_kwargs)
+
+ s3_kwargs = {}
+ if hasattr(settings, 'AWS_S3_ENDPOINT'):
+ s3_kwargs['endpoint_url'] = settings.AWS_S3_ENDPOINT
+ elif hasattr(settings, 'AWS_S3_HOST'):
+ if hasattr(settings, 'AWS_S3_USE_SSL') and settings.AWS_S3_USE_SSL is False:
+ protocol = "http://"
+ else:
+ protocol = "https://"
+ s3_kwargs['endpoint_url'] = "{}{}".format(
+ protocol,
+ settings.AWS_S3_HOST
+ )
+ if hasattr(settings, "AWS_REGION"):
+ s3_kwargs['region_name'] = settings.AWS_REGION
+ s3_client = boto3.client('s3', **s3_kwargs)
+ s3_resource = boto3.resource('s3', **s3_kwargs)
+ return s3_client, s3_resource
+
+
+def get_bucket_page(page):
+ """
+ Returns all the keys in a s3 bucket paginator page.
+ """
+ key_list = page.get('Contents', [])
+ logger.debug("Retrieving page with {} keys".format(
+ len(key_list),
+ ))
+ return dict((k.get('Key'), k) for k in key_list)
+
+
+def get_all_objects_in_bucket(
+ aws_bucket_name,
+ s3_client=None,
+ max_keys=1000
+):
+ """
+ Little utility method that handles pagination and returns
+ all objects in given bucket.
+ """
+ logger.debug("Retrieving bucket object list")
+
+ if not s3_client:
+ s3_client, s3_resource = get_s3_client()
+
+ obj_dict = {}
+ paginator = s3_client.get_paginator('list_objects')
+ page_iterator = paginator.paginate(Bucket=aws_bucket_name)
+ for page in page_iterator:
+ key_list = page.get('Contents', [])
+ logger.debug("Loading page with {} keys".format(len(key_list)))
+ for obj in key_list:
+ obj_dict[obj.get('Key')] = obj
+ return obj_dict
+
+
+def batch_delete_s3_objects(
+ keys,
+ aws_bucket_name,
+ chunk_size=100,
+ s3_client=None
+):
+ """
+ Utility method that batch deletes objects in given bucket.
+ """
+ if s3_client is None:
+ s3_client, s3_resource = get_s3_client()
+
+ key_chunks = []
+ for i in range(0, len(keys), chunk_size):
+ chunk = []
+ for key in (list(keys)[i:i+100]):
+ chunk.append({'Key': key})
+ key_chunks.append(chunk)
+ for chunk in key_chunks:
+ s3_client.delete_objects(
+ Bucket=aws_bucket_name,
+ Delete={'Objects': chunk}
+ )
+
+
+class BasePublishCommand(BaseCommand):
+ """
+ Base command that exposes these utility methods to the Management
+ Commands that need them.
+ """
+
+ def get_s3_client(self):
+ return get_s3_client()
+
+ def get_all_objects_in_bucket(self, *args, **kwargs):
+ return get_all_objects_in_bucket(*args, **kwargs)
+
+ def batch_delete_s3_objects(self, *args, **kwargs):
+ return batch_delete_s3_objects(*args, **kwargs)
diff --git a/bakery/management/commands/build.py b/bakery/management/commands/build.py
new file mode 100644
index 0000000..a988bfc
--- /dev/null
+++ b/bakery/management/commands/build.py
@@ -0,0 +1,346 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+# Env
+import os
+import sys
+import six
+
+# Files
+import gzip
+import mimetypes
+from bakery import DEFAULT_GZIP_CONTENT_TYPES
+
+# Filesystem
+from fs import path
+from fs import copy
+from django.utils.encoding import smart_text
+
+# Pooling
+import multiprocessing
+from multiprocessing.pool import ThreadPool
+
+# Django tricks
+from django.apps import apps
+from django.conf import settings
+from django.core import management
+try:
+ from django.core.urlresolvers import get_callable
+except ImportError:
+ # Starting with Django 2.0, django.core.urlresolvers does not exist anymore
+ from django.urls import get_callable
+from django.core.management.base import BaseCommand, CommandError
+
+# Logging
+import logging
+logger = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ help = 'Bake out a site as flat files in the build directory'
+ build_unconfig_msg = "Build directory unconfigured. Set BUILD_DIR in settings.py or provide it with --build-dir"
+ views_unconfig_msg = "Bakery views unconfigured. Set BAKERY_VIEWS in settings.py or provide a list as arguments."
+ # regex to match against for gzipping. CSS, JS, JSON, HTML, etc.
+ gzip_file_match = getattr(
+ settings,
+ 'GZIP_CONTENT_TYPES',
+ DEFAULT_GZIP_CONTENT_TYPES
+ )
+
+ def add_arguments(self, parser):
+ parser.add_argument('view_list', nargs='*', type=str, default=[])
+ parser.add_argument(
+ "--build-dir",
+ action="store",
+ dest="build_dir",
+ default='',
+ help="Specify the path of the build directory. \
+Will use settings.BUILD_DIR by default."
+ )
+ parser.add_argument(
+ "--keep-build-dir",
+ action="store_true",
+ dest="keep_build_dir",
+ default=False,
+ help="Skip initializing the build directory before building files."
+ )
+ parser.add_argument(
+ "--skip-static",
+ action="store_true",
+ dest="skip_static",
+ default=False,
+ help="Skip collecting the static files when building."
+ )
+ parser.add_argument(
+ "--skip-media",
+ action="store_true",
+ dest="skip_media",
+ default=False,
+ help="Skip collecting the media files when building."
+ )
+ parser.add_argument(
+ "--pooling",
+ action="store_true",
+ dest="pooling",
+ default=False,
+ help=("Pool builds to run concurrently rather than running them one by one.")
+ )
+
+ def handle(self, *args, **options):
+ """
+ Making it happen.
+ """
+ logger.info("Build started")
+
+ # Set options
+ self.set_options(*args, **options)
+
+ # Get the build directory ready
+ if not options.get("keep_build_dir"):
+ self.init_build_dir()
+
+ # Build up static files
+ if not options.get("skip_static"):
+ self.build_static()
+
+ # Build the media directory
+ if not options.get("skip_media"):
+ self.build_media()
+
+ # Build views
+ self.build_views()
+
+ # Close out
+ logger.info("Build finished")
+
+ def set_options(self, *args, **options):
+ """
+ Configure a few global options before things get going.
+ """
+ self.verbosity = int(options.get('verbosity', 1))
+
+ # Figure out what build directory to use
+ if options.get("build_dir"):
+ self.build_dir = options.get("build_dir")
+ settings.BUILD_DIR = self.build_dir
+ else:
+ if not hasattr(settings, 'BUILD_DIR'):
+ raise CommandError(self.build_unconfig_msg)
+ self.build_dir = settings.BUILD_DIR
+
+ # Get the datatypes right so fs will be happy
+ self.build_dir = smart_text(self.build_dir)
+ self.static_root = smart_text(settings.STATIC_ROOT)
+ self.media_root = smart_text(settings.MEDIA_ROOT)
+
+ # Connect the BUILD_DIR with our filesystem backend
+ self.app = apps.get_app_config("bakery")
+ self.fs = self.app.filesystem
+ self.fs_name = self.app.filesystem_name
+
+ # If the build dir doesn't exist make it
+ if not self.fs.exists(self.build_dir):
+ self.fs.makedirs(self.build_dir)
+
+ # Figure out what views we'll be using
+ if options.get('view_list'):
+ self.view_list = options['view_list']
+ else:
+ if not hasattr(settings, 'BAKERY_VIEWS'):
+ raise CommandError(self.views_unconfig_msg)
+ self.view_list = settings.BAKERY_VIEWS
+
+ # Are we pooling?
+ self.pooling = options.get('pooling')
+
+ def init_build_dir(self):
+ """
+ Clear out the build directory and create a new one.
+ """
+ # Destroy the build directory, if it exists
+ logger.debug("Initializing %s" % self.build_dir)
+ if self.verbosity > 1:
+ self.stdout.write("Initializing build directory")
+ if self.fs.exists(self.build_dir):
+ self.fs.removetree(self.build_dir)
+ # Then recreate it from scratch
+ self.fs.makedirs(self.build_dir)
+
+ def build_static(self, *args, **options):
+ """
+ Builds the static files directory as well as robots.txt and favicon.ico
+ """
+ logger.debug("Building static directory")
+ if self.verbosity > 1:
+ self.stdout.write("Building static directory")
+ management.call_command(
+ "collectstatic",
+ interactive=False,
+ verbosity=0
+ )
+
+ # Set the target directory inside the filesystem.
+ target_dir = path.join(
+ self.build_dir,
+ settings.STATIC_URL.lstrip('/')
+ )
+ target_dir = smart_text(target_dir)
+ if os.path.exists(self.static_root) and settings.STATIC_URL:
+ if getattr(settings, 'BAKERY_GZIP', False):
+ self.copytree_and_gzip(self.static_root, target_dir)
+ # if gzip isn't enabled, just copy the tree straight over
+ else:
+ logger.debug("Copying {}{} to {}{}".format("osfs://", self.static_root, self.fs_name, target_dir))
+ copy.copy_dir("osfs:///", self.static_root, self.fs, target_dir)
+
+ # If they exist in the static directory, copy the robots.txt
+ # and favicon.ico files down to the root so they will work
+ # on the live website.
+ robots_src = path.join(target_dir, 'robots.txt')
+ if self.fs.exists(robots_src):
+ robots_target = path.join(self.build_dir, 'robots.txt')
+ logger.debug("Copying {}{} to {}{}".format(self.fs_name, robots_src, self.fs_name, robots_target))
+ self.fs.copy(robots_src, robots_target)
+
+ favicon_src = path.join(target_dir, 'favicon.ico')
+ if self.fs.exists(favicon_src):
+ favicon_target = path.join(self.build_dir, 'favicon.ico')
+ logger.debug("Copying {}{} to {}{}".format(self.fs_name, favicon_src, self.fs_name, favicon_target))
+ self.fs.copy(favicon_src, favicon_target)
+
+ def build_media(self):
+ """
+ Build the media files.
+ """
+ logger.debug("Building media directory")
+ if self.verbosity > 1:
+ self.stdout.write("Building media directory")
+ if os.path.exists(self.media_root) and settings.MEDIA_URL:
+ target_dir = path.join(self.build_dir, settings.MEDIA_URL.lstrip('/'))
+ logger.debug("Copying {}{} to {}{}".format("osfs://", self.media_root, self.fs_name, target_dir))
+ copy.copy_dir("osfs:///", smart_text(self.media_root), self.fs, smart_text(target_dir))
+
+
+ def get_view_instance(self, view):
+ """
+ Given a view class, get an instance of it.
+ """
+ return view()
+
+ def build_views(self):
+ """
+ Bake out specified buildable views.
+ """
+ # Then loop through and run them all
+ for view_str in self.view_list:
+ logger.debug("Building %s" % view_str)
+ if self.verbosity > 1:
+ self.stdout.write("Building %s" % view_str)
+ view = get_callable(view_str)
+ self.get_view_instance(view).build_method()
+
+ def copytree_and_gzip(self, source_dir, target_dir):
+ """
+ Copies the provided source directory to the provided target directory.
+
+ Gzips JavaScript, CSS and HTML and other files along the way.
+ """
+ # Figure out what we're building...
+ build_list = []
+ # Walk through the source directory...
+ for (dirpath, dirnames, filenames) in os.walk(source_dir):
+ for f in filenames:
+ # Figure out what is going where
+ source_path = os.path.join(dirpath, f)
+ rel_path = os.path.relpath(dirpath, source_dir)
+ target_path = os.path.join(target_dir, rel_path, f)
+ # Add it to our list to build
+ build_list.append((source_path, target_path))
+
+ logger.debug("Gzipping {} files".format(len(build_list)))
+
+ # Build em all
+ if not getattr(self, 'pooling', False):
+ [self.copyfile_and_gzip(*u) for u in build_list]
+ else:
+ cpu_count = multiprocessing.cpu_count()
+ logger.debug("Pooling build on {} CPUs".format(cpu_count))
+ pool = ThreadPool(processes=cpu_count)
+ pool.map(self.pooled_copyfile_and_gzip, build_list)
+
+ def pooled_copyfile_and_gzip(self, payload):
+ """
+ A passthrough for our ThreadPool because it can't take two arguments.
+
+ So all we're doing here is split the list into args for the real function.
+ """
+ self.copyfile_and_gzip(*payload)
+
+ def copyfile_and_gzip(self, source_path, target_path):
+ """
+ Copies the provided file to the provided target directory.
+
+ Gzips JavaScript, CSS and HTML and other files along the way.
+ """
+ # And then where we want to copy it to.
+ target_dir = path.dirname(target_path)
+ if not self.fs.exists(target_dir):
+ try:
+ self.fs.makedirs(target_dir)
+ except OSError:
+ pass
+
+ # determine the mimetype of the file
+ guess = mimetypes.guess_type(source_path)
+ content_type = guess[0]
+ encoding = guess[1]
+
+ # If it isn't a file want to gzip...
+ if content_type not in self.gzip_file_match:
+ # just copy it to the target.
+ logger.debug("Copying {}{} to {}{} because its filetype isn't on the whitelist".format(
+ "osfs://",
+ source_path,
+ self.fs_name,
+ target_path
+ ))
+ copy.copy_file("osfs:///", smart_text(source_path), self.fs, smart_text(target_path))
+
+ # # if the file is already gzipped
+ elif encoding == 'gzip':
+ logger.debug("Copying {}{} to {}{} because it's already gzipped".format(
+ "osfs://",
+ source_path,
+ self.fs_name,
+ target_path
+ ))
+ copy.copy_file("osfs:///", smart_text(source_path), self.fs, smart_text(target_path))
+
+ # If it is one we want to gzip...
+ else:
+ # ... let the world know ...
+ logger.debug("Gzipping {}{} to {}{}".format(
+ "osfs://",
+ source_path,
+ self.fs_name,
+ target_path
+ ))
+ # Open up the source file from the OS
+ with open(source_path, 'rb') as source_file:
+ # Write GZIP data to an in-memory buffer
+ data_buffer = six.BytesIO()
+ kwargs = dict(
+ filename=path.basename(target_path),
+ mode='wb',
+ fileobj=data_buffer
+ )
+ if float(sys.version[:3]) >= 2.7:
+ kwargs['mtime'] = 0
+ with gzip.GzipFile(**kwargs) as f:
+ f.write(six.binary_type(source_file.read()))
+
+ # Write that buffer out to the filesystem
+ with self.fs.open(smart_text(target_path), 'wb') as outfile:
+ outfile.write(data_buffer.getvalue())
+ outfile.close()
diff --git a/bakery/management/commands/buildserver.py b/bakery/management/commands/buildserver.py
new file mode 100644
index 0000000..1b94a88
--- /dev/null
+++ b/bakery/management/commands/buildserver.py
@@ -0,0 +1,11 @@
+from django.test.utils import override_settings
+from django.core.management.commands import runserver
+
+
+class Command(runserver.Command):
+ help = "Starts a variation of Django's runserver designed to serve \
+the static files you've built."
+
+ @override_settings(ROOT_URLCONF='bakery.static_urls')
+ def handle(self, *args, **kwds):
+ runserver.Command.handle(self, *args, **kwds)
diff --git a/bakery/management/commands/publish.py b/bakery/management/commands/publish.py
new file mode 100644
index 0000000..f32e08e
--- /dev/null
+++ b/bakery/management/commands/publish.py
@@ -0,0 +1,478 @@
+import os
+import time
+import hashlib
+import logging
+import mimetypes
+import multiprocessing
+from django.conf import settings
+from multiprocessing.pool import ThreadPool
+from bakery import DEFAULT_GZIP_CONTENT_TYPES
+from bakery.management.commands import (
+ BasePublishCommand,
+ get_s3_client,
+ get_bucket_page
+)
+
+# Filesystem
+import fs
+from fs import path
+from fs import copy
+from fs_s3fs import S3FS
+from fs.copy import copy_file
+from django.utils.encoding import smart_text
+
+from django.apps import apps
+
+try:
+ from django.core.urlresolvers import get_callable
+except ImportError: # Starting with Django 2.0, django.core.urlresolvers does not exist anymore
+ from django.urls import get_callable
+ from django.core.management.base import CommandError
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+class Command(BasePublishCommand):
+ help = "Syncs the build directory with Amazon s3 bucket"
+
+ # Default permissions for the files published to s3
+ DEFAULT_ACL = 'public-read'
+
+ # Error messages we might use below
+ build_missing_msg = "Build directory does not exist. Cannot publish something before you build it."
+ build_unconfig_msg = "Build directory unconfigured. Set BUILD_DIR in settings.py or provide it with --build-dir"
+ bucket_unconfig_msg = "Bucket unconfigured. Set AWS_BUCKET_NAME in settings.py or provide it with --aws-bucket-name"
+ views_unconfig_msg = "Bakery views unconfigured. Set BAKERY_VIEWS in settings.py or provide a list as arguments."
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ "--build-dir",
+ action="store",
+ dest="build_dir",
+ default='',
+ help="Specify the path of the build directory. Will use settings.BUILD_DIR by default."
+ )
+ parser.add_argument(
+ "--aws-bucket-name",
+ action="store",
+ dest="aws_bucket_name",
+ default='',
+ help="Specify the AWS bucket to sync with. Will use settings.AWS_BUCKET_NAME by default."
+ )
+ parser.add_argument(
+ "--aws-bucket-prefix",
+ action="store",
+ dest="aws_bucket_prefix",
+ default='',
+ help="Specify a prefix for the AWS bucket keys to sync with. None by default."
+ )
+ parser.add_argument(
+ "--force",
+ action="store_true",
+ dest="force",
+ default="",
+ help="Force a republish of all items in the build directory"
+ )
+ parser.add_argument(
+ "--dry-run",
+ action="store_true",
+ dest="dry_run",
+ default="",
+ help="Display the output of what would have been uploaded removed, but without actually publishing."
+ )
+ parser.add_argument(
+ "--no-delete",
+ action="store_true",
+ dest="no_delete",
+ default=False,
+ help=("Keep files in S3, even if they do not exist in the build directory.")
+ )
+ parser.add_argument(
+ "--no-pooling",
+ action="store_true",
+ dest="no_pooling",
+ default=False,
+ help=("Run uploads one by one rather than pooling them to run concurrently.")
+ )
+ parser.add_argument(
+ "--s3fs",
+ action="store_true",
+ dest="s3fs",
+ default=False,
+ help=("Use s3fs to do copy, which is required for certain filesystems (like MemoryFS)")
+ )
+
+ def handle(self, *args, **options):
+ """
+ Sync files in the build directory to a specified S3 bucket
+ """
+ # Counts and such we can use to keep tabs on this as they progress
+ self.uploaded_files = 0
+ self.uploaded_file_list = []
+ self.deleted_files = 0
+ self.deleted_file_list = []
+ self.start_time = time.time()
+
+ # Configure all the options we're going to use
+ self.set_options(options)
+
+ # Initialize the boto connection
+ logger.debug("Connecting to s3")
+ if self.verbosity > 2:
+ self.stdout.write("Connecting to s3")
+ self.s3_client, self.s3_resource = get_s3_client()
+
+ # Grab our bucket
+ logger.debug("Retriving bucket {}".format(self.aws_bucket_name))
+ if self.verbosity > 2:
+ self.stdout.write("Retriving bucket {}".format(self.aws_bucket_name))
+ self.bucket = self.s3_resource.Bucket(self.aws_bucket_name)
+
+ # Get a list of all keys in our s3 bucket ...
+ # ...nunless you're this is case where we're blindly pushing
+ if self.force_publish and self.no_delete:
+ self.blind_upload = True
+ logger.debug("Skipping object retrieval. We won't need to because we're blinding uploading everything.")
+ self.s3_obj_dict = {}
+ else:
+ self.blind_upload = False
+ logger.debug("Retrieving objects now published in bucket")
+ if self.verbosity > 2:
+ self.stdout.write("Retrieving objects now published in bucket")
+ self.s3_obj_dict = {}
+ self.s3_obj_dict = self.get_bucket_file_list()
+
+ # Get a list of all the local files in our build directory
+ logger.debug("Retrieving files built locally")
+ if self.verbosity > 2:
+ self.stdout.write("Retrieving files built locally")
+ self.local_file_list = self.get_local_file_list()
+
+ # Sync local files with s3 bucket
+ logger.debug("Syncing local files with bucket")
+ if self.verbosity > 2:
+ self.stdout.write("Syncing local files with bucket")
+ self.sync_with_s3()
+
+ # Delete anything that's left in our keys dict
+ if not self.dry_run and not self.no_delete:
+ self.deleted_file_list = list(self.s3_obj_dict.keys())
+ self.deleted_files = len(self.deleted_file_list)
+ if self.deleted_files:
+ logger.debug("Deleting %s keys" % self.deleted_files)
+ if self.verbosity > 0:
+ self.stdout.write("Deleting %s keys" % self.deleted_files)
+ self.batch_delete_s3_objects(
+ self.deleted_file_list,
+ self.aws_bucket_name
+ )
+
+ # Run any post publish hooks on the views
+ if not hasattr(settings, 'BAKERY_VIEWS'):
+ raise CommandError(self.views_unconfig_msg)
+ for view_str in settings.BAKERY_VIEWS:
+ view = get_callable(view_str)()
+ if hasattr(view, 'post_publish'):
+ getattr(view, 'post_publish')(self.bucket)
+
+ # We're finished, print the final output
+ elapsed_time = time.time() - self.start_time
+ msg = "Publish completed, %d uploaded and %d deleted files in %.2f seconds" % (
+ self.uploaded_files,
+ self.deleted_files,
+ elapsed_time
+ )
+ logger.info(msg)
+ if self.verbosity > 0:
+ self.stdout.write(msg)
+
+ if self.dry_run:
+ logger.info("Publish executed with the --dry-run option. No content was changed on S3.")
+ if self.verbosity > 0:
+ self.stdout.write("Publish executed with the --dry-run option. No content was changed on S3.")
+
+ def set_options(self, options):
+ """
+ Configure all the many options we'll need to make this happen.
+ """
+ self.verbosity = int(options.get('verbosity'))
+
+ # Will we be gzipping?
+ self.gzip = getattr(settings, 'BAKERY_GZIP', False)
+
+ # And if so what content types will we be gzipping?
+ self.gzip_content_types = getattr(
+ settings,
+ 'GZIP_CONTENT_TYPES',
+ DEFAULT_GZIP_CONTENT_TYPES
+ )
+
+ # What ACL (i.e. security permissions) will be giving the files on S3?
+ self.acl = getattr(settings, 'DEFAULT_ACL', self.DEFAULT_ACL)
+
+ # Should we set cache-control headers?
+ self.cache_control = getattr(settings, 'BAKERY_CACHE_CONTROL', {})
+
+ # If the user specifies a build directory...
+ if options.get('build_dir'):
+ # ... validate that it is good.
+ #if not os.path.exists(options.get('build_dir')):
+ # raise CommandError(self.build_missing_msg)
+ # Go ahead and use it
+ self.build_dir = options.get("build_dir")
+ # If the user does not specify a build dir...
+ else:
+ # Check if it is set in settings.py
+ if not hasattr(settings, 'BUILD_DIR'):
+ raise CommandError(self.build_unconfig_msg)
+ # Then make sure it actually exists
+ #if not os.path.exists(settings.BUILD_DIR):
+ # raise CommandError(self.build_missing_msg)
+ # Go ahead and use it
+ self.build_dir = settings.BUILD_DIR
+
+ self.build_dir = smart_text(self.build_dir)
+
+ # Connect the BUILD_DIR with our filesystem backend
+ self.app = apps.get_app_config("bakery")
+ self.fs = self.app.filesystem
+ self.fs_name = self.app.filesystem_name
+
+ # If the build dir doesn't exist make it
+ if not self.fs.exists(self.build_dir):
+ raise CommandError(self.build_missing_msg)
+
+ # If the user provides a bucket name, use that.
+ if options.get("aws_bucket_name"):
+ self.aws_bucket_name = options.get("aws_bucket_name")
+ else:
+ # Otherwise try to find it the settings
+ if not hasattr(settings, 'AWS_BUCKET_NAME'):
+ raise CommandError(self.bucket_unconfig_msg)
+ self.aws_bucket_name = settings.AWS_BUCKET_NAME
+
+ # The bucket prefix, if it exists
+ self.aws_bucket_prefix = options.get("aws_bucket_prefix")
+
+ # If the user sets the --force option
+ if options.get('force'):
+ self.force_publish = True
+ else:
+ self.force_publish = False
+
+ # set the --dry-run option
+ if options.get('dry_run'):
+ self.dry_run = True
+ if self.verbosity > 0:
+ logger.info("Executing with the --dry-run option set.")
+ else:
+ self.dry_run = False
+
+ self.no_delete = options.get('no_delete')
+ self.no_pooling = options.get('no_pooling')
+ self.s3fs = options.get('s3fs')
+
+ def get_bucket_file_list(self):
+ """
+ Little utility method that handles pagination and returns
+ all objects in given bucket.
+ """
+ logger.debug("Retrieving bucket object list")
+
+ paginator = self.s3_client.get_paginator('list_objects')
+ options = {
+ 'Bucket': self.aws_bucket_name
+ }
+ if self.aws_bucket_prefix:
+ logger.debug("Adding prefix {} to bucket list as a filter".format(self.aws_bucket_prefix))
+ options['Prefix'] = self.aws_bucket_prefix
+ page_iterator = paginator.paginate(**options)
+
+ obj_dict = {}
+ for page in page_iterator:
+ obj_dict.update(get_bucket_page(page))
+
+ return obj_dict
+
+ def get_local_file_list(self):
+ """
+ Walk the local build directory and create a list of relative and
+ absolute paths to files.
+ """
+ file_list = []
+ for (dirpath, dirnames, filenames) in self.fs.walk(self.build_dir):
+ for fname in filenames:
+
+ local_key = path.combine(
+ path.frombase(path.abspath(self.build_dir), dirpath),
+ fname.name
+ )
+ local_key = path.relpath(local_key)
+ file_list.append(smart_text(local_key))
+ return file_list
+
+ def sync_with_s3(self):
+ """
+ Walk through our self.local_files list, and match them with the list
+ of keys in the S3 bucket.
+ """
+ # Create a list to put all the files we're going to update
+ self.update_list = []
+
+ # Figure out which files need to be updated and upload all these files
+ logger.debug("Comparing {} local files with {} bucket files".format(
+ len(self.local_file_list),
+ len(self.s3_obj_dict.keys())
+ ))
+ if self.no_pooling:
+ [self.compare_local_file(f) for f in self.local_file_list]
+ else:
+ cpu_count = multiprocessing.cpu_count()
+ logger.debug("Pooling local file comparison on {} CPUs".format(cpu_count))
+ pool = ThreadPool(processes=cpu_count)
+ pool.map(self.compare_local_file, self.local_file_list)
+
+ print("Uploading {} new or updated files to bucket {}".format(len(self.update_list), self.aws_bucket_name))
+ if self.no_pooling:
+ [self.upload_to_s3(*u) for u in self.update_list]
+ else:
+ logger.debug("Pooling s3 uploads on {} CPUs".format(cpu_count))
+ pool = ThreadPool(processes=cpu_count)
+ pool.map(self.pooled_upload_to_s3, self.update_list)
+
+ def get_md5(self, filename):
+ """
+ Returns the md5 checksum of the provided file name.
+ """
+ with self.fs.open(filename, 'rb') as f:
+ m = hashlib.md5(f.read())
+ return m.hexdigest()
+
+ def get_multipart_md5(self, filename, chunk_size=8 * 1024 * 1024):
+ """
+ Returns the md5 checksum of the provided file name after breaking it into chunks.
+
+ This is done to mirror the method used by Amazon S3 after a multipart upload.
+ """
+ # Loop through the file contents ...
+ md5s = []
+ with self.fs.open(filename, 'rb') as fp:
+ while True:
+ # Break it into chunks
+ data = fp.read(chunk_size)
+ # Finish when there are no more
+ if not data:
+ break
+ # Generate a md5 hash for each chunk
+ md5s.append(hashlib.md5(data))
+
+ # Combine the chunks
+ digests = b"".join(m.digest() for m in md5s)
+
+ # Generate a new hash using them
+ new_md5 = hashlib.md5(digests)
+
+ # Create the ETag as Amazon will
+ new_etag = '"%s-%s"' % (new_md5.hexdigest(), len(md5s))
+
+ # Trim it down and pass it back for comparison
+ return new_etag.strip('"').strip("'")
+
+ def compare_local_file(self, file_key):
+ """
+ Compares a local version of a file with what's already published.
+
+ If an update is needed, the file's key is added self.update_list.
+ """
+ # Where is the file?
+ file_path = path.combine(self.build_dir, file_key)
+ #file_path = file_key
+ # If we're in force_publish mode just add it
+ if self.force_publish:
+ self.update_list.append((file_key, file_path))
+ # And quit now
+ return
+
+ # Does it exist in our s3 object list?
+ if file_key in self.s3_obj_dict:
+
+ # Get the md5 stored in Amazon's header
+ s3_md5 = self.s3_obj_dict[file_key].get('ETag').strip('"').strip("'")
+
+ # If there is a multipart ETag on S3, compare that to our local file after its chunked up.
+ # We are presuming this file was uploaded in multiple parts.
+ if "-" in s3_md5:
+ local_md5 = self.get_multipart_md5(file_path)
+ # Other, do it straight for the whole file
+ else:
+ local_md5 = self.get_md5(file_path)
+
+ # If their md5 hexdigests match, do nothing
+ if s3_md5 == local_md5:
+ pass
+ # If they don't match, we want to add it
+ else:
+ logger.debug("{} has changed".format(file_key))
+ self.update_list.append((file_key, file_path))
+
+ # Remove the file from the s3 dict, we don't need it anymore
+ del self.s3_obj_dict[file_key]
+
+ # If the file doesn't exist, queue it for creation
+ else:
+ logger.debug("{} has been added".format(file_key))
+ self.update_list.append((file_key, file_path))
+
+ def pooled_upload_to_s3(self, payload):
+ """
+ A passthrough for our ThreadPool because it can't take two arguments.
+
+ So all we're doing here is split the list into args for the real
+ upload function.
+ """
+ self.upload_to_s3(*payload)
+
+ def upload_to_s3(self, key, filename):
+ """
+ Set the content type and gzip headers if applicable
+ and upload the item to S3
+ """
+ extra_args = {'ACL': self.acl}
+ # determine the mimetype of the file
+ guess = mimetypes.guess_type(filename)
+ content_type = guess[0]
+ encoding = guess[1]
+
+ if content_type:
+ extra_args['ContentType'] = content_type
+
+ # add the gzip headers, if necessary
+ if (self.gzip and content_type in self.gzip_content_types) or encoding == 'gzip':
+ extra_args['ContentEncoding'] = 'gzip'
+
+ # add the cache-control headers if necessary
+ if content_type in self.cache_control:
+ extra_args['CacheControl'] = ''.join((
+ 'max-age=',
+ str(self.cache_control[content_type])
+ ))
+
+ # access and write the contents from the file
+ if not self.dry_run:
+ logger.debug("Uploading %s" % filename)
+ if self.verbosity > 0:
+ self.stdout.write("Uploading %s" % filename)
+ if self.s3fs:
+ s3fs = S3FS(self.aws_bucket_name, upload_args=extra_args)
+ try:
+ copy_file(self.fs, filename, s3fs, key)
+ except fs.errors.ResourceNotFound as e:
+ #s3fs won't make directories if it doesn't exist, so have to do it explicitly
+ s3fs.makedirs(path.dirname(key))
+ copy_file(self.fs, filename, s3fs, key)
+ else:
+ s3_obj = self.s3_resource.Object(self.aws_bucket_name, key)
+ s3_obj.upload_file(filename, ExtraArgs=extra_args)
+ # Update counts
+ self.uploaded_files += 1
+ self.uploaded_file_list.append(filename)
diff --git a/bakery/management/commands/unbuild.py b/bakery/management/commands/unbuild.py
new file mode 100644
index 0000000..daae085
--- /dev/null
+++ b/bakery/management/commands/unbuild.py
@@ -0,0 +1,13 @@
+import os
+import shutil
+from django.conf import settings
+from django.core.management.base import BaseCommand
+
+
+class Command(BaseCommand):
+ help = "Empties the build directory"
+
+ def handle(self, *args, **kwds):
+ if os.path.exists(settings.BUILD_DIR):
+ self.stdout.write("Clearing the build directory\n")
+ shutil.rmtree(settings.BUILD_DIR)
diff --git a/bakery/management/commands/unpublish.py b/bakery/management/commands/unpublish.py
new file mode 100644
index 0000000..75c358f
--- /dev/null
+++ b/bakery/management/commands/unpublish.py
@@ -0,0 +1,36 @@
+import logging
+from django.conf import settings
+from django.core.management.base import CommandError
+from bakery.management.commands import BasePublishCommand
+logger = logging.getLogger(__name__)
+
+
+class Command(BasePublishCommand):
+ help = "Empties the Amazon S3 bucket defined in settings.py"
+ bucket_unconfig_msg = "Bucket unconfigured. Set AWS_BUCKET_NAME in settings.py or provide it with --aws-bucket-name"
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ "--aws-bucket-name",
+ action="store",
+ dest="aws_bucket_name",
+ default='',
+ help="Specify the AWS bucket to sync with. Will use settings.AWS_BUCKET_NAME by default."
+ )
+
+ def handle(self, *args, **options):
+ if options.get("aws_bucket_name"):
+ aws_bucket_name = options.get("aws_bucket_name")
+ else:
+ # Otherwise try to find it the settings
+ if not hasattr(settings, 'AWS_BUCKET_NAME'):
+ raise CommandError(self.bucket_unconfig_msg)
+ aws_bucket_name = settings.AWS_BUCKET_NAME
+
+ # Pull all the keys from the bucket
+ all_objects = self.get_all_objects_in_bucket(aws_bucket_name)
+ keys = all_objects.keys()
+ self.batch_delete_s3_objects(keys, aws_bucket_name)
+
+ # A little logging
+ logger.info("unpublish completed, %d deleted files" % len(keys))
diff --git a/bakery/models.py b/bakery/models.py
new file mode 100644
index 0000000..d32a865
--- /dev/null
+++ b/bakery/models.py
@@ -0,0 +1,186 @@
+"""
+Models that inherit from Django's default and add methods to make it
+convenient for building out flat files.
+
+The magic relies on your view being class-based and having a build_object
+method, like the BuildableDetailView included in this app.
+"""
+from django.db import models
+from django.db import transaction
+
+
+class BuildableModel(models.Model):
+ """
+ An abstract base model for an object that builds out
+ its own detail pages.
+
+ Set `detail_views` to an iterable containing
+ strings which represent your class-based
+ view (which should inherit from BuildableDetailView),
+ then fill out _build_related and _build_extra if need be.
+ """
+ detail_views = []
+
+ def _get_view(self, name):
+ try:
+ from django.core.urlresolvers import get_callable
+ except ImportError: # Starting with Django 2.0, django.core.urlresolvers does not exist anymore
+ from django.urls import get_callable
+ return get_callable(name)
+
+ def _build_related(self):
+ """
+ Builds related content, such as an RSS feed.
+ """
+ pass
+
+ def _build_extra(self):
+ """
+ Build extra content, like copying an image to a thumbnails folder under
+ the media folder.
+ """
+ pass
+
+ def _unbuild_extra(self):
+ """
+ Remove extra content, like deleting an image from a thumbnails folder
+ under the media folder.
+ """
+ pass
+
+ def build(self):
+ """
+ Iterates through the views pointed to by self.detail_views, runs
+ build_object with `self`, and calls _build_extra()
+ and _build_related().
+ """
+ for detail_view in self.detail_views:
+ view = self._get_view(detail_view)
+ view().build_object(self)
+ self._build_extra()
+ self._build_related()
+
+ def unbuild(self):
+ """
+ Iterates through the views pointed to by self.detail_views, runs
+ unbuild_object with `self`, and calls _build_extra()
+ and _build_related().
+ """
+ for detail_view in self.detail_views:
+ view = self._get_view(detail_view)
+ view().unbuild_object(self)
+ self._unbuild_extra()
+ # _build_related again to kill the object from RSS etc.
+ self._build_related()
+
+ def get_absolute_url(self):
+ pass
+
+ class Meta:
+ abstract = True
+
+
+class AutoPublishingBuildableModel(BuildableModel):
+ """
+ Integrates with Celery tasks to automatically publish or unpublish
+ objects when they are saved.
+
+ This is done using an override on the save method that inspects
+ if the object ought to be published, republished or unpublished.
+
+ Requires an indicator of whether the object should been
+ published or unpublished. By default it looks to a BooleanField
+ called ``is_published`` for the answer, but other methods could
+ be employed by overriding the ``get_publication_status`` method.
+ """
+ # The name of the field that this model will inspect to determine
+ # the object's publication status by default.
+ publication_status_field = 'is_published'
+
+ def get_publication_status(self):
+ """
+ Returns a boolean (True or False) indicating whether the object
+ is "live" and ought to be published or not.
+
+ Used to determine whether the save method should seek to publish,
+ republish or unpublish the object when it is saved.
+
+ By default, it looks for a BooleanField with the name defined in
+ the model's 'publication_status_field'.
+
+ If your model uses a CHOICES list of strings or other more complex
+ means to indicate publication status you need to override this method
+ and have it negotiate your object to return either True or False.
+ """
+ return getattr(self, self.publication_status_field)
+
+ def save(self, *args, **kwargs):
+ """
+ A custom save that publishes or unpublishes the object where
+ appropriate.
+
+ Save with keyword argument obj.save(publish=False) to skip the process.
+ """
+ from bakery import tasks
+ from django.contrib.contenttypes.models import ContentType
+ # if obj.save(publish=False) has been passed, we skip everything.
+ if not kwargs.pop('publish', True):
+ super(AutoPublishingBuildableModel, self).save(*args, **kwargs)
+ # Otherwise, for the standard obj.save(), here we go...
+ else:
+ # First figure out if the record is an addition, or an edit of
+ # a preexisting record.
+ try:
+ preexisting = self.__class__.objects.get(pk=self.pk)
+ except self.__class__.DoesNotExist:
+ preexisting = None
+ # If this is an addition...
+ if not preexisting:
+ # We will publish if that's the boolean
+ if self.get_publication_status():
+ action = 'publish'
+ # Otherwise we will do nothing do nothing
+ else:
+ action = None
+ # If this is an edit...
+ else:
+ # If it's being unpublished...
+ if not self.get_publication_status() and \
+ preexisting.get_publication_status():
+ action = 'unpublish'
+ # If it's being published...
+ elif self.get_publication_status():
+ action = 'publish'
+ # If it's remaining unpublished...
+ else:
+ action = None
+ # Now, no matter what, save it normally inside of a dedicated
+ # database transaction so that we are sure that the save will
+ # be complete before we trigger any task
+ with transaction.atomic():
+ super(AutoPublishingBuildableModel, self).save(*args, **kwargs)
+ # Finally, depending on the action, fire off a task
+ ct = ContentType.objects.get_for_model(self.__class__)
+ if action == 'publish':
+ tasks.publish_object.delay(ct.pk, self.pk)
+ elif action == 'unpublish':
+ tasks.unpublish_object.delay(ct.pk, self.pk)
+
+ def delete(self, *args, **kwargs):
+ """
+ Triggers a task that will unpublish the object after it is deleted.
+
+ Save with keyword argument obj.delete(unpublish=False) to skip it.
+ """
+ from bakery import tasks
+ from django.contrib.contenttypes.models import ContentType
+ # if obj.save(unpublish=False) has been passed, we skip the task.
+ unpublish = kwargs.pop('unpublish', True)
+ # Delete it from the database
+ super(AutoPublishingBuildableModel, self).delete(*args, **kwargs)
+ if unpublish:
+ ct = ContentType.objects.get_for_model(self.__class__)
+ tasks.unpublish_object.delay(ct.pk, self.pk)
+
+ class Meta:
+ abstract = True
diff --git a/bakery/requirements.txt b/bakery/requirements.txt
new file mode 100644
index 0000000..0c96a74
--- /dev/null
+++ b/bakery/requirements.txt
@@ -0,0 +1,10 @@
+Django
+six
+flake8
+python-coveralls
+celery
+Sphinx
+moto
+twine
+boto3
+fs
diff --git a/bakery/static_urls.py b/bakery/static_urls.py
new file mode 100644
index 0000000..0841393
--- /dev/null
+++ b/bakery/static_urls.py
@@ -0,0 +1,12 @@
+from django.conf import settings
+from django.conf.urls import url
+from bakery.static_views import serve
+
+
+urlpatterns = [
+ url(r"^(.*)$", serve, {
+ "document_root": settings.BUILD_DIR,
+ 'show_indexes': True,
+ 'default': 'index.html'
+ }),
+]
diff --git a/bakery/static_views.py b/bakery/static_views.py
new file mode 100644
index 0000000..77fd1b1
--- /dev/null
+++ b/bakery/static_views.py
@@ -0,0 +1,159 @@
+"""
+Views and functions for serving static files. These are only to be used
+during development, and SHOULD NOT be used in a production setting.
+"""
+import django
+import mimetypes
+import os
+import posixpath
+import re
+import stat
+from six.moves.urllib.parse import unquote
+from django.template import loader
+from django.http import Http404, HttpResponse, HttpResponseRedirect
+from django.http import HttpResponseNotModified
+from django.template import Template, Context, TemplateDoesNotExist
+from django.utils.http import http_date, parse_http_date
+
+
+def serve(request, path, document_root=None, show_indexes=False, default=''):
+ """
+ Serve static files below a given point in the directory structure.
+
+ To use, put a URL pattern such as::
+
+ (r'^(?PPlease check your email {% if email %}to {{ email }}{% endif %} for a verification code.
+If you don't receive an email, please make sure you've entered the correct address, + and check your spam folder.
+Still didn't get the code? Resend it
+ + + +{% endblock %} + + + diff --git a/cogauth/templates/cogauth/account_confirmed.html b/cogauth/templates/cogauth/account_confirmed.html new file mode 100644 index 0000000..14d3e3f --- /dev/null +++ b/cogauth/templates/cogauth/account_confirmed.html @@ -0,0 +1,18 @@ +{% extends "vince/login.html" %} + +{% load i18n static %} + +{% block content_title %}If you typed in the wrong code by mistake, please try again.
+Otherwise, please email {{ CONTACT_EMAIL }} for assistance
+ +{% endblock %} + + diff --git a/cogauth/templates/cogauth/base.html b/cogauth/templates/cogauth/base.html new file mode 100644 index 0000000..267b5f0 --- /dev/null +++ b/cogauth/templates/cogauth/base.html @@ -0,0 +1,81 @@ + + + + + + + + + + +You must change your password before logging in. +
+Uh Oh!
+An error occurred when trying to verify your account: Attempt limit exceeded, please try after some time.
+ + +{% endblock %} + + + diff --git a/cogauth/templates/cogauth/login.html b/cogauth/templates/cogauth/login.html new file mode 100644 index 0000000..e1a4d8b --- /dev/null +++ b/cogauth/templates/cogauth/login.html @@ -0,0 +1,68 @@ +{% extends "vince/login.html" %} +{% load i18n static %} + +{% block extrahead %} + +{% if token_login %} + +{% endif %} +{% endblock %} + +{% block content %} + +{% if form.non_field_errors %} +{% for error in form.non_field_errors %} ++ You are authenticated as {{ user.username }}. Go to my dashboard or login as a different user. +
+ {% endif %} + + + + +If you lost your multi-factor authentication (MFA) device, you will need to contact us at {{ CONTACT_EMAIL }} to reset your account.
+ + + +{% endblock %} + + diff --git a/cogauth/templates/cogauth/logout.html b/cogauth/templates/cogauth/logout.html new file mode 100644 index 0000000..84db136 --- /dev/null +++ b/cogauth/templates/cogauth/logout.html @@ -0,0 +1,27 @@ +{% extends "vince/login.html" %} +{% load i18n static %} + +{% block extrahead %} + +{% if token_login %} + +{% endif %} +{% endblock %} + +{% block content_title %}+ {% trans "See you again soon." %} +
+Your account is secured using multi-factor authentication (MFA). + To finish signing in, turn on or view your MFA device and type the authentication code below. +
+Friendly device name: {{ device }}
+{% trans 'Your password was changed.' %}
++ Your password has been set. You may go ahead and sign in now. +
+{% endblock %} + + +{% block footer %} + + + + +{% endblock %} diff --git a/cogauth/templates/cogauth/password_reset_confirm.html b/cogauth/templates/cogauth/password_reset_confirm.html new file mode 100644 index 0000000..f5d1a08 --- /dev/null +++ b/cogauth/templates/cogauth/password_reset_confirm.html @@ -0,0 +1,54 @@ +{% extends "martie/base_site.html" %} + +{% load i18n static %} + +{% block extrastyle %}{{ block.super }} + + +{{ form.media }} +{% endblock %} + +{% block bodyclass %}{{ block.super }}login{% endblock %} + +{% block content_title %}+ The password reset link was invalid, possibly because it has already been used. + Please request a new password reset. +
+ {% endif %} +{% endblock %} + + +{% block footer %} + + + + +{% endblock %} diff --git a/cogauth/templates/cogauth/password_reset_done.html b/cogauth/templates/cogauth/password_reset_done.html new file mode 100644 index 0000000..ae7ff9b --- /dev/null +++ b/cogauth/templates/cogauth/password_reset_done.html @@ -0,0 +1,44 @@ +{% extends "martie/base_site.html" %} + +{% load i18n static %} + +{% block extrastyle %}{{ block.super }} + + +{{ form.media }} +{% endblock %} + +{% block bodyclass %}{{ block.super }}login{% endblock %} + +{% block content_title %}+ We've emailed you instructions for setting your password, if an account exists with the email you entered. + You should receive them shortly. +
++ If you don't receive an email, please make sure you've entered the address you registered with, + and check your spam folder. +
+ + +{% endblock %} + + +{% block footer %} + + + + +{% endblock %} + diff --git a/cogauth/templates/cogauth/password_reset_email.html b/cogauth/templates/cogauth/password_reset_email.html new file mode 100644 index 0000000..8a1ce45 --- /dev/null +++ b/cogauth/templates/cogauth/password_reset_email.html @@ -0,0 +1,14 @@ +{% autoescape off %} +To initiate the password reset process for your {{ user.get_username }} MARTIE Account, +click the link below: + +{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} + +If clicking the link above doesn't work, please copy and paste the URL in a new browser +window instead. + +Sincerely, +The Data Integration Team +We <3 MARTIE + +{% endautoescape %} diff --git a/cogauth/templates/cogauth/password_reset_subject.html b/cogauth/templates/cogauth/password_reset_subject.html new file mode 100644 index 0000000..0fad30c --- /dev/null +++ b/cogauth/templates/cogauth/password_reset_subject.html @@ -0,0 +1 @@ +MARTIE password reset diff --git a/cogauth/templates/cogauth/profile.html b/cogauth/templates/cogauth/profile.html new file mode 100644 index 0000000..202b01c --- /dev/null +++ b/cogauth/templates/cogauth/profile.html @@ -0,0 +1,102 @@ +{% extends VINCECOMM_BASE_TEMPLATE %} +{% load i18n static %} +{% block js %} +{{ block.super }} + +{% endblock %} +{% block title %}VINCE Profile{% endblock %} + +{% block content %} +First Name: | +{{ user.first_name }} | +
Last Name: | +{{ user.last_name }} | +
Email: | +{{ user.email }} | +
Country: | +{{ coguser.country }} | +
Timezone: | +{{ coguser.timezone }} | +
Preferred Display Name: | +{{ coguser.preferred_username }} | +
Company/Affiliation: | +{{ coguser.org }} | +
Title: | +{{ coguser.title }} | +
Vendor Groups: | +{{ my_groups }} | +
Other Groups: | +{{ other_groups }} | +
Multi-factor Authentication (MFA) | +{% if coguser.mfa %}{{ coguser.mfa|mfafilter }} {% else %}{% endif %} | +
MFA Preference | +{{ mfa_pref }} | +
API Key | +{% if coguser.api_key %}ENABLED{% endif %} | +
+ Your password has been reset. You may now login. +
+ Login + +{% endblock %} + + + diff --git a/cogauth/templates/cogauth/pwreset.html b/cogauth/templates/cogauth/pwreset.html new file mode 100644 index 0000000..108e0c4 --- /dev/null +++ b/cogauth/templates/cogauth/pwreset.html @@ -0,0 +1,23 @@ +{% extends "vince/login.html" %} + +{% load i18n static %} + + +{% block content_title %}Use your VINCE username (case-sensitive) to reset your password or Login
+ +{% endblock %} + + diff --git a/cogauth/templates/cogauth/resend.html b/cogauth/templates/cogauth/resend.html new file mode 100644 index 0000000..4752d88 --- /dev/null +++ b/cogauth/templates/cogauth/resend.html @@ -0,0 +1,22 @@ +{% extends "vince/login.html" %} + +{% load i18n static %} + +{% block content_title %}Use your VINCE username to resend the confirmation code or Login
+ +{% endblock %} + diff --git a/cogauth/templates/cogauth/reset_password.html b/cogauth/templates/cogauth/reset_password.html new file mode 100644 index 0000000..618e039 --- /dev/null +++ b/cogauth/templates/cogauth/reset_password.html @@ -0,0 +1,36 @@ +{% extends "vince/login.html" %} + +{% load i18n static %} + +{% block content_title %}+ Please check your email for a verification code. +
++ If you don't receive an email, please make sure you've entered the correct address, + and check your spam folder. +
+Password Requirements: +
We recommend time-based, one-time password (TOTP) as a more reliable option than SMS for MFA. Use TOTP.
+Please enter the phone number of the device where we should send the authorization code.
+ +Please scan the QR Code or enter the following secret key into any TOTP-generator, such as Google Authenticator, Duo, or LastPass Authenticator. If you are re-associating your app with VINCE, you may be required to remove the VINCE token in your app.
+ {% qr_from_text qrtext %} +{{ secretcode }}
+Once you have added the secret key into the app of your choice, it will generate a temporary password. Please enter the temporary password below. Optionally, you may also add a friendly device name to remind you later of the application you used. +
+Username: {{ request.user.username }}
+Email: {{ request.user.email }}
+First Name: {{ request.user.first_name }}
+Last Name: {{ request.user.last_name }}
+ID Token: {{ request.session.ID_TOKEN}}
+Access Token: {{ request.session.ACCESS_TOKEN }}
+Refresh Token: {{ request.session.REFRESH_TOKEN }}
+API Key: {{ request.session.API_KEY }}
+API Key ID: {{ request.session.API_KEY_ID }}
+{% endblock %} diff --git a/cogauth/templates/cogauth/verify_email.html b/cogauth/templates/cogauth/verify_email.html new file mode 100644 index 0000000..da9acd4 --- /dev/null +++ b/cogauth/templates/cogauth/verify_email.html @@ -0,0 +1,28 @@ +{% extends "vince/login.html" %} + +{% block extrahead %} +{% endblock %} + +{% load i18n static %} + +{% block content_title %}It looks like we haven't yet verified your email.
++ Please check your email to {{ email }} for a verification code. +
++ If you don't receive an email, please check your spam folder or contact {{ CONTACT_EMAIL }} to confirm that we have the correct email on file. +
+ + + +{% endblock %} + + + diff --git a/cogauth/templates/cogauth/verify_phone.html b/cogauth/templates/cogauth/verify_phone.html new file mode 100644 index 0000000..ee0c563 --- /dev/null +++ b/cogauth/templates/cogauth/verify_phone.html @@ -0,0 +1,25 @@ +{% extends "vince/login.html" %} + +{% block extrahead %} +{% endblock %} + +{% load i18n static %} + +{% block content_title %}
+ Please verify your phone number by entering the code that was just sent to you.
+ Codes are only valid for 3 minutes.
+
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} ({{ ticket.title }}) for {{ ticket.submitter_email }} has been {% if ticket.assigned_to %}assigned to {{ ticket.assigned_to }}{% else %}unassigned{% endif %}.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {% if ticket.assigned_to %}{{ ticket.assigned_to }}{% else %}Unassigned{% endif %}
\r\nView Online to update this ticket (login required)
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} ({{ ticket.title }}) for {{ ticket.submitter_email }} has been assigned to you.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: YOU
\r\nView Online to update this ticket (login required)
Hello,
\r\n\r\nTicket {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, assigned to {{ ticket.get_assigned_to }}{% endif %} has been closed.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {{ ticket.get_assigned_to }}
\r\nView Online to update this ticket (login required)
Just for reference, the original ticket description was:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
The resolution provided was:
\r\n\r\n{{ resolution }}\r\n\r\n
If you wish to view this ticket online, you can visit {{ ticket.staff_url }}.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.776Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 4, + "fields": { + "template_name": "closed_owner", + "subject": "(Closed)", + "heading": "Ticket Closed", + "plain_text": "Hello,\r\n\r\nThe following ticket, which is currently assigned to you, has been closed.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nQueue: {{ queue.title }}\r\nTitle: {{ ticket.title }}\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriority: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nAssigned to: {{ ticket.get_assigned_to }}\r\nView Online: {{ ticket.staff_url }} (login required)\r\n\r\nIf you wish to view this ticket online, you can visit {{ ticket.staff_url }}.\r\n\r\n", + "html": "Hello,
\r\n\r\nThe following ticket, which is currently assigned to you, has been closed.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {{ ticket.get_assigned_to }}
\r\nView Online to update this ticket (login required)
Just for reference, the original ticket description was:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
The resolution provided was:
\r\n\r\n{{ ticket.resolution }}", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.779Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 5, + "fields": { + "template_name": "closed_submitter", + "subject": "(Closed)", + "heading": "Ticket Closed", + "plain_text": "Hello,\r\n\r\nYou recently logged a ticket with a subject of \"{{ ticket.title }}\" with us. This e-mail is to confirm that this ticket has been closed.\r\n\r\nIf you believe that further work is required on this ticket, please let us know by replying to this e-mail and keeping the subject intact.\r\n\r\nIf you wish to view this ticket online, you can visit {{ ticket.ticket_url }}.\r\n\r\nThe resolution provided was:\r\n\r\n{{ ticket.resolution }}\r\n\r\n", + "html": "
Hello,
\r\n\r\nYou recently logged a ticket with a subject of {{ ticket.title }} with us. This e-mail is to confirm that this ticket has been closed.
\r\n\r\nThe resolution that has been provided is:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
If you wish to view this ticket online, you can visit {{ ticket.ticket_url }}. If you believe that further work is required on this ticket, please let us know by replying to this e-mail and keeping the subject intact.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.782Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 6, + "fields": { + "template_name": "escalated_cc", + "subject": "(Escalated)", + "heading": "Ticket Escalated", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") has been escalated automatically.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nQueue: {{ queue.title }}\r\nTitle: {{ ticket.title }}\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriority: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nAssigned to: {{ ticket.get_assigned_to }}\r\nView Online: {{ ticket.staff_url }} (login required)\r\n\r\nThe original ticket description was:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} ('{{ ticket.title }}') has been escalated automatically.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {{ ticket.get_assigned_to }}
\r\nView Online to update this ticket (login required)
Just for reference, the original ticket description was:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.785Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 7, + "fields": { + "template_name": "escalated_submitter", + "subject": "(Escalated)", + "heading": "Your Ticket Has Been Escalated", + "plain_text": "Hello,\r\n\r\nYou recently logged a ticket with a subject of \"{{ ticket.title }}\" with us. This e-mail is to advise you of an automated escalation of that ticket as it has been open for longer than expected.\r\n\r\nWe will review your ticket shortly and attempt to provide a resolution as soon as possible.\r\n\r\nIf you wish to view this ticket online, you can visit {{ ticket.ticket_url }}.\r\n\r\n", + "html": "
Hello,
\r\n\r\nYou recently logged a ticket with a subject of {{ ticket.title }} with us. This e-mail is to advise you of an automated escalation of that ticket as it has been open for longer than expected.
\r\n\r\nWe will review your ticket shortly and attempt to provide a resolution as soon as possible.
\r\n\r\nIf you wish to view this ticket online, you can visit {{ ticket.ticket_url }}.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.788Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 8, + "fields": { + "template_name": "escalated_owner", + "subject": "(Escalated)", + "heading": "Ticket Assigned to You Has Been Escalated", + "plain_text": "Hello,\r\n\r\nA ticket currently assigned to you has been automatically escalated as it has been open for longer than expected.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nQueue: {{ queue.title }}\r\nTitle: {{ ticket.title }}\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriority: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nAssigned to: {{ ticket.get_assigned_to }}\r\nView Online: {{ ticket.staff_url }} (login required)\r\n\r\nThe original ticket description was:\r\n\r\n{{ ticket.description }}\r\n\r\nPlease review this ticket and attempt to provide a resolution as soon as possible.\r\n\r\n", + "html": "Hello,
\r\n\r\nA ticket currently assigned to you has been automatically escalated as it has been open for longer than expected.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {{ ticket.get_assigned_to }}
\r\nView Online to update this ticket (login required)
Just for reference, the original ticket description was:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.790Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 9, + "fields": { + "template_name": "newticket_cc", + "subject": "(Opened)", + "heading": "New Ticket Opened", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that a new ticket has been opened.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nQueue: {{ queue.title }}\r\nTitle: {{ ticket.title }}\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nStatus: {{ ticket.get_status }}\r\n\r\nView Online: {{ ticket.staff_url }} (login required)", + "html": "
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that a new ticket has been opened.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nStatus: {{ ticket.get_status }}
\r\n
\r\nView Online to update this ticket (login required)
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that we have received your vince.query with a subject of {{ ticket.title }}.
\r\n\r\nYou do not have to do anything further at this stage. Your ticket has been assigned a number of {{ ticket.ticket }} and will be responded to shortly.
\r\n\r\nIf you wish to send us further details, or if you have any queries about this ticket, please include the ticket id of {{ ticket.ticket }} in the subject. The easiest way to do this is just press \"reply\" to this message.
\r\n\r\nIf you wish to view this ticket online to provide further information, attach files or view recent updates, you can visit {{ ticket.ticket_url }}.
\r\n\r\nWe will investigate your query and attempt to resolve it as soon as possible. You will receive further updates and a resolution via this e-mail address.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.795Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 11, + "fields": { + "template_name": "resolved_cc", + "subject": "(Resolved)", + "heading": "Ticket Resolved", + "plain_text": "Hello,\r\n\r\nThe following ticket has been resolved:\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nQueue: {{ queue.title }}\r\nTitle: {{ ticket.title }}\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriority: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nAssigned to: {{ ticket.get_assigned_to }}\r\nView Online: {{ ticket.staff_url }} (login required)\r\n\r\nThe original ticket description was:\r\n\r\n{{ ticket.description }}\r\n\r\nThe resolution provided was:\r\n\r\n{{ ticket.resolution }}\r\n\r\nThis resolution has been e-mailed to the submitter, who will verify it before you can close this ticket.\r\n\r\n", + "html": "Hello,
\r\n\r\nThe following ticket has been resolved.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {{ ticket.get_assigned_to }}
\r\nView Online to update this ticket (login required)
Just for reference, the original ticket description was:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
The resolution that was added was:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
This resolution has been e-mailed to the submitter, who will verify it before you can close this ticket.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.798Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 12, + "fields": { + "template_name": "resolved_owner", + "subject": "(Resolved)", + "heading": "Ticket Resolved", + "plain_text": "Hello,\r\n\r\nA ticket currently assigned to you has been resolved.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nQueue: {{ queue.title }}\r\nTitle: {{ ticket.title }}\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriority: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nAssigned to: {{ ticket.get_assigned_to }}\r\nView Online: {{ ticket.staff_url }} (login required)\r\n\r\nThe original ticket description was:\r\n\r\n{{ ticket.description }}\r\n\r\nThe resolution provided was:\r\n\r\n{{ ticket.resolution }}\r\n\r\nThis resolution has been e-mailed to the submitter, who will verify it before you can close this ticket.\r\n\r\n", + "html": "Hello,
\r\n\r\nA ticket currently assigned to you has been resolved.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {{ ticket.get_assigned_to }}
\r\nView Online to update this ticket (login required)
Just for reference, the original ticket description was:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
The resolution that was added was:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
This resolution has been e-mailed to the submitter, who will verify it before you can close this ticket.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.801Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 13, + "fields": { + "template_name": "resolved_submitter", + "subject": "(Resolved)", + "heading": "Your Ticket Has Been Resolved", + "plain_text": "Hello,\r\n\r\nYou recently logged a ticket with a subject of \"{{ ticket.title }}\" with us. This e-mail is to advise you of a resolution to that ticket.\r\n\r\nThe following resolution was added to ticket {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\nCan you please confirm that this resolution addresses your needs so we may close this ticket? If you have any further queries, or if you do not believe this resolution is adequate, please reply to this e-mail and keep the subject intact.\r\n\r\nIf you wish to view this ticket online, you can visit {{ ticket.ticket_url }}\r\n\r\n", + "html": "Hello,
\r\n\r\nYou recently logged a ticket with a subject of {{ ticket.title }} with us. This e-mail is to advise you of a resolution to that ticket.
\r\n\r\nThe following resolution was added to ticket {{ ticket.ticket }}:
\r\n\r\n{{ resolution }}\r\n\r\n
Can you please confirm that this resolution addresses your needs so we may close this ticket? If you have any further queries, or if you do not believe this resolution is adequate, please reply to this e-mail and keep the subject intact.
\r\n\r\nIf you wish to view this ticket online, you can visit {{ ticket.ticket_url }}.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.804Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 14, + "fields": { + "template_name": "updated_cc", + "subject": "(Updated)", + "heading": "Ticket Updated", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") {% if ticket.submitter_email %}for {{ ticket.submitter_email }} {% endif %}has been updated.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nQueue: {{ queue.title }}\r\nTitle: {{ ticket.title }}\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriority: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nAssigned to: {{ ticket.get_assigned_to }}\r\nView Online: {{ ticket.staff_url }} (login required)\r\nIf you wish to view this ticket online, you can visit {{ ticket.staff_url }}.", + "html": "Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") {% if ticket.submitter_email %}for {{ ticket.submitter_email }}{% endif %} has been updated.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {{ ticket.get_assigned_to }}
\r\nView Online to update this ticket (login required)
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") for {{ ticket.submitter_email }}, which is assigned to you, has been updated.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nQueue: {{ queue.title }}
\r\nTitle: {{ ticket.title }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriority: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nAssigned to: {{ ticket.get_assigned_to }}
\r\nView Online to update this ticket (login required)
Just for reference, the original ticket description was:
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.810Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 16, + "fields": { + "template_name": "updated_submitter", + "subject": "(Updated)", + "heading": "Your Ticket Has Been Updated", + "plain_text": "Hello,\r\n\r\nYou recently logged a ticket with a subject of \"{{ ticket.title }}\" with us. This e-mail is to advise you of an update to that ticket.\r\n\r\nThe following comment was added to ticket {{ ticket.ticket }}:\r\n\r\n{{ comment }}\r\n\r\nIf you need to provide us with further information, please reply to this e-mail and keep the subject intact. Alternatively, you can view and update this ticket online by visiting {{ ticket.ticket_url }}\r\n\r\n", + "html": "Hello,
\r\n\r\nYou recently logged a ticket with a subject of {{ ticket.title }} with us. This e-mail is to advise you of an update to that ticket.
\r\n\r\nThe following comment was added to ticket {{ ticket.ticket }}:
\r\n\r\n{{ comment }}\r\n\r\n
If you need to provide us with further information, please reply to this e-mail and keep the subject intact. Alternatively, you can view and update this ticket online by visiting {{ ticket.ticket_url }}.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.812Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 17, + "fields": { + "template_name": "assigned_cc", + "subject": " ", + "heading": "\u0417\u0430\u044f\u0432\u043a\u0430", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430\u044f\u0432\u043a\u0430, {{ ticket.ticket }} (\"{{ ticket.title }}\") \u043e\u0442 {{ ticket.submitter_email }}, \u0431\u044b\u043b\u0430 {% if ticket.assigned_to %} \u043f\u0440\u0438\u043d\u044f\u0442\u0430 {{ ticket.assigned_to }}{% else %} \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0430 {% endif %}.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }}\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430\u044f\u0432\u043a\u0430 {{ ticket.ticket }} ({{ ticket.title }}) \u043e\u0442 {{ ticket.submitter_email }} \u0431\u044b\u043b\u0430 {% if ticket.assigned_to %}\u043f\u0440\u0438\u043d\u044f\u0442\u0430 {{ ticket.assigned_to }}{% else %}\u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0430{% endif %}.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 :
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.815Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 18, + "fields": { + "template_name": "assigned_owner", + "subject": " ", + "heading": "\u0412\u0430\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430\u044f\u0432\u043a\u0430 {{ ticket.ticket }} (\"{{ ticket.title }}\") \u043e\u0442 {{ ticket.submitter_email }} \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u0430 \u0412\u0430\u043c.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: \u0412\u0410\u041c\r\n\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d: {{ ticket.staff_url }}\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}", + "html": "
\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430\u044f\u0432\u043a\u0430 {{ ticket.ticket }} ({{ ticket.title }}) \u043e\u0442 {{ ticket.submitter_email }} \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430 \u0412\u0430\u043c.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: \u0412\u0410\u041c
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u044f\u0432\u043a\u0438:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.818Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 19, + "fields": { + "template_name": "closed_cc", + "subject": " ", + "heading": "\u0417\u0430\u044f\u0432\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0417\u0430\u044f\u0432\u043a\u0430 {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u0430\u044f {{ ticket.assigned_to }}{% endif %} \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }} (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}\r\n\r\n\u0411\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:\r\n\r\n{{ resolution }}", + "html": "
\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0417\u0430\u044f\u0432\u043a\u0430 {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u0430\u044f {{ ticket.get_assigned_to }}{% endif %} \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 to \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u0411\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:
\r\n\r\n{{ resolution }}\r\n\r\n
\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 {{ ticket.staff_url }}.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.820Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 20, + "fields": { + "template_name": "closed_owner", + "subject": " ", + "heading": "\u0417\u0430\u044f\u0432\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430", + "plain_text": "Hello,\r\n\r\n\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u044f\u0432\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430 \u0412\u0430\u043c, \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }} (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438)\r\n\r\n\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 {{ ticket.staff_url }}.\r\n\r\n", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u044f\u0432\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430 \u0412\u0430\u043c, \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u041e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u0411\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:
\r\n\r\n{{ ticket.resolution }}", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.822Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 21, + "fields": { + "template_name": "closed_submitter", + "subject": " ", + "heading": "\u0417\u0430\u044f\u0432\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0412\u0430\u043c\u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 \"{{ ticket.title }}\" \u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0430\u0448\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430\r\n\r\n\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u043d\u0430\u043c \u043e\u0431 \u044d\u0442\u043e\u043c, \u043e\u0442\u0432\u0435\u0442\u0438\u0432 \u043d\u0430 \u044d\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u043e.\r\n\r\n\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 {{ ticket.ticket_url }}.\r\n\r\n\u0411\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:\r\n\r\n{{ ticket.resolution }}", + "html": "
\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0412\u0430\u043c\u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430{{ ticket.title }} \u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0430\u0448\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430.
\r\n\r\n\u0411\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 {{ ticket.ticket_url }}. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u043d\u0430\u043c \u043e\u0431 \u044d\u0442\u043e\u043c, \u043e\u0442\u0432\u0435\u0442\u0438\u0432 \u043d\u0430 \u044d\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u043e.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.824Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 22, + "fields": { + "template_name": "escalated_cc", + "subject": " ", + "heading": "\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0437\u0430\u044f\u0432\u043a\u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0437\u0430\u044f\u0432\u043a\u0438 {{ ticket.ticket }} (\"{{ ticket.title }}\") \u0431\u044b\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }} (login required)\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0437\u0430\u044f\u0432\u043a\u0438 {{ ticket.ticket }} (\"{{ ticket.title }}\")\u0431\u044b\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 :
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.827Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 23, + "fields": { + "template_name": "escalated_owner", + "subject": " ", + "heading": "\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u043e\u0439 \u0412\u0430\u043c \u0437\u0430\u044f\u0432\u043a\u0438 \u0431\u044b\u043b \u043f\u043e\u0432\u044b\u0448\u0435\u043d", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0437\u0430\u044f\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430 \u0412\u0430\u043c, \u0431\u044b\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u0410\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }} (\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}\r\n\r\n\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0437\u0430\u044f\u0432\u043a\u0443 \u0438 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.", + "html": "
\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0437\u0430\u044f\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430 \u0412\u0430\u043c, \u0431\u044b\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u044f\u0432\u043a\u0438:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.830Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 24, + "fields": { + "template_name": "escalated_submitter", + "subject": " ", + "heading": "\u041f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u0412\u0430\u0448\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0438", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0442\u0435,\r\n\r\n\u0412\u0430\u043c\u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 \"{{ ticket.title }}\" \u0421\u043e\u0432\u0435\u0442\u0443\u0435\u043c \u0412\u0430\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u044d\u0442\u043e\u0439 \u0437\u0430\u044f\u0432\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c.\r\n\r\n\u0412\u0441\u043a\u043e\u0440\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0430\u0448\u0443 \u0437\u0430\u044f\u0432\u043a\u0443 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.\r\n\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 {{ ticket.ticket_url }}.", + "html": "
\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0412\u0430\u043c\u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 {{ ticket.title }} \u0421\u043e\u0432\u0435\u0442\u0443\u0435\u043c \u0412\u0430\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u044d\u0442\u043e\u0439 \u0437\u0430\u044f\u0432\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c.
\r\n\r\n\u0412\u0441\u043a\u043e\u0440\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0430\u0448\u0443 \u0437\u0430\u044f\u0432\u043a\u0443 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.
\r\n\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435{{ ticket.ticket_url }}.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.833Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 25, + "fields": { + "template_name": "newticket_cc", + "subject": " ", + "heading": "\u041f\u043e\u0434\u0430\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u044f\u0432\u043a\u0430", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u044b\u043b\u0430 \u043f\u043e\u0434\u0430\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u044f\u0432\u043a\u0430.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }} (login required)\r\n\r\n\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n{{ ticket.description }}\r\n", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u044b\u043b\u0430 \u043f\u043e\u0434\u0430\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u044f\u0432\u043a\u0430
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.836Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 26, + "fields": { + "template_name": "newticket_submitter", + "subject": " ", + "heading": "\u0412\u0430\u0448\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0412\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0442\u0435\u043c\u0443 \"{{ ticket.title }}\". \r\n\r\n\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0412\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u0412\u0430\u0448\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0435 \u0431\u044b\u043b \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d \u043d\u043e\u043c\u0435\u0440 {{ ticket.ticket }}\u0438 \u0432\u0441\u043a\u043e\u0440\u0435 \u0412\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d.\r\n\r\n\u0415\u0441\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043d\u0430\u043c \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0443 \u0412\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u044f\u0432\u043a\u0438, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 id \u0437\u0430\u044f\u0432\u043a\u0438 \"{{ ticket.ticket }}\" \u0432 \u0442\u0435\u043c\u0435 \u043f\u0438\u0441\u044c\u043c\u0430. \u041b\u0435\u0433\u0447\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0436\u0430\u0432 \"\u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c\".\r\n\r\n\u0415\u0441\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0430\u044f\u0432\u043a\u0443 \u043e\u043d\u043b\u0430\u0439\u043d, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u0435. {{ ticket.ticket_url }}.\r\n\r\n\u041c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0412\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0412\u0430\u0441 \u0432 \u043a\u0443\u0440\u0441\u0435 \u0434\u0435\u043b\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043f\u0438\u0441\u044c\u043c\u0430 \u0441 \u044d\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430.", + "html": "
\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0412\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0442\u0435\u043c\u0443 {{ ticket.title }}.
\r\n\r\n\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0412\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u0412\u0430\u0448\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0435 \u0431\u044b\u043b \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d \u043d\u043e\u043c\u0435\u0440 {{ ticket.ticket }} \u0438 \u0432\u0441\u043a\u043e\u0440\u0435 \u0412\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d.
\r\n\r\n\u0415\u0441\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043d\u0430\u043c \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0443 \u0412\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u044f\u0432\u043a\u0438, \u043fo\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 id \u0437\u0430\u044f\u0432\u043a\u0438 {{ ticket.ticket }} \u0432 \u0442\u0435\u043c\u0435 \u043f\u0438\u0441\u044c\u043c\u0430. \u041b\u0435\u0433\u0447\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0436\u0430\u0432 \"\u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c\".
\r\n\r\n\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0430\u044f\u0432\u043a\u0443 \u043e\u043d\u043b\u0430\u0439\u043d, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u0435. {{ ticket.ticket_url }}.
\r\n\r\n\u041c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0412\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0412\u0430\u0441 \u0432 \u043a\u0443\u0440\u0441\u0435 \u0434\u0435\u043b\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043f\u0438\u0441\u044c\u043c\u0430 \u0441 \u044d\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.838Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 27, + "fields": { + "template_name": "resolved_cc", + "subject": " ", + "heading": "\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0411\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0435:\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }} (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}\r\n\r\n\u0411\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:\r\n\r\n{{ ticket.resolution }}\r\n\r\n\u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0443 \u0437\u0430\u044f\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0435\u0433\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0412\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u044f\u0432\u043a\u0443.", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0411\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0435.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u0411\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
\u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0443 \u0437\u0430\u044f\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0435\u0433\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0412\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u044f\u0432\u043a\u0443.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.840Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 28, + "fields": { + "template_name": "resolved_owner", + "subject": " ", + "heading": "\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0411\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u043e\u0439 \u0412\u0430\u043c \u0437\u0430\u044f\u0432\u043a\u0435.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }} (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}\r\n\r\n\u0411\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:\r\n\r\n{{ ticket.resolution }}\r\n\r\n\u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0443 \u0437\u0430\u044f\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0435\u0433\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0412\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u044f\u0432\u043a\u0443.", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0411\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u043e\u0439 \u0412\u0430\u043c \u0437\u0430\u044f\u0432\u043a\u0435.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u043e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u0411\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
\u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0443 \u0437\u0430\u044f\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0435\u0433\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0412\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u044f\u0432\u043a\u0443.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.844Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 29, + "fields": { + "template_name": "resolved_submitter", + "subject": " ", + "heading": "\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0430\u044f \u0432 \u0412\u0430\u0448\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0435 \u0431\u044b\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0430.", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0412\u0430\u043c\u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 \"{{ ticket.title }}\" \u0412 \u044d\u0442\u043e\u043c \u043f\u0438\u0441\u044c\u043c\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0412\u0430\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \r\n\r\n\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u043a \u0437\u0430\u044f\u0432\u043a\u0435 {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\n\u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0412\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u0412\u0430\u043c \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u044f\u0432\u043a\u0443? \u0415\u0441\u043b\u0438 \u0443 \u0412\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438\u043b\u0438 \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u043e.\r\n\r\n\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 {{ ticket.ticket_url }}.", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0412\u0430\u043c\u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 {{ ticket.title }} \u0412 \u044d\u0442\u043e\u043c \u043f\u0438\u0441\u044c\u043c\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0412\u0430\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.
\r\n\r\n\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043a \u0437\u0430\u044f\u0432\u043a\u0435 {{ ticket.ticket }}:
\r\n\r\n{{ resolution }}\r\n\r\n
\u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0412\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u0412\u0430\u043c \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u044f\u0432\u043a\u0443? \u0415\u0441\u043b\u0438 \u0443 \u0412\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438\u043b\u0438 \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u043e.
\r\n\r\n\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435{{ ticket.ticket_url }}.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.846Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 30, + "fields": { + "template_name": "updated_cc", + "subject": " ", + "heading": "\u0417\u0430\u044f\u0432\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u043e \u0437\u0430\u044f\u0432\u043a\u0430 {{ ticket.ticket }} (\"{{ ticket.title }}\") \u043e\u0442 {{ ticket.submitter_email }} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d: {{ ticket.staff_url }} (login required)\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}\r\n\r\n\u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439:\r\n\r\n{{ comment }}\r\n\r\n\u042d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f {% if private %}\u043d\u0435 {% endif %} \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0430\u0442\u0443been e-mailed to the submitter.\r\n\r\n\u0415\u0441\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0430\u044f\u0432\u043a\u0443 \u043e\u043d\u043b\u0430\u0439\u043d, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u0435{{ ticket.staff_url }}.", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430\u044f\u0432\u043a\u0430{{ ticket.ticket }} (\"{{ ticket.title }}\") \u043e\u0442 {{ ticket.submitter_email }} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u041e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439:
\r\n\r\n{{ comment }}\r\n\r\n
\u042d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f {% if private %}\u043d\u0435{% endif %} \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430 \u043d\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0439 \u044f\u0449\u0438\u043a \u0430\u0432\u0442\u043e\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.849Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 31, + "fields": { + "template_name": "updated_owner", + "subject": " ", + "heading": "\u0417\u0430\u044f\u0432\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043a \u0437\u0430\u044f\u0432\u043a\u0435 {{ ticket.ticket }} (\"{{ ticket.title }}\") \u043e\u0442 {{ ticket.submitter_email }}, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u0430 \u0412\u0430\u043c, \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439.\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}\r\n\u041f\u0440\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435: {{ ticket.staff_url }} (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)\r\n\r\n\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\r\n\r\n{{ ticket.description }}\r\n\r\n\u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439:\r\n\r\n{{ comment }}\r\n\r\n\u042d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f {% if private %}\u043d\u0435 {% endif %} \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430 \u043d\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0439 \u044f\u0449\u0438\u043a \u0430\u0432\u0442\u043e\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438.\r\n\r\n\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u0435 {{ ticket.staff_url }}.", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u0412\u0430\u0441 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043a \u0437\u0430\u044f\u0432\u043a\u0435 {{ ticket.ticket }} (\"{{ ticket.title }}\") \u043e\u0442 {{ ticket.submitter_email }}, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u0430 \u0412\u0430\u043c, \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439.
\r\n\r\n\r\nID \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.ticket }}
\r\n\u041e\u0447\u0435\u0440\u0435\u0434\u044c: {{ queue.title }}
\r\n\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: {{ ticket.title }}
\r\n\u0421\u043e\u0437\u0434\u0430\u043d\u0430: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u0410\u0432\u0442\u043e\u0440 \u0437\u0430\u044f\u0432\u043a\u0438: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442: {{ ticket.get_priority_display }}
\r\n\u0421\u0442\u0430\u0442\u0443\u0441: {{ ticket.get_status }}
\r\n\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430: {{ ticket.get_assigned_to }}
\r\n\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)
\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439:
\r\n\r\n{{ comment }}\r\n\r\n
\u042d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f{% if private %}\u043d\u0435 {% endif %}\u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0439 \u044f\u0449\u0438\u043a \u0430\u0432\u0442\u043e\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.852Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 32, + "fields": { + "template_name": "updated_submitter", + "subject": " ", + "heading": "\u041a \u0412\u0430\u0448\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439", + "plain_text": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,\r\n\r\n\u0412\u0430\u043c\u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 \"{{ ticket.title }}\". \u0421\u043e\u0432\u0435\u0442\u0443\u0435\u043c \u0412\u0430\u043c \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u044f\u0432\u043a\u0443.\r\n\r\n\u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 {{ ticket.ticket }}:\r\n\r\n{{ comment }}\r\n\r\n\u0415\u0441\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043d\u0430\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u043e. \u0418\u043b\u0438 \u0436\u0435 \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0435. \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435{{ ticket.ticket_url }}.", + "html": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435,
\r\n\r\n\u0412\u0430\u043c\u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430 {{ ticket.title }} \u0421\u043e\u0432\u0435\u0442\u0443\u0435\u043c \u0412\u0430\u043c \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u044f\u0432\u043a\u0443.
\r\n\r\n\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043a \u0437\u0430\u044f\u0432\u043a\u0435{{ ticket.ticket }}:
\r\n\r\n{{ comment }}\r\n\r\n
\u0415\u0441\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043d\u0430\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u043e. \u0418\u043b\u0438 \u0436\u0435 \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0435. \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u044f\u0432\u043a\u0435{{ ticket.ticket_url }}.
", + "locale": "ru", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.854Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 33, + "fields": { + "template_name": "assigned_cc", + "subject": "(Zugewiesen)", + "heading": "Ticket Zugewiesen", + "plain_text": "Hallo,\r\n\r\ngerne teilen wir Ihnen mit, dass Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") f\u00fcr {{ ticket.submitter_email }} {% if ticket.assigned_to %}zugewiesen wurde an {{ ticket.assigned_to }}{% else %}nicht mehr zugeordnet ist{% endif %}.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }}\r\n\r\nDie urspr\u00fcngliche Ticketbeschreibung war:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "Hallo,
\r\n\r\ngerne teilen wir Ihnen mit, dass Ticket {{ ticket.ticket }} ({{ ticket.title }}) f\u00fcr {{ ticket.submitter_email }} {% if ticket.assigned_to %}zugewiesen wurde an {{ ticket.assigned_to }}{% else %}nicht mehr zugeordnet ist{% endif %}.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich).
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.858Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 34, + "fields": { + "template_name": "assigned_owner", + "subject": "(Ihnen zugewiesen)", + "heading": "Ein Ticket wurde Ihnen zugewiesen", + "plain_text": "Hello,\r\n\r\ngerne teilen wir Ihnen mit, dass Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") f\u00fcr {{ ticket.submitter_email }} Ihnen zugewiesen wurde.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: SIE\r\nOnline ansehen: {{ ticket.staff_url }}\r\n\r\nDie urspr\u00fcngliche Ticketbeschreibung war:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "
Hallo,
\r\n\r\ngerne teilen wir Ihnen mit, dass Ticket {{ ticket.ticket }} ({{ ticket.title }}) f\u00fcr {{ ticket.submitter_email }} Ihnen zugewiesen wurde.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: SIE
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.860Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 35, + "fields": { + "template_name": "closed_cc", + "subject": "(Geschlossen)", + "heading": "Ticket geschlossen", + "plain_text": "Hallo,\r\n\r\nTicket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, zugewiesen an {{ ticket.assigned_to }}{% endif %} wurde geschlossen.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nDie urspr\u00fcngliche Ticketbeschreibung war:\r\n\r\n{{ ticket.description }}\r\n\r\nDie L\u00f6sung war:\r\n\r\n{{ resolution }}\r\n\r\n", + "html": "
Hallo,
\r\n\r\nTicket {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, zugewiesen an {{ ticket.get_assigned_to }}{% endif %} wurde geschlossen.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Die L\u00f6sung war:
\r\n\r\n{{ resolution }}\r\n\r\n
Sie k\u00f6nnen dieses Ticket unter folgendem Link online ansehen: {{ ticket.staff_url }}.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.862Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 36, + "fields": { + "template_name": "closed_owner", + "subject": "(Geschlossen)", + "heading": "Ticket geschlossen", + "plain_text": "Hallo,\r\n\r\nDas folgende Ticket, das Ihnen zugewiesen war, wurde geschlossen.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nDie L\u00f6sung war:\r\n\r\n{{ resolution }}\r\n\r\n", + "html": "Hallo,
\r\n\r\nDas folgende Ticket, das Ihnen zugewiesen war, wurde geschlossen.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Die L\u00f6sung war:
\r\n\r\n{{ ticket.resolution }}", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.864Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 37, + "fields": { + "template_name": "closed_submitter", + "subject": "(Geschlossen)", + "heading": "Ticket geschlossen", + "plain_text": "Hallo,\r\n\r\nSie haben k\u00fcrzlich das Ticket \"{{ ticket.title }}\" bei uns er\u00f6ffnet. Hiermit m\u00f6chten wir Ihnen mitteilen das dieses Ticket nun geschlossen wurde.\r\n\r\nDie L\u00f6sung war:\r\n\r\n{{ resolution }}\r\n\r\nWenn Sie der Meinung sind, dass weitere Arbeit an diesem Ticket n\u00f6tig ist, dann m\u00f6chten wir Sie bitten, auf diese E-Mail zu antworten und den Betreff unver\u00e4ndert zu lassen.\r\n\r\nUnter folgendem Link k\u00f6nnen Sie das Ticket online ansehen: {{ ticket.ticket_url }}.\r\n\r\n", + "html": "
Hallo,
\r\n\r\nSie haben k\u00fcrzlich das Ticket {{ ticket.title }} bei uns er\u00f6ffnet. Hiermit m\u00f6chten wir Ihnen mitteilen das dieses Ticket nun geschlossen wurde.
\r\n\r\nDie L\u00f6sung war:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Unter folgendem Link k\u00f6nnen Sie das Ticket online ansehen: {{ ticket.ticket_url }}. Wenn Sie der Meinung sind, dass weitere Arbeit an diesem Ticket n\u00f6tig ist, dann m\u00f6chten wir Sie bitten, auf diese E-Mail zu antworten und den Betreff unver\u00e4ndert zu lassen.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.866Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 38, + "fields": { + "template_name": "escalated_cc", + "subject": "(Eskaliert)", + "heading": "Ticket Eskaliert", + "plain_text": "Hallo,\r\n\r\nGerne teilen wir Ihnen mit, dass das Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") automatisch eskaliert wurde.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nDie urspr\u00fcngliche Ticketbeschreibung war:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "Hallo,
\r\n\r\nGerne teilen wir Ihnen mit, dass das Ticket {{ ticket.ticket }} ('{{ ticket.title }}') automatisch eskaliert wurde.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.868Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 39, + "fields": { + "template_name": "escalated_owner", + "subject": "(Eskaliert)", + "heading": "Ein an Sie zugewiesenes Ticket wurde eskaliert", + "plain_text": "Hallo,\r\n\r\nEin an Sie zugewiesenes Ticket wurde automatisch eskaliert da es l\u00e4nger offen war als erwartet.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nDie urspr\u00fcngliche Ticketbeschreibung war:\r\n\r\n{{ ticket.description }}\r\n\r\nBitte pr\u00fcfen Sie dieses Ticket und versuchen Sie so bald wie m\u00f6glich eine L\u00f6sung zu finden.\r\n\r\n", + "html": "
Hallo,
\r\n\r\nEin an Sie zugewiesenes Ticket wurde automatisch eskaliert da es l\u00e4nger offen war als erwartet.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Bitte pr\u00fcfen Sie dieses Ticket und versuchen Sie so bald wie m\u00f6glich eine L\u00f6sung zu finden.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.871Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 40, + "fields": { + "template_name": "escalated_submitter", + "subject": "(Eskaliert)", + "heading": "Ihr Ticket wurde eskaliert", + "plain_text": "Hallo,\r\n\r\nSie haben k\u00fcrzlich das Ticket \"{{ ticket.title }}\" bei uns er\u00f6ffnet. Hiermit m\u00f6chten wir Ihnen mitteilen, dass dieses Ticket automatisch eskaliert wurde, da es l\u00e4nger offen war als erwartet.\r\n\r\nWir werden Ihr Ticket in K\u00fcrze pr\u00fcfen und so bald wie m\u00f6glich eine L\u00f6sung finden.\r\n\r\nUnter folgendem Link k\u00f6nnen das Ticket online ansehen: {{ ticket.ticket_url }}.\r\n\r\n", + "html": "Hallo,
\r\n\r\nSie haben k\u00fcrzlich das Ticket {{ ticket.title }} bei uns er\u00f6ffnet. Hiermit m\u00f6chten wir Ihnen mitteilen, dass dieses Ticket automatisch eskaliert wurde, da es l\u00e4nger offen war als erwartet.
\r\n\r\nWir werden Ihr Ticket in K\u00fcrze pr\u00fcfen und so bald wie m\u00f6glich eine L\u00f6sung finden.
\r\n\r\nUnter folgendem Link k\u00f6nnen das Ticket online ansehen: {{ ticket.ticket_url }}.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.872Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 41, + "fields": { + "template_name": "newticket_cc", + "subject": "(Er\u00f6ffnet)", + "heading": "Neues Ticket er\u00f6ffnet", + "plain_text": "Hallo,\r\n\r\nGerne teilen wir Ihnen mit, dass ein neues Ticket er\u00f6ffnet wurde.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nBeschreibung:\r\n{{ ticket.description }}\r\n\r\n", + "html": "Hallo,
\r\n\r\nGerne teilen wir Ihnen mit, dass ein neues Ticket er\u00f6ffnet wurde.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Beschreibung:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.874Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 42, + "fields": { + "template_name": "newticket_submitter", + "subject": "(Er\u00f6ffnet)", + "heading": "Ihr Ticket wurde er\u00f6ffnet", + "plain_text": "Hallo,\r\n\r\nGerne teilen wir Ihnen mit, dass wir Ihre vince.Anforderung mit dem Betreff \"{{ ticket.title }}\" erhalten haben. \r\n\r\nAn dieser Stelle sind keine weiteren Eingaben von Ihnen n\u00f6tig. Ihrem Ticket wurde die ID {{ ticket.ticket }} zugewiesen und es wird in K\u00fcrze bearbeitet werden.\r\n\r\nWenn Sie uns weitere Details mitteilen m\u00f6chten oder wenn Sie Fragen zu diesem Ticket haben, k\u00f6nnen Sie uns gerne eine E-Mail senden mit der Ticket ID '{{ ticket.ticket }}' im Betreff. Die einfachste M\u00f6glichkeit dazu ist, direkt auf diese E-Mail zu \"antworten\".\r\n\r\nWenn Sie das Ticket online ansehen m\u00f6chten, um weitere Informationen hinzuzuf\u00fcgen, Dateien anzuh\u00e4ngen oder Aktualisierungen anzusehen, besuchen Sie bitte folgenden Link: {{ ticket.ticket_url }}.\r\n\r\nWir werden Ihr Ticket pr\u00fcfen und so bald wie m\u00f6glich eine L\u00f6sung erarbeiten. Weitere Aktualisierungen und die L\u00f6sung werden wir an diese E-Mail Adresse senden.\r\n", + "html": "
Hallo,
\r\n\r\nGerne teilen wir Ihnen mit, dass wir Ihre vince.Anforderung mit dem Betreff {{ ticket.title }} erhalten haben.
\r\n\r\nAn dieser Stelle sind keine weiteren Eingaben von Ihnen n\u00f6tig. Ihrem Ticket wurde die ID {{ ticket.ticket }} zugewiesen und es wird in K\u00fcrze bearbeitet werden.
\r\n\r\nWenn Sie uns weitere Details mitteilen m\u00f6chten oder wenn Sie Fragen zu diesem Ticket haben, k\u00f6nnen Sie uns gerne eine E-Mail senden mit der Ticket ID {{ ticket.ticket }} im Betreff. Die einfachste M\u00f6glichkeit dazu ist, direkt auf diese E-Mail zu \"antworten\".
\r\n\r\nWenn Sie das Ticket online ansehen m\u00f6chten, um weitere Informationen hinzuzuf\u00fcgen, Dateien anzuh\u00e4ngen oder Aktualisierungen anzusehen, besuchen Sie bitte folgenden Link: {{ ticket.ticket_url }}.
\r\n\r\nWir werden Ihr Ticket pr\u00fcfen und so bald wie m\u00f6glich eine L\u00f6sung erarbeiten. Weitere Aktualisierungen und die L\u00f6sung werden wir an diese E-Mail Adresse senden.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.877Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 43, + "fields": { + "template_name": "resolved_cc", + "subject": "(Gel\u00f6st)", + "heading": "Ticket gel\u00f6st", + "plain_text": "Hallo,\r\n\r\nDas folgende Ticket wurde gel\u00f6st:\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nDie urspr\u00fcngliche Ticketbeschreibung war:\r\n\r\n{{ ticket.description }}\r\n\r\nDie vorgeschlagene L\u00f6sung ist:\r\n\r\n{{ ticket.resolution }}\r\n\r\nDiese L\u00f6sung wurde an den Ersteller gesendet, der die L\u00f6sung \u00fcberpr\u00fcfen muss, bevor dieses Ticket geschlossen werden kann.\r\n\r\n", + "html": "Hallo,
\r\n\r\nDas folgende Ticket wurde gel\u00f6st:
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Die vergeschlagene L\u00f6sung ist:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Diese L\u00f6sung wurde an den Ersteller gesendet, der die L\u00f6sung \u00fcberpr\u00fcfen muss, bevor dieses Ticket geschlossen werden kann.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.879Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 44, + "fields": { + "template_name": "resolved_owner", + "subject": "(Gel\u00f6st)", + "heading": "Ticket gel\u00f6st", + "plain_text": "Hallo,\r\n\r\nEin Ihnen zugeordnetes Ticket wurde gel\u00f6st.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nDie urspr\u00fcngliche Ticketbeschreibung war:\r\n\r\n{{ ticket.description }}\r\n\r\nDie vorgeschlagene L\u00f6sung ist:\r\n\r\n{{ ticket.resolution }}\r\n\r\nDiese L\u00f6sung wurde an den Ersteller gesendet, der die L\u00f6sung \u00fcberpr\u00fcfen muss, bevor dieses Ticket geschlossen werden kann.\r\n\r\n", + "html": "Hallo,
\r\n\r\nEin Ihnen zugeordnetes Ticket wurde gel\u00f6st.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Die vergeschlagene L\u00f6sung ist:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Diese L\u00f6sung wurde an den Ersteller gesendet, der die L\u00f6sung \u00fcberpr\u00fcfen muss, bevor dieses Ticket geschlossen werden kann.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.881Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 45, + "fields": { + "template_name": "resolved_submitter", + "subject": "(Gel\u00f6st)", + "heading": "Ihr Ticket wurde gel\u00f6st", + "plain_text": "Hallo,\r\n\r\nSie haben k\u00fcrzlich das Ticket \"{{ ticket.title }}\" bei uns er\u00f6ffnet. Hiermit m\u00f6chten wir Ihnen mitteilen, dass daf\u00fcr eine L\u00f6sung gefunden wurde.\r\n\r\nF\u00fcr das Ticket {{ ticket.ticket }} wurde folgende L\u00f6sung vorgeschlagen:\r\n\r\n{{ resolution }}\r\n\r\nWir m\u00f6chten Sie bitten zu best\u00e4tigen, dass diese L\u00f6sung Ihren Anforderungen entspricht, damit wir dieses Ticket schlie\u00dfen k\u00f6nnen. Wenn Sie weitere Fragen haben, oder der Meinung sind, dass diese L\u00f6sung nicht ausreichend ist, dann antworten Sie bitte auf diese E-Mail und lassen den Betreff unver\u00e4ndert.\r\n\r\nUnter folgendem Link k\u00f6nnen Sie das Ticket online ansehen: {{ ticket.ticket_url }}\r\n\r\n", + "html": "Hallo,
\r\n\r\nSie haben k\u00fcrzlich das Ticket {{ ticket.title }} bei uns er\u00f6ffnet. Hiermit m\u00f6chten wir Ihnen mitteilen, dass daf\u00fcr eine L\u00f6sung gefunden wurde.
\r\n\r\nF\u00fcr das Ticket {{ ticket.ticket }} wurde folgende L\u00f6sung vorgeschlagen:
\r\n\r\n{{ resolution }}\r\n\r\n
Wir m\u00f6chten Sie bitten zu best\u00e4tigen, dass diese L\u00f6sung Ihren Anforderungen entspricht, damit wir dieses Ticket schlie\u00dfen k\u00f6nnen. Wenn Sie weitere Fragen haben, oder der Meinung sind, dass diese L\u00f6sung nicht ausreichend ist, dann antworten Sie bitte auf diese E-Mail und lassen den Betreff unver\u00e4ndert.
\r\n\r\nUnter folgendem Link k\u00f6nnen Sie das Ticket online ansehen: {{ ticket.ticket_url }}.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.883Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 46, + "fields": { + "template_name": "updated_cc", + "subject": "(Aktualisiert)", + "heading": "Ticket aktualisiert", + "plain_text": "Hallo,\r\n\r\nGerne teilen wir Ihnen mit, dass das Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") f\u00fcr {{ ticket.submitter_email }} aktualisiert wurde.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nUrspr\u00fcngliche Ticketbeschreibung:\r\n\r\n{{ ticket.description }}\r\n\r\nFolgender Kommentar wurde hinzugef\u00fcgt:\r\n\r\n{{ comment }}\r\n\r\nDiese Information wurde {% if private %}nicht {% endif %} an den Ersteller gesendet.\r\n\r\nUnter folgendem Link k\u00f6nnen Sie das Ticket online ansehen: {{ ticket.staff_url }}.\r\n\r\n", + "html": "Hallo,
\r\n\r\nGerne teilen wir Ihnen mit, dass das Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") f\u00fcr {{ ticket.submitter_email }} aktualisiert wurde.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Folgender Kommentar wurde hinzugef\u00fcgt:
\r\n\r\n{{ comment }}\r\n\r\n
Diese Information wurde {% if private %}nicht {% endif %} an den Ersteller gesendet.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.885Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 47, + "fields": { + "template_name": "updated_owner", + "subject": "(Aktualisiert)", + "heading": "Ticket Aktualisiert", + "plain_text": "Hallo,\r\n\r\nGerne teilen wir Ihnen mit, dass das Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") f\u00fcr {{ ticket.submitter_email }}, das Ihnen zugewiesen ist, aktualisiert wurde.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nTicketsammlung: {{ queue.title }}\r\nTitel: {{ ticket.title }}\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZugewiesen an: {{ ticket.get_assigned_to }}\r\nOnline ansehen: {{ ticket.staff_url }} (Login erforderlich)\r\n\r\nUrspr\u00fcngliche Ticketbeschreibung:\r\n\r\n{{ ticket.description }}\r\n\r\nFolgender Kommentar wurde hinzugef\u00fcgt:\r\n\r\n{{ comment }}\r\n\r\nDiese Information wurde {% if private %}nicht {% endif %} an den Ersteller gesendet.\r\n\r\nUnter folgendem Link k\u00f6nnen Sie das Ticket online ansehen: {{ ticket.staff_url }}\r\n\r\n", + "html": "Hallo,
\r\n\r\nGerne teilen wir Ihnen mit, dass das Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") f\u00fcr {{ ticket.submitter_email }}, das Ihnen zugewiesen ist, aktualisiert wurde.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nTicketsammlung: {{ queue.title }}
\r\nTitel: {{ ticket.title }}
\r\nEr\u00f6ffnet: {{ ticket.created|date:\"l, j. N Y, \\u\\m H:i\" }}
\r\nErsteller: {{ ticket.submitter_email|default:\"Unbekannt\" }}
\r\nPriorit\u00e4t: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZugewiesen an: {{ ticket.get_assigned_to }}
\r\nOnline ansehen um dieses Ticket zu aktualisieren (Login erforderlich)
Die urspr\u00fcngliche Ticketbeschreibung war:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Folgender Kommentar wurde hinzugef\u00fcgt:
\r\n\r\n{{ comment }}\r\n\r\n
Diese Information wurde {% if private %}nicht {% endif %} an den Ersteller gesendet.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.887Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 48, + "fields": { + "template_name": "updated_submitter", + "subject": "(Aktualisiert)", + "heading": "Ihr Ticket wurde aktualisiert", + "plain_text": "Hallo,\r\n\r\nSie haben k\u00fcrzlich das Ticket \"{{ ticket.title }}\" bei uns er\u00f6ffnet. Hiermit m\u00f6chten wir Ihnen eine Aktualisierung mitteilen.\r\n\r\nFolgender Kommentar wurde zum Ticket {{ ticket.ticket }} hinzugef\u00fcgt:\r\n\r\n{{ comment }}\r\n\r\nWenn Sie uns weitere Informationen mitteilen m\u00f6chten, antworten Sie bitte auf diese E-Mail und lassen den Betreff unver\u00e4ndert. Oder Sie k\u00f6nnen das Ticket online ansehen und aktualisieren: {{ ticket.ticket_url }}\r\n\r\n", + "html": "Hallo,
\r\n\r\nSie haben k\u00fcrzlich das Ticket {{ ticket.title }} bei uns er\u00f6ffnet. Hiermit m\u00f6chten wir Ihnen eine Aktualisierung mitteilen.
\r\n\r\nFolgender Kommentar wurde zum Ticket {{ ticket.ticket }} hinzugef\u00fcgt:
\r\n\r\n{{ comment }}\r\n\r\n
Wenn Sie uns weitere Informationen mitteilen m\u00f6chten, antworten Sie bitte auf diese E-Mail und lassen den Betreff unver\u00e4ndert. Oder Sie k\u00f6nnen das Ticket online ansehen und aktualisieren: {{ ticket.ticket_url }}.
", + "locale": "de", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.889Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 49, + "fields": { + "template_name": "assigned_cc", + "subject": "(Assign\u00e9)", + "heading": "Ticket Assign\u00e9", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }} {% if ticket.assigned_to %} a \u00e9t\u00e9 assign\u00e9 \u00e0 {{ ticket.assigned_to }}{% else %} n'est plus assign\u00e9 \u00e0 personne{% endif %}.\r\n\r\nIdentifiant\u00a0: {{ ticket.ticket }}\r\nFile d'attente\u00a0: {{ queue.title }}\r\nTitre\u00a0: {{ ticket.title }}\r\nOuvert le\u00a0: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par\u00a0: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9\u00a0: {{ ticket.get_priority_display }}\r\nStatut\u00a0: {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0\u00a0: {{ ticket.get_assigned_to }}\r\nAdresse\u00a0: {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait\u00a0:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "Bonjour,
\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} ({{ ticket.title }}) par {{ ticket.submitter_email }} {% if ticket.assigned_to %}a \u00e9t\u00e9 assign\u00e9 \u00e0 {{ ticket.assigned_to }}{% else %} n'est plus assign\u00e9 \u00e0 personne{% endif %}.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.890Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 50, + "fields": { + "template_name": "assigned_owner", + "subject": "(Pour vous)", + "heading": "Le ticket vous est assign\u00e9", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") pour {{ ticket.submitter_email }} vous a \u00e9t\u00e9 assign\u00e9.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}", + "html": "
Bonjour,
\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} ({{ ticket.title }}) pour {{ ticket.submitter_email }} vous a \u00e9t\u00e9 assign\u00e9.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.893Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 51, + "fields": { + "template_name": "closed_cc", + "subject": "(Ferm\u00e9)", + "heading": "Ticket Ferm\u00e9", + "plain_text": "Bonjour,\r\n\r\nLe ticket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, assign\u00e9 \u00e0 {{ ticket.assigned_to }}{% endif %} a \u00e9t\u00e9 ferm\u00e9.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nLa motivation de r\u00e9solution est:\r\n\r\n{{ resolution }}\r\n\r\n", + "html": "
Bonjour,
\r\n\r\nLe ticket {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, assign\u00e9 \u00e0 {{ ticket.get_assigned_to }}{% endif %} a \u00e9t\u00e9 ferm\u00e9.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n
La motivation de r\u00e9solution est:
\r\n\r\n{{ resolution }}", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.895Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 52, + "fields": { + "template_name": "closed_owner", + "subject": "(Ferm\u00e9 - \u00e0 vous)", + "heading": "Ticket Ferm\u00e9", + "plain_text": "Bonjour,\r\n\r\nLe ticket suivant qui vous est actuellement assign\u00e9 a \u00e9t\u00e9 ferm\u00e9.\r\n\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }} (authentification obligatoire)\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nLa motivation de r\u00e9solution est:\r\n\r\n{{ resolution }}", + "html": "
Bonjour,
\r\n\r\n\r\nLe ticket suivant qui vous est actuellement assign\u00e9 a \u00e9t\u00e9 ferm\u00e9.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n
La motivation de r\u00e9solution est:
\r\n\r\n{{ resolution }}\r\n", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.898Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 53, + "fields": { + "template_name": "closed_submitter", + "subject": "(Ferm\u00e9)", + "heading": "Ticket Ferm\u00e9", + "plain_text": "Bonjour,\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est \"{{ ticket.title }}\". Ce courriel vous confirme que ce ticket a \u00e9t\u00e9 ferm\u00e9.\r\n\r\nSi vous pensez que nous devons encore travailler sur ce probl\u00e8me, faites le nous savoir en r\u00e9pondant \u00e0 ce courriel en conservant le sujet tel-quel.\r\n\r\nVous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.\r\n\r\nLa r\u00e9solution a \u00e9t\u00e9 motiv\u00e9e ainsi\u00a0:\r\n\r\n{{ ticket.resolution }}\r\n\r\n", + "html": "
Bonjour,
\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est {{ ticket.title }}. Ce courriel vous confirme que ce ticket a \u00e9t\u00e9 ferm\u00e9.
\r\n\r\n\"La r\u00e9solution a \u00e9t\u00e9 motiv\u00e9e ainsi :
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Vous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.
\r\n\r\nSi vous pensez que nous devons encore travailler sur ce probl\u00e8me, faites le nous savoir en r\u00e9pondant \u00e0 ce courriel en conservant le sujet tel-quel..
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.900Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 54, + "fields": { + "template_name": "escalated_cc", + "subject": "(Priorit\u00e9 augment\u00e9e)", + "heading": "Priorit\u00e9 du ticket augment\u00e9e", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") a vu sa priorit\u00e9 augment\u00e9 de mani\u00e8re automatique.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n", + "html": "Bonjour,
\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} ('{{ ticket.title }}') a vu sa priorit\u00e9 augment\u00e9 de mani\u00e8re automatique.
\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.902Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 55, + "fields": { + "template_name": "escalated_submitter", + "subject": "(Priorit\u00e9 augment\u00e9e)", + "heading": "Votre ticket a vu sa priorit\u00e9 augment\u00e9e", + "plain_text": "Bonjour,\r\n\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est \"{{ ticket.title }}\". Ce courriel vous informe que ce ticket a vu sa priorit\u00e9 augment\u00e9 de mani\u00e8re automatique, vu son d\u00e9lai de r\u00e9solution plus long que pr\u00e9vu.\r\n\r\nNous allons reprendre rapidement ce ticket afin d'essayer de le r\u00e9soudre le plus vite possible.\r\n\r\nVous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.\r\n\r\n", + "html": "
Bonjour,
\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est {{ ticket.title }} . Ce courriel vous informe que ce ticket a vu sa priorit\u00e9 augment\u00e9 de mani\u00e8re automatique, vu son d\u00e9lai de r\u00e9solution plus long que pr\u00e9vu.
\r\n\r\nNous allons reprendre rapidement ce ticket afin d'essayer de le r\u00e9soudre le plus vite possible.
\r\n\r\nVous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.904Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 56, + "fields": { + "template_name": "escalated_owner", + "subject": "(Priorit\u00e9 augment\u00e9e - \u00e0 vous)", + "heading": "Priorit\u00e9 de votre ticket augment\u00e9e", + "plain_text": "Bonjour,\r\n\r\nUn ticket qui vous est assign\u00e9 a vu sa priorit\u00e9 augment\u00e9 vu son d\u00e9lai de r\u00e9solution plus long que pr\u00e9vu.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nMerci de reprendre ce ticket afin d'essayer de le r\u00e9soudre le plus vite possible.\r\n", + "html": "Bonjour,
\r\n\r\nUn ticket qui vous est assign\u00e9 a vu sa priorit\u00e9 augment\u00e9 vu son d\u00e9lai de r\u00e9solution plus long que pr\u00e9vu.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Merci de reprendre ce ticket afin d'essayer de le r\u00e9soudre le plus vite possible..
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.907Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 57, + "fields": { + "template_name": "newticket_cc", + "subject": "(Ouvert)", + "heading": "Nouveau ticket ouvert", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir qu'un nouveau ticket a \u00e9t\u00e9 ouvert.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nDescription\u00a0:\r\n{{ ticket.description }}\r\n\r\n", + "html": "Bonjour,
\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir qu'un nouveau ticket a \u00e9t\u00e9 ouvert.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Description :
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.909Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 58, + "fields": { + "template_name": "newticket_submitter", + "subject": "(Ouvert)", + "heading": "Votre ticket est d\u00e9sormais ouvert", + "plain_text": "Bonjour,\r\n\r\nCe courriel permet de vous informer que nous avons re\u00e7u votre demande de support dont le sujet est \"{{ ticket.title }}\".\r\n\r\nVous n'avez rien de plus \u00e0 faire pour le moment. Votre ticket porte l'identifiant {{ ticket.ticket }} et sera trait\u00e9 rapidement.\r\n\r\nSi vous voulez nous donner plus de d\u00e9tails ou si vous avez une question concernant ce ticket, merci d'inclure la r\u00e9f\u00e9rence '{{ ticket.ticket }}' dans le sujet du message. Le plus simple \u00e9tant d'utiliser la fonction 'r\u00e9pondre' de votre logiciel de messagerie.\r\n\r\nVous pouvez visualiser ce ticket en ligne et y ajouter des informations ou des pi\u00e8ces jointes ainsi que voir les derni\u00e8res mies \u00e0 jour en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.\r\n\r\nNous allons traiter votre demande afin, si possible, de la r\u00e9soudre au plus vite. Vous recevrez des mise \u00e0 jour ou la r\u00e9ponse au ticket \u00e0 cette adresse mail.", + "html": "
Bonjour,
\r\n\r\nCe courriel permet de vous informer que nous avons re\u00e7u votre demande de support dont le sujet est {{ ticket.title }}.
\r\n\r\n\"Vous n'avez rien de plus \u00e0 faire pour le moment. Votre ticket porte l'identifiant {{ ticket.ticket }} et sera trait\u00e9 rapidement.
\r\n\r\nSi vous voulez nous donner plus de d\u00e9tails ou si vous avez une question concernant ce ticket, merci d'inclure la r\u00e9f\u00e9rence {{ ticket.ticket }} dans le sujet du message. Le plus simple \u00e9tant d'utiliser la fonction 'r\u00e9pondre' de votre logiciel de messagerie.
\r\n\r\nVous pouvez visualiser ce ticket en ligne et y ajouter des informations ou des pi\u00e8ces jointes ainsi que voir les derni\u00e8res mies \u00e0 jour en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.
\r\n\r\nNous allons traiter votre demande afin, si possible, de la r\u00e9soudre au plus vite. Vous recevrez des mise \u00e0 jour ou la r\u00e9ponse au ticket \u00e0 cette adresse mail.
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.911Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 59, + "fields": { + "template_name": "resolved_cc", + "subject": "(R\u00e9solu)", + "heading": "Ticket r\u00e9solu", + "plain_text": "Bonjour,\r\n\r\nLe ticket suivant a \u00e9t\u00e9 r\u00e9solu.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nLa motivation de r\u00e9solution est:\r\n\r\n{{ resolution }}\r\n\r\nCette information a \u00e9t\u00e9 envoy\u00e9 au cr\u00e9ateur de ce ticket, qui la confirmera avant que vous puissiez fermer ce ticket.\r\n\r\n", + "html": "Bonjour,
\r\n\r\nLe ticket suivant a \u00e9t\u00e9 r\u00e9solu.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n
La motivation de r\u00e9solution est:
\r\n\r\n{{ resolution }}\r\n\r\n
\r\nCette information a \u00e9t\u00e9 envoy\u00e9 au cr\u00e9ateur de ce ticket, qui la confirmera avant que vous puissiez fermer ce ticket.
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.913Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 60, + "fields": { + "template_name": "resolved_owner", + "subject": "(R\u00e9solu - \u00e0 vous)", + "heading": "Ticket r\u00e9solu", + "plain_text": "Bonjour,\r\n\r\nUn ticket qui vous est assign\u00e9 a \u00e9t\u00e9 r\u00e9solu.\r\n\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nLa motivation de r\u00e9solution est:\r\n\r\n{{ resolution }}\r\n\r\nCette information a \u00e9t\u00e9 envoy\u00e9 au cr\u00e9ateur de ce ticket, qui la confirmera avant que vous puissiez fermer ce ticket.\r\n\r\n", + "html": "Bonjour,
\r\n\r\nUn ticket qui vous est assign\u00e9 a \u00e9t\u00e9 r\u00e9solu.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n
La motivation de r\u00e9solution est:
\r\n\r\n{{ resolution }}\r\n\r\n
\r\nCette information a \u00e9t\u00e9 envoy\u00e9 au cr\u00e9ateur de ce ticket, qui la confirmera avant que vous puissiez fermer ce ticket.
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.915Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 61, + "fields": { + "template_name": "resolved_submitter", + "subject": "(R\u00e9solu)", + "heading": "Votre ticket a \u00e9t\u00e9 r\u00e9solu", + "plain_text": "Bonjour,\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est \"{{ ticket.title }}\" . Ce message vous informe d'une r\u00e9solution de la demande.\r\n\r\nLa solution suivante a \u00e9t\u00e9 donn\u00e9e au ticket {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\nMerci de confirmer que cette solution vous convient afin que nous puissions clore le ticket. Si vous avez d'autre demandes, o\u00f9 si vous pensez que cette solution n'est pas adapt\u00e9e, merci de r\u00e9pondre \u00e0 ce mail en conservant le sujet tel-quel.\r\n\r\nVous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.\r\n\r\n", + "html": "Bonjour,
\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est {{ ticket.title }}. Ce message vous informe d'une r\u00e9solution de la demande.
\r\n\r\nLa solution suivante a \u00e9t\u00e9 donn\u00e9e au ticket {{ ticket.ticket }}:
\r\n\r\n{{ resolution }}\r\n\r\n
Merci de confirmer que cette solution vous convient afin que nous puissions clore le ticket. Si vous avez d'autre demandes, o\u00f9 si vous pensez que cette solution n'est pas adapt\u00e9e, merci de r\u00e9pondre \u00e0 ce mail en conservant le sujet tel-quel.
\r\n\r\nVous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.917Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 62, + "fields": { + "template_name": "updated_cc", + "subject": "(Mis \u00e0 jour)", + "heading": "Ticket mis \u00e0 jour", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }} a \u00e9t\u00e9 mis \u00e0 jour.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nDescription originelle :\r\n\r\n{{ ticket.description }}\r\n\r\nLe commentaire suivant a \u00e9t\u00e9 ajout\u00e9\u00a0:\r\n\r\n{{ comment }}\r\n\r\nCette information {% if private %} n' a pas {% else %} a {% endif %} \u00e9t\u00e9 envoy\u00e9 par mail \u00e0 l'\u00e9metteur.\r\n\r\n", + "html": "Bonjour,
\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }} a \u00e9t\u00e9 mis \u00e0 jour.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Le commentaire suivant a \u00e9t\u00e9 ajout\u00e9 :
\r\n\r\n{{ comment }}\r\n\r\n
Cette information {% if private %} n' a pas {% else %} a {% endif %} \u00e9t\u00e9 envoy\u00e9 par mail \u00e0 l'\u00e9metteur.
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.919Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 63, + "fields": { + "template_name": "updated_owner", + "subject": "(Mis \u00e0 jour - \u00e0 vous)", + "heading": "Ticket mis \u00e0 jour", + "plain_text": "Hello,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }}, qui vous est assign\u00e9, a \u00e9t\u00e9 mis \u00e0 jour.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nDescription originelle :\r\n\r\n{{ ticket.description }}\r\n\r\nLe commentaire suivant a \u00e9t\u00e9 ajout\u00e9 :\r\n\r\n{{ comment }}\r\n\r\nCette information {% if private %} n' a pas {% else %} a {% endif %} \u00e9t\u00e9 envoy\u00e9 par mail \u00e0 l'\u00e9metteur.\r\n\r\n", + "html": "Bonjour,
\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }}, qui vous est assign\u00e9, a \u00e9t\u00e9 mis \u00e0 jour.
\r\n\r\n\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)
Pour m\u00e9moire, la description originelle \u00e9tait :
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Le commentaire suivant a \u00e9t\u00e9 ajout\u00e9 :
\r\n\r\n{{ comment }}\r\n\r\n
Cette information {% if private %} n' a pas {% else %} a {% endif %} \u00e9t\u00e9 envoy\u00e9 par mail \u00e0 l'\u00e9metteur.
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.921Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 64, + "fields": { + "template_name": "updated_submitter", + "subject": "(Mis \u00e0 jour)", + "heading": "Votre ticket a \u00e9t\u00e9 mis \u00e0 jour", + "plain_text": "Bonjour,\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est \"{{ ticket.title }}\". Ce message vous informe d'une mise \u00e0 jour du ticket.\r\n\r\nLe commentaire suivant a \u00e9t\u00e9 ajout\u00e9 au ticket {{ ticket.ticket }}\u00a0:\r\n\r\n{{ comment }}\r\n\r\nSi vous voulez nous fournir d'autres informations, merci de r\u00e9pondre \u00e0 ce mail en conservant le sujet tel-quel. Vous pouvez \u00e9galement voir et mettre \u00e0 jour ce ticket en ligne \u00e0 l'adresse {{ ticket.ticket_url }}", + "html": "Bonjour,
\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est {{ ticket.title }} . Ce message vous informe d'une mise \u00e0 jour du ticket.
\r\n\r\nLe commentaire suivant a \u00e9t\u00e9 ajout\u00e9 au ticket {{ ticket.ticket }}:
\r\n\r\n{{ comment }}\r\n\r\n
\"Si vous voulez nous fournir d'autres informations, merci de r\u00e9pondre \u00e0 ce mail en conservant le sujet tel-quel. Vous pouvez \u00e9galement voir et mettre \u00e0 jour ce ticket en ligne \u00e0 l'adresse {{ ticket.ticket_url }}.
", + "locale": "fr", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.923Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 65, + "fields": { + "template_name": "assigned_cc", + "subject": "(Assegnato)", + "heading": "Ticket Assegnato", + "plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} {% if ticket.assigned_to %}\u00e8 stato assegnato a {{ ticket.assigned_to }}{% else %}non \u00e8 pi\u00f9 assegnato{% endif %}.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nLa descrizione del ticket era:\r\n\r\n{{ ticket.description }}", + "html": "Salve,
\r\n\r\nTi \u00e8 stata inviata questa email per informarti che il ticket {{ ticket.ticket }} ({{ ticket.title }}) per {{ ticket.submitter_email }} {% if ticket.assigned_to %}\u00e8 stato assegnato a {{ ticket.assigned_to }}{% else %}non \u00e8 pi\u00f9 assegnato{% endif %}.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
Per riferimento, la descrizione del ticket era:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.925Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 66, + "fields": { + "template_name": "assigned_owner", + "subject": "(Assegnato a Te)", + "heading": "Ticket Assegnato a Te", + "plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che ti \u00e8 stato assegnato il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}", + "html": "
Salve,
\r\n\r\nTi \u00e8 stata inviata questa email per informarti che ti \u00e8 stato assegnato il ticket {{ ticket.ticket }} ({{ ticket.title }}) per {{ ticket.submitter_email }}.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
La descrizione del ticket \u00e8:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.927Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 67, + "fields": { + "template_name": "closed_cc", + "subject": "(Closed)", + "heading": "Ticket Chiuso", + "plain_text": "Salve,\r\n\r\nIl ticket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, assegnato a {{ ticket.assigned_to }}{% endif %} \u00e8 stato chiuso.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa soluzione fornita \u00e8:\r\n\r\n{{ resolution }}", + "html": "
Salve,
\r\n\r\nIl ticket {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, assegnato a {{ ticket.get_assigned_to }}{% endif %} \u00e8 stato chiuso.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
La descrizione del ticket \u00e8:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
La soluzione fornita \u00e8:
\r\n\r\n{{ resolution }}\r\n\r\n
Se vuoi vedere questo ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.929Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 68, + "fields": { + "template_name": "closed_owner", + "subject": "(Chiuso)", + "heading": "Ticket Chiuso", + "plain_text": "Salve,\r\n\r\nIl seguente ticket, attualmente assegnato a te, \u00e8 stato chiuso.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.", + "html": "Salve,
\r\n\r\nIl seguente ticket, attualmente assegnato a te, \u00e8 stato chiuso.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
La descrizione del ticket \u00e8:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
La soluzione fornita \u00e8:
\r\n\r\n{{ ticket.resolution }}", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.930Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 69, + "fields": { + "template_name": "closed_submitter", + "subject": "(Closed)", + "heading": "Ticket Chiuso", + "plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dal titolo \"{{ ticket.title }}\". Questa email ti \u00e8 inviata come conferma della chiusura del ticket.\r\n\r\nSe ritieni che questo ticket richieda ulteriori attivit\u00e0, per cortesia faccelo sapere rispondendo a questa email mantenendone invariato l'oggetto.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.\r\n\r\nLa soluzione proposta \u00e8:\r\n\r\n{{ ticket.resolution }}", + "html": "
Salve,
\r\n\r\nHai recentemente inserito un ticket dal titolo {{ ticket.title }}. Questa email ti \u00e8 inviata come conferma della chiusura del ticket.
\r\n\r\nLa soluzione proposta \u00e8:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Se vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}. Se ritieni che questo ticket richieda ulteriori attivit\u00e0, per cortesia faccelo sapere rispondendo a questa email mantenendone invariato l'oggetto.\r\n
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.933Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 70, + "fields": { + "template_name": "escalated_cc", + "subject": "(Priorit\u00e0)", + "heading": "Priorit\u00e0 Aumentata", + "plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che la priorit\u00e0 del ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") \u00e8 stata aumentata automaticamente.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nLa descrizione originale del ticket era:\r\n\r\n{{ ticket.description }}", + "html": "Salve,
\r\n\r\nTi \u00e8 stata inviata questa email per informarti che la priorit\u00e0 del ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") \u00e8 stata aumentata automaticamente.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
Per riferimento, la descrizione originale del ticket era:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.935Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 71, + "fields": { + "template_name": "escalated_owner", + "subject": "(Priorit\u00e0)", + "heading": "La Priorit\u00e0 di un Ticket Assegnato a Te \u00e8 Stata Aumentata", + "plain_text": "Salve,\r\n\r\nLa priorit\u00e0 di un ticket a te assegnato \u00e8 stata automaticamente aumentata in quanto questo \u00e8 rimasto aperto pi\u00f9 del previsto.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nLa descrizione originale del ticket era:\r\n\r\n{{ ticket.description }}\r\n\r\nRiesamina questo ticket e cerca di fornire una soluzione al pi\u00f9 presto.", + "html": "
Salve,
\r\n\r\nLa priorit\u00e0 di un ticket a te assegnato \u00e8 stata automaticamente aumentata in quanto questo \u00e8 rimasto aperto pi\u00f9 del previsto.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
Per riferimento, la descrizione originale del ticket era:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.936Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 72, + "fields": { + "template_name": "escalated_submitter", + "subject": "(Priorit\u00e0)", + "heading": "La Priorit\u00e0 del Tuo Ticket \u00e8 Stata Aumentata", + "plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dal titolo \"{{ ticket.title }}\". Questa email ti \u00e8 inviata per informarti che la priorit\u00e0 del ticket \u00e8 stata automaticamente aumentata in quanto questo \u00e8 rimasto aperto pi\u00f9 a lungo del previsto.\r\n\r\nRiesamineremo a breve il ticket e cercheremo di fornire una soluzione quanto prima.\r\n\r\nSe vuoi visualizzare il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.", + "html": "
Salve,
\r\n\r\nHai recentemente inserito un ticket dal titolo {{ ticket.title }}. Questa email ti \u00e8 inviata per informarti che la priorit\u00e0 del ticket \u00e8 stata automaticamente aumentata in quanto questo \u00e8 rimasto aperto pi\u00f9 a lungo del previsto.
\r\n\r\nRiesamineremo a breve il ticket e cercheremo di fornire una soluzione quanto prima.
\r\n\r\nSe vuoi visualizzare il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.938Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 73, + "fields": { + "template_name": "newticket_cc", + "subject": "(Aperto)", + "heading": "Nuovo Ticket Aperto", + "plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che \u00e8 stato aperto un nuovo ticket.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nDescrizione:\r\n{{ ticket.description }}", + "html": "Salve,
\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che \u00e8 stato aperto un nuovo ticket.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
Descrizione:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.941Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 74, + "fields": { + "template_name": "newticket_submitter", + "subject": "(Aperto)", + "heading": "Il Tuo Ticket \u00e8 Stato Aperto", + "plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che abbiamo ricevuto la tua richiesta di assistenza dal titolo \"{{ ticket.title }}\".\r\n\r\nNon \u00e8 necessario fare altro al momento. Il tuo ticket \u00e8 identificato dal codice {{ ticket.ticket }}, e verr\u00e0 esaminato al pi\u00f9 presto.\r\n\r\nSe vuoi aggiungere ulteriori dettagli o hai domande sul ticket, rispondi a questa email includendo l'id \"{{ ticket.ticket }}\" del ticket nell'oggetto. Il modo pi\u00f9 semplice per farlo \u00e8 premere il pulsante \"rispondi\" del tuo client di posta.\r\n\r\nSe vuoi vedere questo ticket online per aggiungere ulteriori informazioni, allegare file o vedere gli aggiornamenti, puoi visitare l'indirizzo {{ ticket.ticket_url }}.\r\n\r\nAnalizzeremo la tua richiesta e cercheremo di risolverla quanto prima. Riceverai successivi aggiornamenti e la notifica di risoluzione a questo indirizzo email.", + "html": "
Salve,
\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che abbiamo ricevuto la tua richiesta di assistenza dal titolo {{ ticket.title }}.
\r\n\r\nNon \u00e8 necessario fare altro al momento. Il tuo ticket \u00e8 identificato dal codice {{ ticket.ticket }} e verr\u00e0 esaminato al pi\u00f9 presto.
\r\n\r\nSe vuoi aggiungere ulteriori dettagli o hai domande sul ticket, rispondi a questa email includendo l'id {{ ticket.ticket}} del ticket nell'oggetto. Il modo pi\u00f9 semplice per farlo \u00e8 premere il pulsante \"rispondi\" del tuo client di posta.
\r\n\r\nSe vuoi vedere questo ticket online per aggiungere ulteriori informazioni, allegare file o vedere gli aggiornamenti, puoi visitare l'indirizzo {{ ticket.ticket_url }}.
\r\n\r\nAnalizzeremo la tua richiesta e cercheremo di risolverla quanto prima. Riceverai successivi aggiornamenti e la notifica di risoluzione a questo indirizzo email.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.943Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 75, + "fields": { + "template_name": "resolved_cc", + "subject": "(Risolto)", + "heading": "Ticket Risolto", + "plain_text": "Salve,\r\n\r\nIl seguente ticket \u00e8 stato risolto:\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ ticket.resolution }}\r\n\r\nLa risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.", + "html": "Salve,
\r\n\r\nIl seguente ticket \u00e8 stato risolto:
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
Per riferimento, la descrizione originale del ticket era:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
La risoluzione aggiunta era:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
La risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.945Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 76, + "fields": { + "template_name": "resolved_owner", + "subject": "(Risolto)", + "heading": "Ticket Risolto", + "plain_text": "Salve,\r\n\r\nun ticket a te assegnato \u00e8 stato risolto.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ ticket.resolution }}\r\n\r\nLa risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.", + "html": "Salve,
\r\n\r\nUn ticket a te assegnato \u00e8 stato risolto.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
La descrizione del ticket \u00e8:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
La risoluzione fornita \u00e8:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
La risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.947Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 77, + "fields": { + "template_name": "resolved_submitter", + "subject": "(Risolto)", + "heading": "Il Tuo Ticket \u00e8 Stato Risolto", + "plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket con titolo \"{{ ticket.title }}\". Questa email ti \u00e8 stata inviata per informarti della risoluzione del ticket.\r\n\r\nLa seguente risoluzione \u00e8 stata indicata per il ticket {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\nPuoi per cortesia confermare che questa soluzione risolva i vostri problemi in modo tale da poter chiudere il ticket? Se hai ulteriori domande, o ritieni che la soluzione proposta non sia adeguata, rispondi a questa email mantenendo invariato l'oggetto.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}", + "html": "Salve,
\r\n\r\nHai recentemente inserito un ticket con titolo {{ ticket.title }}. Questa email ti \u00e8 stata inviata per informarti della risoluzione del ticket.
\r\n\r\nLa seguente risoluzione \u00e8 stata indicata per il ticket {{ ticket.ticket }}:
\r\n\r\n{{ resolution }}\r\n\r\n
Puoi per cortesia confermare che questa soluzione risolva i vostri problemi in modo tale da poter chiudere il ticket? Se hai ulteriori domande, o ritieni che la soluzione proposta non sia adeguata, rispondi a questa email mantenendo invariato l'oggetto.
\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.949Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 78, + "fields": { + "template_name": "updated_cc", + "subject": "(Aggiornato)", + "heading": "Ticket Aggiornato", + "plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} \u00e8 stato aggiornato.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nDescrizione originale:\r\n\r\n{{ ticket.description }}\r\n\r\nIl seguente commento \u00e8 stato aggiunto:\r\n\r\n{{ comment }}\r\n\r\nQuesta informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.", + "html": "Salve,
\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} \u00e8 stato aggiornato.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
Per riferimento, la descrizione originale era:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Il seguente commento \u00e8 stato aggiunto:
\r\n\r\n{{ comment }}\r\n\r\n
Questa informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.950Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 79, + "fields": { + "template_name": "updated_owner", + "subject": "(Updated)", + "heading": "Ticket Aggiornato", + "plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}, a te assegnato, \u00e8 stato aggiornato.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiede login)\r\n\r\nDescrizione originale:\r\n\r\n{{ ticket.description }}\r\n\r\nIl seguente commento \u00e8 stato aggiunto:\r\n\r\n{{ comment }}\r\n\r\nQuesta informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.", + "html": "Salve,
\r\n\r\nTi \u00e8 stata inviata questa email per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}, a te assegnato, \u00e8 stato aggiornato.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiede login)
Per riferimento, la descrizione originale del ticket era:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Il seguente commento \u00e8 stato aggiunto:
\r\n\r\n{{ comment }}\r\n\r\n
Questa informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.953Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 80, + "fields": { + "template_name": "updated_submitter", + "subject": "(Aggiornato)", + "heading": "Il Tuo Ticket \u00e8 Stato Aggiornato", + "plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket con titolo \"{{ ticket.title }}\". Questa email ti \u00e8 stata inviata per informarti di un aggiornamento alla tua richiesta.\r\n\r\nIl seguente commento \u00e8 stato aggiunto al ticket {{ ticket.ticket }}:\r\n\r\n{{ comment }}\r\n\r\nPer fornire informazioni aggiuntive, rispondi a questa email mantenendone l'oggetto invariato. In alternativa, \u00e8 possibile vedere ed aggiornare il ticket online visitando l'indirizzo {{ ticket.ticket_url }}\r\n", + "html": "Salve,
\r\n\r\nHai recentemente inserito un ticket con titolo {{ ticket.title }}. Questa email ti \u00e8 stata inviata per informarti di un aggiornamento alla tua richiesta.
\r\n\r\nIl seguente commento \u00e8 stato aggiunto al ticket {{ ticket.ticket }}:
\r\n\r\n{{ comment }}\r\n\r\n
Per fornire informazioni aggiuntive, rispondi a questa email mantenendone l'oggetto invariato. In alternativa, \u00e8 possibile vedere ed aggiornare il ticket online visitando l'indirizzo {{ ticket.ticket_url }}.
", + "locale": "it", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.955Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 81, + "fields": { + "template_name": "assigned_cc", + "subject": "(Asignado)", + "heading": "Ticket asignado", + "plain_text": "Hola,\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") por {{ ticket.submitter_email }}{% if ticket.assigned_to %} ha sido asignado a {{ ticket.assigned_to }}{% else %} no ha sido asignado{% endif %}.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }}\r\n\r\nLa descripci\u00f3n original es:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "Hola,
\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} ({{ ticket.title }}) por {{ ticket.submitter_email }} {% if ticket.assigned_to %} ha sido asignado a {{ ticket.assigned_to }}{% else %} no ha sido asignado{% endif %}.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.957Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 82, + "fields": { + "template_name": "assigned_owner", + "subject": "(Asignado a ud)", + "heading": "Le asignaron un Ticket", + "plain_text": "Hola,\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") por {{ ticket.submitter_email }} ha sido asignado a usted.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado: USTED\r\nVer online: {{ ticket.staff_url }}\r\n\r\nLa descripci\u00f3n original del ticket es:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "
Hola,
\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} ({{ ticket.title }}) por {{ ticket.submitter_email }} ha sido asignado a usted.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: USTED
\r\nVer online para actualizar el Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.959Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 83, + "fields": { + "template_name": "closed_cc", + "subject": "(Cerrado)", + "heading": "Ticket cerrado", + "plain_text": "Hola,\r\n\r\nEl Ticket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, asignado a {{ ticket.assigned_to }}{% endif %} ha sido cerrado.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nLa descripci\u00f3n original es:\r\n\r\n{{ ticket.description }}\r\n\r\nLa soluci\u00f3n dada fue:\r\n\r\n{{ resolution }}\r\n\r\n", + "html": "
Hola,
\r\n\r\nEl Ticket {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, asignado a {{ ticket.get_assigned_to }}{% endif %} ha sido cerrado.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
La soluci\u00f3n dada fue:
\r\n\r\n{{ resolution }}\r\n\r\n
Para ver este Ticket online, por favor visite {{ ticket.staff_url }}.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.961Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 84, + "fields": { + "template_name": "closed_owner", + "subject": "(Cerrado)", + "heading": "Ticket cerrado", + "plain_text": "Hola,\r\n\r\nEl siguiente Ticket asignado a usted ha sido cerrado.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nPara ver este Ticket online, por favor visite {{ ticket.staff_url }}.\r\n\r\n", + "html": "Hola,
\r\n\r\nEl siguiente Ticket asignado a usted ha sido cerrado.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
La soluci\u00f3n dada fue:
\r\n\r\n{{ ticket.resolution }}", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.963Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 85, + "fields": { + "template_name": "closed_submitter", + "subject": "(cerrado)", + "heading": "Ticket cerrado", + "plain_text": "Hola,\r\n\r\nRecientemente usted envi\u00f3 el Ticket \"{{ ticket.title }}\". Este e-mail es para confirmar que el Ticket ha sido cerrado.\r\n\r\nSi cree que se requiere trabajo adicional, por favor d\u00e9janoslo saber respondiendo a este correo dejando el asunto intacto.\r\n\r\nPara ver este Ticket online, por favor visite {{ ticket.ticket_url }}.\r\n\r\nLa soluci\u00f3n dada fue:\r\n\r\n{{ ticket.resolution }}\r\n\r\n", + "html": "
Hola,
\r\n\r\nRecientemente usted envi\u00f3 el Ticket {{ ticket.title }}. Este e-mail es para confirmar que el Ticket ha sido cerrado.
\r\n\r\nLa soluci\u00f3n dada es:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Para ver este Ticket online, por favor visite {{ ticket.ticket_url }}. Si cree que se requiere trabajo adicional, por favor d\u00e9janoslo saber respondiendo a este correo dejando el asunto intacto.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.965Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 86, + "fields": { + "template_name": "escalated_cc", + "subject": "(Escalado)", + "heading": "Ticket escalado", + "plain_text": "Hola,\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") ha sido escalado autom\u00e1ticamente.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nLa descripci\u00f3n original es:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "Hola,
\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} ('{{ ticket.title }}') ha sido escalado autom\u00e1ticamente.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.967Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 87, + "fields": { + "template_name": "escalated_submitter", + "subject": "(Escalado)", + "heading": "Su Ticket ha sido escalado", + "plain_text": "Hola,\r\n\r\nRecientemente usted envi\u00f3 el Ticket \"{{ ticket.title }}\". Este e-mail es para informarle que su Ticket ha sido escalado ya que ha estado abierto por mas tiempo del esperado.\r\n\r\nSe revisar\u00e1 su Ticket para darle una soluci\u00f3n tan pronto como sea posible.\r\n\r\nPara ver este Ticket online, por favor visite {{ ticket.ticket_url }}.\r\n\r\n", + "html": "
Hola,
\r\n\r\nRecientemente usted envi\u00f3 el Ticket {{ ticket.title }}. Este e-mail es para informarle que su Ticket ha sido escalado ya que ha estado abierto por mas tiempo del esperado.
\r\n\r\nSe revisar\u00e1 su Ticket para darle una soluci\u00f3n tan pronto como sea posible.
\r\n\r\nPara ver este Ticket online, por favor visite {{ ticket.ticket_url }}.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.970Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 88, + "fields": { + "template_name": "escalated_owner", + "subject": "(Escalado)", + "heading": "El Ticket asignado a usted ha sido escalado", + "plain_text": "Hola,\r\n\r\nUn Ticket asignado a usted ha sido automaticamente escalado ya que ha estado abierto por mas tiempo del esperado.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nLa descripci\u00f3n original es::\r\n\r\n{{ ticket.description }}\r\n\r\nPor favor revisar este Ticket e intentar dar una soluci\u00f3n tan pronto como sea posible.\r\n\r\n", + "html": "Hola,
\r\n\r\nUn Ticket asignado a usted ha sido automaticamente escalado ya que ha estado abierto por mas tiempo del esperado.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.972Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 89, + "fields": { + "template_name": "newticket_cc", + "subject": "(Creado)", + "heading": "Nuevo Ticket creado", + "plain_text": "Hola,\r\n\r\nEste e-mail es para informar que un Ticket ha sido creado.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nDescripci\u00f3n:\r\n{{ ticket.description }}\r\n\r\n", + "html": "
Hola,
\r\n\r\nEste e-mail es para informar que un Ticket ha sido creado.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nVer online para actualizar este Ticket (login requerido)
Descripci\u00f3n:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.974Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 90, + "fields": { + "template_name": "newticket_submitter", + "subject": "(Creado)", + "heading": "Su Ticket ha sido creado", + "plain_text": "Hola,\r\n\r\nEste e-mail es para informar que recibimos su consulta \"{{ ticket.title }}\". \r\n\r\nUsted no debe realizar nada en este momento. Su Ticket est\u00e1 identificado con el n\u00famero {{ ticket.ticket }} y ser\u00e1 respondido prontamente.\r\n\r\nSi desea enviar detalles adicionales, o si tiene cualquier consulta con respecto a este Ticket por favor incluya el Ticket ID '{{ ticket.ticket }}' en el asunto. La manera mas f\u00e1cil de hacerlo es presionando el bot\u00f3n de \"respuesta\" a este mensaje.\r\n\r\nPara ver este Ticket online y proveer informaci\u00f3n adicional, a\u00f1adir archivos adjuntos o ver actualizaciones recientes, por favor visite {{ ticket.ticket_url }}.\r\n\r\nNosotros trabajaremos en su consulta y la resolveremos tan pronto como sea posible. Usted recibir\u00e1 actualizaciones y la soluci\u00f3n a su consulta a trav\u00e9s de este e-mail.\r\n", + "html": "
Hola,
\r\n\r\nEste e-mail es para informar que recibimos su consulta {{ ticket.title }}.
\r\n\r\nUsted no debe realizar nada en este momento. Su Ticket est\u00e1 identificado con el n\u00famero {{ ticket.ticket }} y ser\u00e1 respondido prontamente.
\r\n\r\nSi desea enviar detalles adicionales, o si tiene cualquier consulta con respecto a este Ticket por favor incluya el Ticket ID {{ ticket.ticket }} en el asunto. La manera mas f\u00e1cil de hacerlo es presionando el bot\u00f3n de \"respuesta\" a este mensaje.
\r\n\r\nPara ver este Ticket online y proveer informaci\u00f3n adicional, a\u00f1adir archivos adjuntos o ver actualizaciones recientes, por favor visite {{ ticket.ticket_url }}.
\r\n\r\nNosotros trabajaremos en su consulta y la resolveremos tan pronto como sea posible. Usted recibir\u00e1 actualizaciones y la soluci\u00f3n a su consulta a trav\u00e9s de este e-mail.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.975Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 91, + "fields": { + "template_name": "resolved_cc", + "subject": "(Resuelto)", + "heading": "Ticket resuelto", + "plain_text": "Hola,\r\n\r\nEl siguiente Ticket ha sido resuelto:\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nLa descripci\u00f3n original es:\r\n\r\n{{ ticket.description }}\r\n\r\nLa soluci\u00f3n dada fue:\r\n\r\n{{ ticket.resolution }}\r\n\r\nEsta solucion ha sido enviada al remitente, quien realizar\u00e1 la verificaci\u00f3n antes de que pueda cerrar el Ticket.\r\n\r\n", + "html": "Hola,
\r\n\r\nEl siguiente Ticket ha sido resuelto.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
La soluci\u00f3n dada fue:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Esta solucion ha sido enviada al remitente, quien realizar\u00e1 la verificaci\u00f3n antes de que pueda cerrar el Ticket.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.977Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 92, + "fields": { + "template_name": "resolved_owner", + "subject": "(Resuelto)", + "heading": "Ticket resuelto", + "plain_text": "Hola,\r\n\r\nUn ticket asignado a usted ha sido resuelto.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nLa descripci\u00f3n original es:\r\n\r\n{{ ticket.description }}\r\n\r\nLa soluci\u00f3n dada fue:\r\n\r\n{{ ticket.resolution }}\r\n\r\nEsta soluci\u00f3n ha sido enviada al remitente, quien realizar\u00e1 la verificaci\u00f3n antes de que pueda cerrar el Ticket.\r\n\r\n", + "html": "Hola,
\r\n\r\nUn ticket asignado a usted ha sido resuelto.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
La soluci\u00f3n dada fue:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Esta solucion ha sido enviada al remitente, quien realizar\u00e1 la verificaci\u00f3n antes de que pueda cerrar el Ticket.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.979Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 93, + "fields": { + "template_name": "resolved_submitter", + "subject": "(Resuelto)", + "heading": "Su Ticket ha sido resuelto", + "plain_text": "Hola,\r\n\r\nRecientemente usted envi\u00f3 el Ticket \"{{ ticket.title }}\". Este e-mail es para informar que su Ticket ha sido resuelto.\r\n\r\nLa siguiente soluci\u00f3n fue dada a su Ticket {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\n\u00bfPuede confirmar que esta soluci\u00f3n cumple con lo que necesita para cerrar este Ticket? Si tiene otras consultas, o cree que esta soluci\u00f3n no es la adecuada, por favor responda este mensaje manteniendo el asunto intacto.\r\n\r\nSi desea ver este Ticket online, por favor visite {{ ticket.ticket_url }}\r\n\r\n", + "html": "Hola,
\r\n\r\nRecientemente usted envi\u00f3 el Ticket {{ ticket.title }}. Este e-mail es para informar que su Ticket ha sido resuelto.
\r\n\r\nLa siguiente soluci\u00f3n fue dada a su Ticket {{ ticket.ticket }}:
\r\n\r\n{{ resolution }}\r\n\r\n
\u00bfPuede confirmar que esta soluci\u00f3n cumple con lo que necesita para cerrar este Ticket? Si tiene otras consultas, o cree que esta soluci\u00f3n no es la adecuada, por favor responda este mensaje manteniendo el asunto intacto.
\r\n\r\nSi desea ver este Ticket online, por favor visite {{ ticket.ticket_url }}.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.980Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 94, + "fields": { + "template_name": "updated_cc", + "subject": "(Actualizado)", + "heading": "Ticket actualizado", + "plain_text": "Hola,\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") por {{ ticket.submitter_email }} ha sido actualizado.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nDescripci\u00f3n:\r\n\r\n{{ ticket.description }}\r\n\r\nSe agreg\u00f3 el siguiente comentario:\r\n\r\n{{ comment }}\r\n\r\nEsta informaci\u00f3n {% if private %}no {% endif %} fue enviada al remitente.\r\n\r\nSi desea ver este Ticket online, por favor visite {{ ticket.staff_url }}.\r\n\r\n", + "html": "Hola,
\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") por {{ ticket.submitter_email }} ha sido actualizado.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Se agreg\u00f3 el siguiente comentario:
\r\n\r\n{{ comment }}\r\n\r\n
Esta informaci\u00f3n {% if private %}no {% endif %} fue enviada al remitente.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.982Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 95, + "fields": { + "template_name": "updated_owner", + "subject": "(Actualizado)", + "heading": "Ticket actualizado", + "plain_text": "Hola,\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") por {{ ticket.submitter_email }}, que le fue asignado, ha sido actualizado.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nCola: {{ queue.title }}\r\nT\u00edtulo: {{ ticket.title }}\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}\r\nPrioridad: {{ ticket.get_priority_display }}\r\nEstado: {{ ticket.get_status }}\r\nAsignado a: {{ ticket.get_assigned_to }}\r\nVer online: {{ ticket.staff_url }} (login requerido)\r\n\r\nDescripci\u00f3n original:\r\n\r\n{{ ticket.description }}\r\n\r\nSe agreg\u00f3 el siguiente comentario:\r\n\r\n{{ comment }}\r\n\r\nEsta informaci\u00f3n {% if private %}no {% endif %} fue enviada al remitente.\r\n\r\nSi desea ver este Ticket online, por favor visite {{ ticket.staff_url }}\r\n\r\n", + "html": "Hola,
\r\n\r\nEste e-mail es para informar que el Ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") por {{ ticket.submitter_email }}, que le fue asignado, ha sido actualizado.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nCola: {{ queue.title }}
\r\nT\u00edtulo: {{ ticket.title }}
\r\nCreado: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nRemitente: {{ ticket.submitter_email|default:\"Desconocido\" }}
\r\nPrioridad: {{ ticket.get_priority_display }}
\r\nEstado: {{ ticket.get_status }}
\r\nAsignado a: {{ ticket.get_assigned_to }}
\r\nVer online para actualizar este Ticket (login requerido)
La descripci\u00f3n original es:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Se agreg\u00f3 el siguiente comentario:
\r\n\r\n{{ comment }}\r\n\r\n
Esta informaci\u00f3n {% if private %}no {% endif %} fue enviada al remitente.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.984Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 96, + "fields": { + "template_name": "updated_submitter", + "subject": "(Actualizado)", + "heading": "Su Ticket ha sido actualizado", + "plain_text": "Hola,\r\n\r\nRecientemente usted envi\u00f3 el Ticket \"{{ ticket.title }}\". Este correo es para informar que su Ticket ha sido actualizado.\r\n\r\nSe agreg\u00f3 el siguiente comentario al Ticket {{ ticket.ticket }}:\r\n\r\n{{ comment }}\r\n\r\nSi necesita agregar informaci\u00f3n adicional por favor responda a este mensaje manteniendo el asunto intacto. Por otro lado, usted puede ver y actualizar la informaci\u00f3n de este Ticket visitando {{ ticket.ticket_url }}\r\n\r\n", + "html": "Hola,
\r\n\r\nRecientemente usted envi\u00f3 el Ticket {{ ticket.title }}. Este correo es para informar que su Ticket ha sido actualizado.
\r\n\r\nSe agreg\u00f3 el siguiente comentario al Ticket {{ ticket.ticket }}:
\r\n\r\n{{ comment }}\r\n\r\n
Si necesita agregar informaci\u00f3n adicional por favor responda a este mensaje manteniendo el asunto intacto. Por otro lado, usted puede ver y actualizar la informaci\u00f3n de este Ticket visitando {{ ticket.ticket_url }}.
", + "locale": "es", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.986Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 97, + "fields": { + "template_name": "assigned_cc", + "subject": "(\u5df2\u5206\u914d)", + "heading": "\u5de5\u5355\u5df2\u5206\u914d", + "plain_text": "\u60a8\u597d,\r\n\r\n\u6e29\u99a8\u63d0\u793a, {{ ticket.submitter_email }}\u63d0\u4ea4\u7684\u5de5\u5355 {{ ticket.ticket }} (\"{{ ticket.title }}\") \u5df2\u7ecf {% if ticket.assigned_to %}\u5206\u914d\u7ed9 {{ ticket.assigned_to }}{% else %}\u672a\u5206\u914d{% endif %}.\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }}\r\n\r\n\u539f\u59cb\u63cf\u8ff0\u4e3a:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u6e29\u99a8\u63d0\u793a, {{ ticket.submitter_email }}\u7684\u5de5\u5355 {{ ticket.ticket }} ({{ ticket.title }}) {% if ticket.assigned_to %}\u5df2\u7ecf\u5206\u914d\u7ed9 {{ ticket.assigned_to }}{% else %}\u8fd8\u672a\u5206\u914d{% endif %}.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.987Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 98, + "fields": { + "template_name": "assigned_owner", + "subject": "(\u5df2\u5206\u914d\u7ed9\u60a8)", + "heading": "\u5de5\u5355\u5df2\u5206\u914d\u7ed9\u60a8", + "plain_text": "\u60a8\u597d,\r\n\r\n\u6e29\u99a8\u63d0\u793a, \u5de5\u5355 \u63d0\u4ea4\u8005{{ ticket.submitter_email }}\u7684\u5de5\u5355{{ ticket.ticket }} \u5df2\u7ecf \u5206\u914d\u7ed9 you.\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: YOU\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }}\r\n\r\n\u539f\u59cb\u63cf\u8ff0\u4e3a:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "
\u60a8\u597d,
\r\n\r\n\u6e29\u99a8\u63d0\u793a, \u63d0\u4ea4\u8005{{ ticket.submitter_email }}\u7684\u5de5\u5355 {{ ticket.ticket }} ({{ ticket.title }}) \u5df2\u7ecf\u5206\u914d\u7ed9 you.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: YOU
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.989Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 99, + "fields": { + "template_name": "closed_cc", + "subject": "(\u5df2\u5173\u95ed)", + "heading": "\u5de5\u5355\u5df2\u5173\u95ed", + "plain_text": "\u60a8\u597d,\r\n\r\n\u5de5\u5355 {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, \u5206\u914d\u7ed9 {{ ticket.assigned_to }}{% endif %} \u5df2\u7ecf \u5173\u95ed\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\n\u539f\u59cb\u63cf\u8ff0\u4e3a:\r\n\r\n{{ ticket.description }}\r\n\r\n\u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\u4e3a:\r\n\r\n{{ resolution }}\r\n\r\n", + "html": "
\u60a8\u597d,
\r\n\r\n\u5de5\u5355 {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, \u5206\u914d\u7ed9 {{ ticket.get_assigned_to }}{% endif %} \u5df2\u7ecf \u5173\u95ed
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\u4e3a:
\r\n\r\n{{ resolution }}\r\n\r\n
\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.staff_url }}.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.990Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 100, + "fields": { + "template_name": "closed_owner", + "subject": "(\u5df2\u5173\u95ed)", + "heading": "\u5de5\u5355\u5df2\u5173\u95ed", + "plain_text": "\u60a8\u597d,\r\n\r\n\u4ee5\u4e0b\u5206\u914d\u7ed9\u60a8\u7684\u5de5\u5355, \u5df2\u7ecf\u5173\u95ed\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\n\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.staff_url }}.\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u4ee5\u4e0b\u5206\u914d\u7ed9\u60a8\u7684\u5de5\u5355, \u5df2\u7ecf\u5173\u95ed
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\u4e3a:
\r\n\r\n{{ ticket.resolution }}", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.992Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 101, + "fields": { + "template_name": "closed_submitter", + "subject": "(\u5df2\u5173\u95ed)", + "heading": "\u5de5\u5355\u5df2\u5173\u95ed", + "plain_text": "\u60a8\u597d,\r\n\r\n\u60a8\u6700\u8fd1\u8bb0\u5f55\u4e86\u4e3b\u9898\u4e3a\"{{ ticket.title }}\"\u7684\u5de5\u5355. \u672c\u90ae\u4ef6\u786e\u8ba4\u5de5\u5355\u5df2\u7ecf \u5173\u95ed\r\n\r\nI\u5982\u679c\u60a8\u8ba4\u4e3a\u8fd8\u9700\u8981\u540e\u7eed\u5de5\u4f5c\uff0c \u8bf7\u7528\u539f\u6807\u9898\u56de\u590d\u6b64\u90ae\u4ef6.\r\n\r\n\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.ticket_url }}.\r\n\r\n\u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\u4e3a:\r\n\r\n{{ ticket.resolution }}\r\n\r\n", + "html": "
\u60a8\u597d,
\r\n\r\n\u60a8\u6700\u8fd1\u8bb0\u5f55\u4e86\u4e3b\u9898\u4e3a{{ ticket.title }}\u7684\u5de5\u5355. \u672c\u90ae\u4ef6\u786e\u8ba4\u5de5\u5355\u5df2\u7ecf \u5173\u95ed
\r\n\r\n\u5df2\u63d0\u4f9b\u7684\u65b9\u6848\u4e3a:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.ticket_url }}. \u5982\u679c\u60a8\u8ba4\u4e3a\u8fd8\u9700\u8981\u540e\u7eed\u5de5\u4f5c\uff0c \u8bf7\u7528\u539f\u6807\u9898\u56de\u590d\u6b64\u90ae\u4ef6.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.994Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 102, + "fields": { + "template_name": "escalated_cc", + "subject": "(\u5df2\u7ecf\u63d0\u5347\u4f18\u5148\u7ea7)", + "heading": "\u5de5\u5355 \u5df2\u7ecf\u63d0\u5347\u4f18\u5148\u7ea7", + "plain_text": "\u60a8\u597d,\r\n\r\n\u6e29\u99a8\u63d0\u793a, \u5de5\u5355 {{ ticket.ticket }} (\"{{ ticket.title }}\") \u5df2\u7ecf\u81ea\u52a8\u63d0\u5347\u4f18\u5148\u7ea7.\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\n\u539f\u59cb\u63cf\u8ff0\u4e3a:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u6e29\u99a8\u63d0\u793a, \u5de5\u5355 {{ ticket.ticket }} ('{{ ticket.title }}') \u5df2\u7ecf \u81ea\u52a8\u63d0\u5347\u4f18\u5148\u7ea7.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.997Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 103, + "fields": { + "template_name": "escalated_owner", + "subject": "(\u5df2\u7ecf\u63d0\u5347\u4f18\u5148\u7ea7)", + "heading": "\u5de5\u5355 \u5df2\u5206\u914d\u7ed9 \u60a8 \u5df2\u7ecf\u63d0\u5347\u4f18\u5148\u7ea7", + "plain_text": "\u60a8\u597d,\r\n\r\nA \u5206\u914d\u7ed9\u60a8\u7684\u5f53\u524d\u5de5\u5355\u5df2\u7ecf\u81ea\u52a8\u63d0\u5347\u4f18\u5148\u7ea7\uff0c \u56e0\u4e3a\u6253\u5f00\u65f6\u95f4\u5df2\u7ecf\u8d85\u8fc7\u9884\u671f.\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\n\u539f\u59cb\u63cf\u8ff0\u4e3a:\r\n\r\n{{ ticket.description }}\r\n\r\n\u8bf7\u67e5\u770b\u6b64\u5de5\u5355\u5e76\u5c3d\u5feb\u63d0\u4f9b\u89e3\u51b3\u65b9\u6848.\r\n\r\n", + "html": "
\u60a8\u597d,
\r\n\r\nA \u5f53\u524d\u5206\u914d\u7ed9\u60a8\u7684\u5de5\u5355\u5df2\u7ecf\u81ea\u52a8\u63d0\u5347\u4f18\u5148\u7ea7 as it \u5df2\u7ecf \u6253\u5f00\u65f6\u95f4\u8d85\u8fc7\u9884\u671f.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:32.999Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 104, + "fields": { + "template_name": "escalated_submitter", + "subject": "(\u5df2\u7ecf\u63d0\u5347\u4f18\u5148\u7ea7)", + "heading": "\u60a8\u7684 \u5de5\u5355 \u5df2\u7ecf \u5df2\u7ecf\u63d0\u5347\u4f18\u5148\u7ea7", + "plain_text": "\u60a8\u597d,\r\n\r\n\u60a8\u6700\u8fd1\u4e3a\u6211\u4eec\u8bb0\u5f55\u4e86\u4e00\u4e2a\u6807\u9898\u4e3a \"{{ ticket.title }}\" \u7684\u5de5\u5355. \u672c\u90ae\u4ef6\u662f\u60f3\u63d0\u9192\u60a8\u5de5\u5355\u81ea\u52a8\u5347\u7ea7\uff0c \u56e0\u4e3a\u5df2\u7ecf\u6253\u5f00\u65f6\u95f4\u8d85\u8fc7\u9884\u671f.\r\n\r\n\u6211\u4eec\u5c06\u5c3d\u5feb\u67e5\u770b\u5e76\u63d0\u4f9b\u89e3\u51b3\u65b9\u6848.\r\n\r\n\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.ticket_url }}.\r\n\r\n", + "html": "
\u60a8\u597d,
\r\n\r\n\u60a8\u6700\u8fd1\u8bb0\u5f55\u4e86\u4e3b\u9898\u4e3a{{ ticket.title }}\u7684\u5de5\u5355. \u672c\u90ae\u4ef6\u662f\u60f3\u63d0\u9192\u60a8\u5de5\u5355\u81ea\u52a8\u5347\u7ea7\uff0c \u56e0\u4e3a\u5df2\u7ecf \u6253\u5f00\u65f6\u95f4\u8d85\u8fc7\u9884\u671f.
\r\n\r\n\u6211\u4eec\u5c06\u5c3d\u5feb\u67e5\u770b\u5e76\u63d0\u4f9b\u89e3\u51b3\u65b9\u6848.
\r\n\r\n\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.ticket_url }}.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.001Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 105, + "fields": { + "template_name": "newticket_cc", + "subject": "(\u5df2\u6253\u5f00)", + "heading": "\u65b0\u5de5\u5355\u5df2\u6253\u5f00", + "plain_text": "\u60a8\u597d,\r\n\r\n\u6e29\u99a8\u63d0\u793a\uff1a \u65b0\u5de5\u5355\u5df2\u7ecf \u6253\u5f00.\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\nDescription:\r\n{{ ticket.description }}\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u6e29\u99a8\u63d0\u793a\uff1a \u65b0\u5de5\u5355\u5df2\u7ecf\u6253\u5f00.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
Description:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.003Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 106, + "fields": { + "template_name": "newticket_submitter", + "subject": "(\u5df2\u6253\u5f00)", + "heading": "\u60a8\u7684\u5de5\u5355\u5df2\u7ecf\u6253\u5f00", + "plain_text": "\u60a8\u597d,\r\n\r\n\u6e29\u99a8\u63d0\u793a\uff1a \u6211\u4eec\u5df2\u7ecf\u6536\u5230\u60a8\u4e3b\u9898\u4e3a \"{{ ticket.title }}\" \u7684\u67e5\u8be2. \r\n\r\n\u60a8\u5f53\u524d\u4ec0\u4e48\u90fd\u4e0d\u7528\u505a. \u60a8\u7684\u5de5\u5355\u5df2\u7ecf\u5206\u914d\u7f16\u53f7 {{ ticket.ticket }} \u4e14\u5c06\u5f88\u5feb\u6536\u5230\u56de\u590d.\r\n\r\n\u5982\u679c\u60a8\u60f3\u544a\u8bc9\u6211\u4eec\u66f4\u591a\u8be6\u60c5, \u6216\u8005\u8981\u67e5\u8be2\u6b64\u5de5\u5355, \u8bf7\u5728\u4e3b\u9898\u5e26\u4e0a\u5de5\u5355id '{{ ticket.ticket }}' . \u6700\u7b80\u5355\u65b9\u5f0f\u5c31\u662f\u6309\u4e0b\u6b64\u6d88\u606f \"\u56de\u590d\" .\r\n\r\n\u5982\u679c\u60a8\u5e0c\u671b\u5728\u7ebf\u67e5\u770b\u5e76\u63d0\u4f9b\u6b64\u5de5\u5355\u7684\u66f4\u591a\u4fe1\u606f, \u9644\u52a0\u6587\u4ef6\u6216\u8005\u67e5\u770b\u6700\u8fd1\u66f4\u65b0, \u60a8\u53ef\u4ee5\u8bbf\u95ee {{ ticket.ticket_url }}.\r\n\r\n\u6211\u4eec\u5c06\u8c03\u67e5\u60a8\u7684\u95ee\u9898\u5e76\u5c3d\u5feb\u89e3\u51b3. \u60a8\u5c06\u901a\u8fc7\u6b64\u90ae\u7bb1\u6536\u5230\u540e\u7eed\u66f4\u65b0\u548c\u89e3\u51b3\u65b9\u6848.\r\n", + "html": "
\u60a8\u597d,
\r\n\r\n\u6e29\u99a8\u63d0\u793a\uff1a \u6211\u4eec\u5df2\u6536\u5230\u60a8\u4e3b\u9898\u4e3a {{ ticket.title }}.
\r\n\r\n\u60a8\u5f53\u524d\u4ec0\u4e48\u90fd\u4e0d\u7528\u505a. \u60a8\u7684\u5de5\u5355 \u5df2\u7ecf \u5206\u914d\u7f16\u53f7 {{ ticket.ticket }} \u4e14\u5c06\u5f88\u5feb\u6536\u5230\u56de\u590d.
\r\n\r\n\u5982\u679c\u60a8\u60f3\u544a\u8bc9\u6211\u4eec\u66f4\u591a\u8be6\u60c5, \u6216\u8005\u8981\u67e5\u8be2\u6b64\u5de5\u5355, \u8bf7\u5728\u4e3b\u9898\u5e26\u4e0a\u5de5\u5355id {{ ticket.ticket }} . \u6700\u7b80\u5355\u5c31\u662f\u76f4\u63a5\u70b9\u8fd9\u4e2a\u6d88\u606f\u7684 \"\u56de\u590d\" \u6309\u94ae.
\r\n\r\n\u5982\u679c\u60a8\u5e0c\u671b\u5728\u7ebf\u67e5\u770b\u5e76\u63d0\u4f9b\u6b64\u5de5\u5355\u7684\u66f4\u591a\u4fe1\u606f, \u9644\u52a0\u6587\u4ef6\u6216\u8005\u67e5\u770b\u6700\u8fd1\u66f4\u65b0, \u60a8\u53ef\u4ee5\u8bbf\u95ee {{ ticket.ticket_url }}.
\r\n\r\n\u6211\u4eec\u5c06\u8c03\u67e5\u60a8\u7684\u95ee\u9898\u5e76\u5c3d\u5feb\u89e3\u51b3. \u60a8\u5c06\u901a\u8fc7\u6b64\u90ae\u7bb1\u6536\u5230\u540e\u7eed\u66f4\u65b0\u548c\u89e3\u51b3\u65b9\u6848.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.005Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 107, + "fields": { + "template_name": "resolved_cc", + "subject": "(\u89e3\u51b3)", + "heading": "\u5de5\u5355 \u89e3\u51b3", + "plain_text": "\u60a8\u597d,\r\n\r\n\u4ee5\u4e0b\u5de5\u5355 \u5df2\u7ecf \u89e3\u51b3:\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\n\u539f\u59cb\u63cf\u8ff0\u4e3a:\r\n\r\n{{ ticket.description }}\r\n\r\n\u63d0\u4f9b\u7684\u89e3\u51b3\u65b9\u6848\u4e3a:\r\n\r\n{{ ticket.resolution }}\r\n\r\n\u6b64\u65b9\u6848\u5df2\u7ecf \u90ae\u4ef6\u53d1\u9001\u7ed9\u63d0\u4ea4\u8005, \u5728\u60a8\u5173\u95ed\u4e4b\u524d\u9700\u8981\u4ed6\u5148\u786e\u8ba4.\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u4ee5\u4e0b\u5de5\u5355 \u5df2\u7ecf \u89e3\u51b3.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u589e\u52a0\u7684\u89e3\u51b3\u65b9\u6848\u4e3a:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
\u6b64\u65b9\u6848\u5df2\u7ecf \u90ae\u4ef6\u53d1\u9001\u7ed9\u63d0\u4ea4\u8005, \u5728\u60a8\u5173\u95ed\u4e4b\u524d\u9700\u8981\u4ed6\u5148\u786e\u8ba4.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.006Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 108, + "fields": { + "template_name": "resolved_owner", + "subject": "(\u89e3\u51b3)", + "heading": "\u5de5\u5355 \u89e3\u51b3", + "plain_text": "\u60a8\u597d,\r\n\r\nA \u5f53\u524d\u5206\u914d\u7ed9\u60a8\u7684\u5de5\u5355\u5df2\u7ecf \u89e3\u51b3.\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\n\u539f\u59cb\u63cf\u8ff0\u4e3a:\r\n\r\n{{ ticket.description }}\r\n\r\n\u63d0\u4f9b\u7684\u65b9\u6848\u4e3a:\r\n\r\n{{ ticket.resolution }}\r\n\r\n\u6b64\u65b9\u6848\u5df2\u7ecf \u90ae\u4ef6\u53d1\u9001\u7ed9\u63d0\u4ea4\u8005, \u5728\u60a8\u5173\u95ed\u4e4b\u524d\u9700\u8981\u4ed6\u5148\u786e\u8ba4.\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\nA \u5f53\u524d\u5206\u914d\u7ed9\u60a8\u7684\u5de5\u5355\u5df2\u7ecf \u89e3\u51b3.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u589e\u52a0\u7684\u89e3\u51b3\u65b9\u6848\u4e3a:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
\u6b64\u65b9\u6848\u5df2\u7ecf \u90ae\u4ef6\u53d1\u9001\u7ed9\u63d0\u4ea4\u8005, \u5728\u60a8\u5173\u95ed\u4e4b\u524d\u9700\u8981\u4ed6\u5148\u786e\u8ba4.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.008Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 109, + "fields": { + "template_name": "resolved_submitter", + "subject": "(\u89e3\u51b3)", + "heading": "\u60a8\u7684 \u5de5\u5355 \u5df2\u7ecf \u89e3\u51b3", + "plain_text": "\u60a8\u597d,\r\n\r\n\u60a8\u6700\u8fd1\u8bb0\u5f55\u4e86\u4e3b\u9898\u4e3a\"{{ ticket.title }}\"\u7684\u5de5\u5355. \u6b64\u90ae\u4ef6\u662f\u8981\u544a\u77e5\u60a8\u89e3\u51b3\u65b9\u6848.\r\n\r\n\u5de5\u5355\u6dfb\u52a0\u4e86\u4ee5\u4e0b\u89e3\u51b3\u65b9\u6848 {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\n\u8bf7\u60a8\u786e\u8ba4\u4e0b\u6b64\u89e3\u51b3\u65b9\u6848\u662f\u5426\u89e3\u51b3\u4e86\u60a8\u7684\u95ee\u9898\uff0c \u8fd9\u6837\u6211\u4eec\u53ef\u4ee5\u5173\u95ed\u6b64\u5de5\u5355? \u5982\u679c\u6709\u66f4\u591a\u95ee\u9898\u6216\u8005\u8ba4\u4e3a\u65b9\u6848\u4e0d\u591f\u5145\u5206\uff0c, \u8bf7\u7ee7\u7eed\u4f7f\u7528\u90ae\u4ef6\u7684\u4e3b\u9898\u56de\u590d\u6b64\u90ae\u4ef6.\r\n\r\n\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.ticket_url }}\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u60a8\u6700\u8fd1\u8bb0\u5f55\u4e86\u4e3b\u9898\u4e3a{{ ticket.title }}\u7684\u5de5\u5355. \u6b64\u90ae\u4ef6\u662f\u8981\u544a\u77e5\u60a8\u89e3\u51b3\u65b9\u6848.
\r\n\r\n\u5de5\u5355\u6dfb\u52a0\u4e86\u4ee5\u4e0b\u89e3\u51b3\u65b9\u6848 {{ ticket.ticket }}:
\r\n\r\n{{ resolution }}\r\n\r\n
\u8bf7\u60a8\u786e\u8ba4\u4e0b\u6b64\u89e3\u51b3\u65b9\u6848\u662f\u5426\u89e3\u51b3\u4e86\u60a8\u7684\u95ee\u9898\uff0c \u8fd9\u6837\u6211\u4eec\u53ef\u4ee5\u5173\u95ed\u6b64\u5de5\u5355? \u5982\u679c\u6709\u66f4\u591a\u95ee\u9898\u6216\u8005\u8ba4\u4e3a\u65b9\u6848\u4e0d\u591f\u5145\u5206\uff0c, \u8bf7\u7ee7\u7eed\u4f7f\u7528\u90ae\u4ef6\u7684\u4e3b\u9898\u56de\u590d\u6b64\u90ae\u4ef6.
\r\n\r\n\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.ticket_url }}.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.010Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 110, + "fields": { + "template_name": "updated_cc", + "subject": "(\u5df2\u66f4\u65b0)", + "heading": "\u5de5\u5355\u5df2\u66f4\u65b0", + "plain_text": "\u60a8\u597d,\r\n\r\n\u6e29\u99a8\u63d0\u793a, \u63d0\u4ea4\u8005{{ ticket.submitter_email }}\u7684\u5de5\u5355{{ ticket.ticket }} \u5df2\u7ecf\u66f4\u65b0.\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\n\u539f\u59cb\u63cf\u8ff0:\r\n\r\n{{ ticket.description }}\r\n\r\n\u5df2\u6dfb\u52a0\u4ee5\u4e0b\u8bc4\u8bba:\r\n\r\n{{ comment }}\r\n\r\n\u672c\u4fe1\u606f {% if private %}\u8fd8\u6ca1\u6709{% else %} \u5df2\u7ecf {% endif %} \u90ae\u4ef6\u53d1\u9001\u7ed9\u63d0\u4ea4\u8005.\r\n\r\n\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.staff_url }}.\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u6e29\u99a8\u63d0\u793a, {{ ticket.submitter_email }} \u7684\u5de5\u5355 {{ ticket.ticket }} (\"{{ ticket.title }}\") \u5df2\u7ecf\u66f4\u65b0.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u5df2\u6dfb\u52a0\u4ee5\u4e0b\u8bc4\u8bba:
\r\n\r\n{{ comment }}\r\n\r\n
\u672c\u4fe1\u606f {% if private %} \u8fd8\u6ca1\u6709 {% else %} \u5df2\u7ecf {% endif %} \u90ae\u4ef6\u53d1\u9001\u7ed9\u63d0\u4ea4\u8005.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.012Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 111, + "fields": { + "template_name": "updated_owner", + "subject": "(\u5df2\u66f4\u65b0)", + "heading": "\u5de5\u5355\u5df2\u66f4\u65b0", + "plain_text": "\u60a8\u597d,\r\n\r\n\u6e29\u99a8\u63d0\u793a, \u63d0\u4ea4\u8005\u5206\u914d\u7ed9{{ ticket.submitter_email }} \u60a8\u7684\u5de5\u5355 {{ ticket.ticket }} (\"{{ ticket.title }}\") , \u5df2\u7ecf\u66f4\u65b0.\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}\r\n\u5f85\u529e: {{ queue.title }}\r\n\u6807\u9898: {{ ticket.title }}\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}\r\n\u4f18\u5148\u7ea7:{{ ticket.get_priority_display }}\r\n\u72b6\u6001: {{ ticket.get_status }}\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}\r\n\u5728\u7ebf\u67e5\u770b: {{ ticket.staff_url }} (\u9700\u8981\u767b\u5f55)\r\n\r\n\u539f\u59cb\u63cf\u8ff0:\r\n\r\n{{ ticket.description }}\r\n\r\n\u6dfb\u52a0\u4e86\u4e00\u4e0b\u8bc4\u8bba:\r\n\r\n{{ comment }}\r\n\r\n\u672c\u4fe1\u606f {% if private %}\u8fd8\u6ca1\u6709 {% endif %} \u90ae\u4ef6\u53d1\u9001\u7ed9\u63d0\u4ea4\u8005.\r\n\r\n\u5982\u679c\u60a8\u60f3\u5728\u7ebf\u67e5\u770b\uff0c \u53ef\u4ee5\u8bbf\u95ee {{ ticket.staff_url }}\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u6e29\u99a8\u63d0\u793a, \u5206\u914d\u7ed9\u60a8,\u63d0\u4ea4\u8005{{ ticket.submitter_email }}\u7684\u5de5\u5355{{ ticket.ticket }}, \u5df2\u7ecf\u66f4\u65b0.
\r\n\r\n\r\n\u5de5\u5355 ID: {{ ticket.ticket }}
\r\n\u5f85\u529e: {{ queue.title }}
\r\n\u6807\u9898: {{ ticket.title }}
\r\n\u5df2\u6253\u5f00: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\n\u63d0\u4ea4\u4eba: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\n\u4f18\u5148\u7ea7: {{ ticket.get_priority_display }}
\r\n\u72b6\u6001: {{ ticket.get_status }}
\r\n\u5df2\u5206\u914d\u7ed9: {{ ticket.get_assigned_to }}
\r\n\u5728\u7ebf\u67e5\u770b \u66f4\u65b0\u6b64\u5de5\u5355 (\u9700\u8981\u767b\u5f55)
\u539f\u5de5\u5355\u63cf\u8ff0\u53c2\u8003\uff1a:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
\u5df2\u6dfb\u52a0\u4ee5\u4e0b\u8bc4\u8bba:
\r\n\r\n{{ comment }}\r\n\r\n
\u672c\u4fe1\u606f {% if private %} \u8fd8\u672a {% else %} \u5df2\u7ecf {% endif %} been \u90ae\u4ef6\u53d1\u9001\u7ed9\u63d0\u4ea4\u8005.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.014Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 112, + "fields": { + "template_name": "updated_submitter", + "subject": "(\u5df2\u66f4\u65b0)", + "heading": "\u60a8\u7684\u5de5\u5355\u5df2\u7ecf\u66f4\u65b0", + "plain_text": "\u60a8\u597d,\r\n\r\n\u60a8\u6700\u8fd1\u8bb0\u5f55\u4e86\u4e3b\u9898\u4e3a\"{{ ticket.title }}\"\u7684\u5de5\u5355. \u6b64\u90ae\u4ef6\u662f\u544a\u77e5\u60a8\u5de5\u5355\u7684\u66f4\u65b0.\r\n\r\n\u5de5\u5355\u6dfb\u52a0\u4e86\u4ee5\u4e0b\u8bc4\u8bba {{ ticket.ticket }}:\r\n\r\n{{ comment }}\r\n\r\n\u5982\u679c\u4f60\u9700\u8981\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f, \u8bf7\u7ee7\u7eed\u4f7f\u7528\u90ae\u4ef6\u7684\u4e3b\u9898\u56de\u590d\u6b64\u90ae\u4ef6. \u6216\u8005\u60a8\u53ef\u4ee5\u5728\u7ebf\u67e5\u770b\u548c\u66f4\u65b0\u6b64\u5de5\u5355 {{ ticket.ticket_url }}\r\n\r\n", + "html": "\u60a8\u597d,
\r\n\r\n\u60a8\u6700\u8fd1\u8bb0\u5f55\u4e86\u4e3b\u9898\u4e3a{{ ticket.title }}\u7684\u5de5\u5355. \u6b64\u90ae\u4ef6\u662f\u544a\u77e5\u60a8\u5de5\u5355\u7684\u66f4\u65b0.
\r\n\r\n\u5de5\u5355\u6dfb\u52a0\u4e86\u4ee5\u4e0b\u8bc4\u8bba {{ ticket.ticket }}:
\r\n\r\n{{ comment }}\r\n\r\n
\u5982\u679c\u4f60\u9700\u8981\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f, \u8bf7\u7ee7\u7eed\u4f7f\u7528\u90ae\u4ef6\u7684\u4e3b\u9898\u56de\u590d\u6b64\u90ae\u4ef6. \u6216\u8005\u60a8\u53ef\u4ee5\u5728\u7ebf\u67e5\u770b\u548c\u66f4\u65b0\u6b64\u5de5\u5355 {{ ticket.ticket_url }}.
", + "locale": "zh", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.016Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 113, + "fields": { + "template_name": "newticket_cc", + "subject": "(Otwarte)", + "heading": "Zarejestrowane nowe zg\u0142oszenie", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nInformacja o nowo zarejestrowanym zg\u0142oszeniu.\r\n\r\nIdentyfikator zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nZobacz: {{ ticket.staff_url }} (wymagana autoryzacja)\r\n\r\nOryginalny opis zg\u0142oszenia:\r\n{{ ticket.description }}\r\n\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nInformacja o nowo zarejestrowanym zg\u0142oszeniu.
\r\n\r\n\r\nIdentyfikator: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.018Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 114, + "fields": { + "template_name": "newticket_submitter", + "subject": "(Otwarte)", + "heading": "Twoje zg\u0142oszenie zosta\u0142o zarejestowane", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce otrzymali\u015bmy Twoje zapytanie do dzia\u0142u pomocy technicznej o temacie \"{{ ticket.title }}\". \r\n\r\nNa tym etapie nie musisz robi\u0107 nic wi\u0119cej. Twoje zg\u0142oszenie otrzyma\u0142o numer {{ ticket.ticket }} i wkr\u00f3tce otrzymasz odpowied\u017a.\r\n\r\nJe\u015bli chcesz przes\u0142a\u0107 nam dalsze szczeg\u00f3\u0142y lub masz pytania dotycz\u0105ce tego zg\u0142oszenia, podaj w temacie identyfikator zg\u0142oszenia '{{ ticket.ticket }}'. Najprostrzym sposobem na zrobienie tego jest \"odpowied\u017a\" na t\u0119 wiadomo\u015b\u0107 e-mail.\r\n\r\nJe\u015bli chcesz wy\u015bwietli\u0107 to zg\u0142oszenie online, aby poda\u0107 dalsze informacje, za\u0142\u0105czy\u0107 pliki lub wy\u015bwietli\u0107 najnowsze aktualizacje, mo\u017cesz odwiedzi\u0107 stron\u0119 {{ ticket.ticket_url }}.\r\n\r\nZbadamy Twoje zapytanie i spr\u00f3bujemy je jak najszybciej rozwi\u0105za\u0107. Otrzymasz dalsze aktualizacje i rozwi\u0105zanie za po\u015brednictwem tego adresu e-mail.\r\n\r\n\r\n", + "html": "
Dzie\u0144 dobry,
\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce otrzymali\u015bmy Twoje zapytanie do dzia\u0142u pomocy technicznej o temacie {{ ticket.title }}.
\r\n\r\nNa tym etapie nie musisz robi\u0107 nic wi\u0119cej. Twoje zg\u0142oszenie otrzyma\u0142o numer {{ ticket.ticket }} i wkr\u00f3tce otrzymasz odpowied\u017a.
\r\n\r\ne\u015bli chcesz przes\u0142a\u0107 nam dalsze szczeg\u00f3\u0142y lub masz pytania dotycz\u0105ce tego zg\u0142oszenia, podaj w temacie identyfikator zg\u0142oszenia {{ ticket.ticket }}. Najprostrzym sposobem na zrobienie tego jest \"odpowied\u017a\" na t\u0119 wiadomo\u015b\u0107 e-mail.
\r\n\r\nJe\u015bli chcesz wy\u015bwietli\u0107 to zg\u0142oszenie online, aby poda\u0107 dalsze informacje, za\u0142\u0105czy\u0107 pliki lub wy\u015bwietli\u0107 najnowsze aktualizacje, mo\u017cesz odwiedzi\u0107 stron\u0119 {{ ticket.ticket_url }}.
\r\n\r\nZbadamy Twoje zapytanie i spr\u00f3bujemy je jak najszybciej rozwi\u0105za\u0107. Otrzymasz dalsze aktualizacje i rozwi\u0105zanie za po\u015brednictwem tego adresu e-mail.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.020Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 115, + "fields": { + "template_name": "assigned_cc", + "subject": "(Przypisane)", + "heading": "Zg\u0142oszenie przypisane", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce zg\u0142oszenie {{ ticket.ticket }} (\"{{ ticket.title }}\") na {{ ticket.submitter_email }} zosta\u0142o {% if ticket.assigned_to %}przypisane do {{ ticket.assigned_to }}{% else %}nieprzypisane{% endif %}.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} (wymagana autoryzacja)\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce zg\u0142oszenie {{ ticket.ticket }} ({{ ticket.title }}) na {{ ticket.submitter_email }} zosta\u0142o{% if ticket.assigned_to %} przypisane {{ ticket.assigned_to }}{% else %}nieprzypisane{% endif %}.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.023Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 116, + "fields": { + "template_name": "assigned_owner", + "subject": "(Przypisane Do Ciebie)", + "heading": "Zg\u0142oszenie przypisane do Ciebie", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce zg\u0142oszenie {{ ticket.ticket }} (\"{{ ticket.title }}\") od {{ ticket.submitter_email }} zosta\u0142o Ci przypisane.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} (wymagana autoryzacja)\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "html": "
Dzie\u0144 dobry,
\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce zg\u0142oszenie {{ ticket.ticket }} ({{ ticket.title }}) od {{ ticket.submitter_email }} zosta\u0142o Ciprzypisane.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.025Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 117, + "fields": { + "template_name": "updated_cc", + "subject": "(Zaktualizowane)", + "heading": "Zg\u0142oszenie zaktualizowane", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce zg\u0142oszenie {{ ticket.ticket }} (\"{{ ticket.title }}\") od {{ ticket.submitter_email }} zosta\u0142o zaktualizowane.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} ( wymagana autoryzacja )\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\n\r\nNast\u0119puj\u0105cy komentarz zosta\u0142 dodany:\r\n\r\n{{ comment }}\r\n\r\nTa informacja zosta\u0142a {% if private %}nie zosta\u0142a {% endif %} wys\u0142ana do zg\u0142aszaj\u0105cego.\r\n\r\nJe\u015bli chcesz zobaczy\u0107 to zg\u0142oszenie online, mo\u017cesz dokona\u0107 tego pod adresem {{ ticket.staff_url }}\r\n\r\n\r\n", + "html": "
Dzie\u0144 dobry,
\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce zg\u0142oszenie {{ ticket.ticket }} (\"{{ ticket.title }}\") od {{ ticket.submitter_email }} zosta\u0142o zaktualizowane.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Ta informacja zosta\u0142a {% if private %}nie zosta\u0142a {% endif %} wys\u0142ana do zg\u0142aszaj\u0105cego.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.027Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 118, + "fields": { + "template_name": "updated_owner", + "subject": "(Zaktualizowane)", + "heading": "Zg\u0142oszenie zaktualizowane", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce zg\u0142oszenie {{ ticket.ticket }} (\"{{ ticket.title }}\") od {{ ticket.submitter_email }}, kt\u00f3re zosta\u0142o Ci przydzielone, zosta\u0142o zaktualizowane.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} ( wymagana autoryzacja )\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\n\r\nNast\u0119puj\u0105cy komentarz zosta\u0142 dodany:\r\n\r\n{{ comment }}\r\n\r\nTa informacja zosta\u0142a {% if private %}nie zosta\u0142a {% endif %} wys\u0142ana do zg\u0142aszaj\u0105cego.\r\n\r\nJe\u015bli chcesz zobaczy\u0107 to zg\u0142oszenie online, mo\u017cesz dokona\u0107 tego pod adresem {{ ticket.staff_url }}\r\n\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce zg\u0142oszenie {{ ticket.ticket }} (\"{{ ticket.title }}\") od {{ ticket.submitter_email }}, kt\u00f3re zosta\u0142o Ci przydzielone, zosta\u0142o zaktualizowane.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Ta informacja zosta\u0142a {% if private %}nie zosta\u0142a {% endif %} wys\u0142ana do zg\u0142aszaj\u0105cego.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.029Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 119, + "fields": { + "template_name": "updated_submitter", + "subject": "(Zaktualizowane)", + "heading": "Twoje zg\u0142oszenie zosta\u0142o zaktualizowane", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nOstatnio zarejestrowa\u0142e\u015b u nas zg\u0142oszenie \"{{ ticket.title }}\". Ninejszy e-mail jest informacj\u0105 o aktualizacji tego zg\u0142oszenia.\r\n\r\nNast\u0119puj\u0105cy komentarz zosta\u0142 dodany do zg\u0142oszenia {{ ticket.ticket }}:\r\n\r\n{{ comment }}\r\n\r\nJe\u015bli chcesz przekaza\u0107 nam dodatkowe informacje, odpowiedz na tego e-maila zachowuj\u0105c tytu\u0142 tej wiadomo\u015bci w nienaruszonym stanie.\r\nOpcjonalnie, mo\u017cesz r\u00f3wnie\u017c wy\u015bwietli\u0107 i zaktualizowa\u0107 to zg\u0142oszenie online, odwiedzaj\u0105c stron\u0119 {{ ticket.ticket_url }}\r\n\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nOstatnio zarejestrowa\u0142e\u015b u nas zg\u0142oszenie {{ ticket.title }}. Ninejszy e-mail jest informacj\u0105 o aktualizacji tego zg\u0142oszenia.
\r\n\r\nNast\u0119puj\u0105cy komentarz zosta\u0142 dodany do zg\u0142oszenia {{ ticket.ticket }}:
\r\n\r\n{{ comment }}\r\n\r\n
Je\u015bli chcesz przekaza\u0107 nam dodatkowe informacje, odpowiedz na tego e-maila zachowuj\u0105c tytu\u0142 tej wiadomo\u015bci w nienaruszonym stanie. Opcjonalnie, mo\u017cesz r\u00f3wnie\u017c wy\u015bwietli\u0107 i zaktualizowa\u0107 to zg\u0142oszenie online, odwiedzaj\u0105c stron\u0119 {{ ticket.ticket_url }}.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.031Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 120, + "fields": { + "template_name": "resolved_cc", + "subject": "(Rozwi\u0105zane)", + "heading": "Zg\u0142oszenie rozwi\u0105zane", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nTw\u00f3j problem zosta\u0142 rozwi\u0105zany:\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} ( wymagana autoryzacja )\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\nRozwi\u0105zanie problemu:\r\n\r\n{{ ticket.resolution }}\r\n\r\nRozwi\u0105zanie problemu zosta\u0142o przes\u0142ane do osoby zg\u0142aszaj\u0105cej problem, kt\u00f3ra zweryfikuje zaproponowane rozwi\u0105zanie, zanim b\u0119dzie mo\u017cna zamkn\u0105\u0107 zg\u0142oszenie.\r\n\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nTw\u00f3j problem zosta\u0142 rozwi\u0105zany.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Rozwi\u0105zanie problemu:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Rozwi\u0105zanie problemu zosta\u0142o przes\u0142ane do osoby zg\u0142aszaj\u0105cej problem, kt\u00f3ra zweryfikuje zaproponowane rozwi\u0105zanie, zanim b\u0119dzie mo\u017cna zamkn\u0105\u0107 zg\u0142oszenie.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.033Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 121, + "fields": { + "template_name": "resolved_owner", + "subject": "(Rozwi\u0105zane)", + "heading": "Zg\u0142oszenie rozwi\u0105zane", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nZg\u0142oszenie przypisane do Ciebie zosta\u0142o rozwi\u0105zane.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} ( wymagana autoryzacja )\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\nRozwi\u0105zanie problemu:\r\n\r\n{{ ticket.resolution }}\r\n\r\nRozwi\u0105zanie problemu zosta\u0142o przes\u0142ane do osoby zg\u0142aszaj\u0105cej problem, kt\u00f3ra zweryfikuje zaproponowane rozwi\u0105zanie, zanim b\u0119dzie mo\u017cna zamkn\u0105\u0107 zg\u0142oszenie.\r\n\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nZg\u0142oszenie przypisane do Ciebie zosta\u0142o rozwi\u0105zane.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Rozwi\u0105zanie problemu:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Rozwi\u0105zanie problemu zosta\u0142o przes\u0142ane do osoby zg\u0142aszaj\u0105cej problem, kt\u00f3ra zweryfikuje zaproponowane rozwi\u0105zanie, zanim b\u0119dzie mo\u017cna zamkn\u0105\u0107 zg\u0142oszenie.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.035Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 122, + "fields": { + "template_name": "resolved_submitter", + "subject": "(Rozwi\u0105zane)", + "heading": "Twoje zg\u0142oszenie zosta\u0142o rozwi\u0105zane", + "plain_text": "Dzie\u0144 dobry, \r\n\r\nOstatnio zarejestrowa\u0142e\u015b u nas zg\u0142oszenie \"{{ ticket.title }}\". Ninejszy e-mail jest informacj\u0105 dla Ciebie, i\u017c uda\u0142o nam si\u0119 rozwi\u0105za\u0107 tw\u00f3j problem.\r\n\r\nNast\u0119puj\u0105ce rozwi\u0105zanie zosta\u0142o zaproponowane dla zg\u0142oszenia {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\nCzy mo\u017cesz potwierdzi\u0107, \u017ce to rozwi\u0105zane spe\u0142nia twoje potrzeby, aby\u015bmy mogli zamkn\u0105\u0107 to zg\u0142oszenie ? Je\u015bli masz dalsze pytania lub uwa\u017casz, \u017ce to rozwi\u0105zane jest satysfakcjonuj\u0105ce, odpowiedz na tego e-maila zachowuj\u0105c tytu\u0142 e-maila w nienaruszonym stanie.\r\n\r\nJe\u015bli chcesz zobaczy\u0107 Twoje zg\u0142oszenie online, prosz\u0119 wejd\u017a na stron\u0119 {{ ticket.ticket_url }}", + "html": "Dzie\u0144 dobry,
\r\n\r\nOstatnio zarejestrowa\u0142e\u015b u nas zg\u0142oszenie {{ ticket.title }} Ninejszy e-mail jest informacj\u0105 dla Ciebie, i\u017c uda\u0142o nam si\u0119 rozwi\u0105za\u0107 tw\u00f3j problem.
\r\n\r\nNast\u0119puj\u0105ce rozwi\u0105zanie zosta\u0142o zaproponowane dla zg\u0142oszenia {{ ticket.ticket }}:
\r\n\r\n{{ resolution }}\r\n\r\n
Czy mo\u017cesz potwierdzi\u0107, \u017ce to rozwi\u0105zane spe\u0142nia twoje potrzeby, aby\u015bmy mogli zamkn\u0105\u0107 to zg\u0142oszenie ? Je\u015bli masz dalsze pytania lub uwa\u017casz, \u017ce to rozwi\u0105zane jest satysfakcjonuj\u0105ce, odpowiedz na tego e-maila zachowuj\u0105c tytu\u0142 e-maila w nienaruszonym stanie.
\r\n\r\nJe\u015bli chcesz zobaczy\u0107 Twoje zg\u0142oszenie online, prosz\u0119 wejd\u017a na stron\u0119 {{ ticket.ticket_url }}.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.037Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 123, + "fields": { + "template_name": "closed_cc", + "subject": "(Zamkni\u0119te)", + "heading": "Zg\u0142oszenie zamkni\u0119te", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nzg\u0142oszenie {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, przypisane do {{ ticket.assigned_to }}{% endif %} zosta\u0142o zamkni\u0119te.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} ( wymagana autoryzacja )\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\nRozwi\u0105zanie problemu:\r\n\r\n{{ resolution }}\r\n\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nZg\u0142oszenie {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, przypisane {{ ticket.get_assigned_to }}{% endif %} zosta\u0142o zamkni\u0119te.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Rozwi\u0105zanie problemu:
\r\n\r\n{{ resolution }}\r\n\r\n
Je\u015bli chcesz zobaczy\u0107 Twoje zg\u0142oszenie online, prosz\u0119 wejd\u017a na stron\u0119 {{ ticket.ticket_url }}.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.039Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 124, + "fields": { + "template_name": "closed_owner", + "subject": "(Zamkni\u0119te)", + "heading": "Zg\u0142oszenie zamkni\u0119te", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nZg\u0142oszenie przypisane do Ciebie zosta\u0142o zamkni\u0119te.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} ( wymagana autoryzacja )\r\n\r\nJe\u015bli chcesz zobaczy\u0107 zg\u0142oszenie online, odwied\u017a stron\u0119 {{ ticket.staff_url }}\r\n\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nZg\u0142oszenie przypisane do Ciebie zosta\u0142o zamkni\u0119te.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Rozwi\u0105zanie problemu:
\r\n\r\n{{ ticket.resolution }}", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.041Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 125, + "fields": { + "template_name": "closed_submitter", + "subject": "(Zamkni\u0119te)", + "heading": "Zg\u0142oszenie zamkni\u0119te", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nOstatnio zarejestrowa\u0142e\u015b u nas zg\u0142oszenie \"{{ ticket.title }}\". Ninejszy e-mail jest informacj\u0105 dla Ciebie, i\u017c zg\u0142oszenie zosta\u0142o zamkni\u0119te.\r\n\r\nJe\u015bli uwa\u017casz, \u017ce dla tego zg\u0142oszenia w dalszym ci\u0105gu wymagana jest dalsza praca, daj nam zna\u0107. Po prostu odpowiedz na ten e-mail zachowuj\u0105c tytu\u0142 wiadomo\u015bci w nienaruszonym stanie.\r\n\r\nJe\u015bli chcesz zobaczy\u0107 Twoje zg\u0142oszenie online, prosz\u0119 wejd\u017a na stron\u0119 {{ ticket.ticket_url }}.\r\n\r\nRozwi\u0105zanie problemu:\r\n\r\n{{ ticket.resolution }}\r\n\r\n\r\n", + "html": "
Dzie\u0144 dobry,
\r\n\r\nOstatnio zarejestrowa\u0142e\u015b u nas zg\u0142oszenie {{ ticket.title }}. Ninejszy e-mail jest informacj\u0105 dla Ciebie, i\u017c zg\u0142oszenie zosta\u0142o zamkni\u0119te.
\r\n\r\nRozwi\u0105zanie problemu::
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Je\u015bli chcesz zobaczy\u0107 Twoje zg\u0142oszenie online, prosz\u0119 wejd\u017a na stron\u0119 {{ ticket.ticket_url }}. Je\u015bli uwa\u017casz, \u017ce dla tego zg\u0142oszenia w dalszym ci\u0105gu wymagana jest dalsza praca, daj nam zna\u0107. Po prostu odpowiedz na ten e-mail zachowuj\u0105c tytu\u0142 wiadomo\u015bci w nienaruszonym stanie.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.042Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 126, + "fields": { + "template_name": "escalated_cc", + "subject": "(Eskalacja)", + "heading": "Zmieniono priorytet zg\u0142oszenia", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce dla zg\u0142oszenia {{ ticket.ticket }} (\"{{ ticket.title }}\") zosta\u0142 zmieniony priorytet automatycznie.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} ( wymagana autoryzacja )\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\n\r\n", + "html": "Dzie\u0144 dobry,
\r\n\r\nTo jest wiadomo\u015b\u0107 e-mail z informacj\u0105, \u017ce dla zg\u0142oszenia {{ ticket.ticket }} ('{{ ticket.title }}') zosta\u0142 zmieniony priorytet automatycznie.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.044Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 127, + "fields": { + "template_name": "escalated_owner", + "subject": "(Eskalacja)", + "heading": "Zmienionio priorytet przydzielonego do Ciebie zg\u0142oszenia", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nDla zg\u0142oszenia, kt\u00f3re zosta\u0142o Tobie przypisane, zosta\u0142 autmoatycznie zmieniony jego priorytet, poniewa\u017c by\u0142o otwarte d\u0142u\u017cej ni\u017c oczekiwano.\r\n\r\nIdentyfikator Zg\u0142oszenia: {{ ticket.ticket }}\r\nKolejka: {{ queue.title }}\r\nTytu\u0142: {{ ticket.title }}\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Brak\" }}\r\nPriorytet: {{ ticket.get_priority_display }}\r\nStatus: {{ ticket.get_status }}\r\nPrzypisane Do: {{ ticket.get_assigned_to }}\r\nZobacz Online: {{ ticket.staff_url }} ( wymagana autoryzacja )\r\n\r\nOryginaly opis zg\u0142oszenia:\r\n\r\n{{ ticket.description }}\r\n\r\nPrzejrzyj to zg\u0142oszenie i postaraj si\u0119 jak najszybciej rozwi\u0105za\u0107 problem.\r\n\r\n\r\n", + "html": "
Dzie\u0144 dobry,
\r\n\r\nDla zg\u0142oszenia, kt\u00f3re zosta\u0142o Tobie przypisane, zosta\u0142 autmoatycznie zmieniony jego priorytet, poniewa\u017c by\u0142o otwarte d\u0142u\u017cej ni\u017c oczekiwano.
\r\n\r\n\r\nIdentyfikator Zg\u0142oszenia:: {{ ticket.ticket }}
\r\nKolejka: {{ queue.title }}
\r\nTytu\u0142: {{ ticket.title }}
\r\nData Zg\u0142oszenia: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZg\u0142aszaj\u0105cy: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorytet: {{ ticket.get_priority_display }}
\r\nStatus: {{ ticket.get_status }}
\r\nPrzypisane Do: {{ ticket.get_assigned_to }}
\r\nZobacz Online aby zaktualizowa\u0107 zg\u0142oszenie (wymagana autoryzacja)
Oryginalny opis zg\u0142oszenia:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.046Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 128, + "fields": { + "template_name": "escalated_submitter", + "subject": "(Eskalacja)", + "heading": "Zmieniono priorytet Twojego zg\u0142oszenia", + "plain_text": "Dzie\u0144 dobry,\r\n\r\nOstatnio zarejestrowa\u0142e\u015b u nas zg\u0142oszenie \"{{ ticket.title }}\". Ten e-mail ma na celu poinformowanie Ci\u0119 o automatycznej zmianie priorytetu dla Twojego zg\u0142oszenia, poniewa\u017c by\u0142 on otwarty d\u0142u\u017cej ni\u017c oczekiwano.\r\n\r\n\r\nNied\u0142ugo przejrzymy Twoje zg\u0142oszenie i postaramy si\u0119 jak najszybciej rozwi\u0105za\u0107 problem.\r\n\r\nJe\u015bli chcesz zobaczy\u0107 Twoje zg\u0142oszenie online, prosz\u0119 wejd\u017a na stron\u0119 {{ ticket.ticket_url }}.\r\n\r\n\r\n\r\n\r\n", + "html": "
Dzie\u0144 dobry,
\r\n\r\nOstatnio zarejestrowa\u0142e\u015b u nas zg\u0142oszenie {{ ticket.title }}. Ten e-mail ma na celu poinformowanie Ci\u0119 o automatycznej zmianie priorytetu dla Twojego zg\u0142oszenia, poniewa\u017c by\u0142 on otwarty d\u0142u\u017cej ni\u017c oczekiwano.
\r\n\r\nNied\u0142ugo przejrzymy Twoje zg\u0142oszenie i postaramy si\u0119 jak najszybciej rozwi\u0105za\u0107 problem.
\r\n\r\nJe\u015bli chcesz zobaczy\u0107 Twoje zg\u0142oszenie online, prosz\u0119 wejd\u017a na stron\u0119 {{ ticket.ticket_url }}.
", + "locale": "pl", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.048Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 129, + "fields": { + "template_name": "assigned_cc", + "subject": "(P\u0159i\u0159azeno)", + "heading": "Ticket p\u0159i\u0159azen", + "plain_text": "Dobr\u00fd den,\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem V\u00e1m d\u00e1v\u00e1me na v\u011bdom\u00ed, \u017ee ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") od {{ ticket.submitter_email }} {% if ticket.assigned_to %}byl p\u0159i\u0159azen {{ ticket.assigned_to }}{% else %}a nebyl nikomu p\u0159i\u0159azen{% endif %}.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nProhl\u00e9dnout on-line: {{ ticket.staff_url }}\r\n\r\nP\u016fvodn\u00ed zad\u00e1n\u00ed ticketu je:\r\n\r\n{{ ticket.description }}", + "html": "Dobr\u00fd den,
\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem V\u00e1m d\u00e1v\u00e1me na v\u011bdom\u00ed, \u017ee ticket {{ ticket.ticket }} ({{ ticket.title }}) od {{ ticket.submitter_email }} {% if ticket.assigned_to %}byl p\u0159i\u0159azen {{ ticket.assigned_to }}{% else %}nebyl nikomu p\u0159i\u0159azen{% endif %}.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nProhl\u00e9dnout Online pro aktualizaci (je pot\u0159eba se p\u0159ihl\u00e1sit)
P\u016fvodn\u00ed zad\u00e1n\u00ed ticketu:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.049Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 130, + "fields": { + "template_name": "assigned_owner", + "subject": "(Ticket V\u00e1m byl p\u0159i\u0159azen)", + "heading": "Ticket V\u00e1m byl p\u0159i\u0159azen", + "plain_text": "Dobr\u00fd den,\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem V\u00e1m d\u00e1v\u00e1me na v\u011bdom\u00ed, \u017ee ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") od {{ ticket.submitter_email }} V\u00e1m byl p\u0159i\u0159azen.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159zeno: V\u00c1M\r\nProhl\u00e9dnout online: {{ ticket.staff_url }}\r\n\r\nP\u016fvodn\u00ed popis ticketu byl:\r\n\r\n{{ ticket.description }}", + "html": "
Hello,
\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem V\u00e1m d\u00e1v\u00e1me na v\u011bdom\u00ed, \u017ee ticket {{ ticket.ticket }} ({{ ticket.title }}) od {{ ticket.submitter_email }} V\u00e1m byl p\u0159i\u0159azen.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: V\u00c1M
\r\nProhl\u00e9dnout online pro aktualizaci (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
P\u016fvodn\u00ed popis ticketu byl:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.053Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 131, + "fields": { + "template_name": "closed_cc", + "subject": "(Uzav\u0159eno)", + "heading": "Ticket Closed", + "plain_text": "Dobr\u00fd den,\r\n\r\nTicket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, p\u0159i\u0159azen\u00fd {{ ticket.assigned_to }}{% endif %} byl uzav\u0159en.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159en\u00fd: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nProhl\u00e9dnout online: {{ ticket.staff_url }} (nutn\u00e9 p\u0159\u00edhl\u00e1\u0161en\u00ed)\r\n\r\nP\u016fvodn\u00ed popis byl:\r\n\r\n{{ ticket.description }}\r\n\r\nUzav\u0159en\u00ed z d\u016fvodu:\r\n\r\n{{ resolution }}", + "html": "
Dobr\u00fd den,
\r\n\r\nTicket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, p\u0159i\u0159azen\u00fd {{ ticket.assigned_to }}{% endif %} byl uzav\u0159en.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nProhl\u00e9dnout online nebo aktualizovat (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
P\u016fvodn\u00ed popis:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
D\u016fvod uzav\u0159en\u00ed:
\r\n\r\n{{ resolution }}", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.055Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 132, + "fields": { + "template_name": "closed_owner", + "subject": "(Uzav\u0159eno)", + "heading": "Ticket uzav\u0159en", + "plain_text": "Dobr\u00fd den,\r\n\r\nTicket {{ ticket.title }} (\"{{ ticket.title }}\") p\u0159i\u0159azen\u00fd V\u00c1M byl uzav\u0159en\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159en\u00fd: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: Vy\r\nProhl\u00e9dnout online: {{ ticket.staff_url }} (nutn\u00e9 p\u0159\u00edhl\u00e1\u0161en\u00ed)\r\n\r\nP\u016fvodn\u00ed popis byl:\r\n\r\n{{ ticket.description }}\r\n\r\nUzav\u0159en\u00ed z d\u016fvodu:\r\n\r\n{{ resolution }}", + "html": "
Dobr\u00fd den,
\r\n\r\nTicket {{ ticket.title }} (\"{{ ticket.title }}\") p\u0159i\u0159azen\u00fd V\u00e1m byl uzav\u0159en.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: V\u00e1m
\r\nProhl\u00e9dnout online nebo aktualizovat (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
P\u016fvodn\u00ed popis:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
D\u016fvod uzav\u0159en\u00ed:
\r\n\r\n{{ resolution }}", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.057Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 133, + "fields": { + "template_name": "closed_submitter", + "subject": "(Uzav\u0159eno)", + "heading": "Ticket uzav\u0159en", + "plain_text": "Dobr\u00fd den,\r\n\r\nned\u00e1vno jste n\u00e1m zadali ticket \"{{ ticket.title }}\". T\u00edmto e-mailem V\u00e1m potvrzujeme jeho uzav\u0159en\u00ed.\r\n\r\nPokud si mysl\u00edte, \u017ee ticket vy\u017eaduje dal\u0161\u00ed pr\u00e1ci, dejte n\u00e1m pros\u00edm v\u011bd\u011bt odpov\u011bd\u00ed na tento e-mail bez zm\u011bn\u011bn\u00e9ho p\u0159edm\u011btu zpr\u00e1vy.\r\n\r\nPokud si p\u0159ejete nahl\u00e1dnout na ticket on-line, nav\u0161tivte {{ ticket.ticket_url }}.\r\n\r\nD\u016fvod roz\u0159e\u0161en\u00ed:\r\n\r\n{{ ticket.resolution }}", + "html": "
Dobr\u00fd den,
\r\n\r\nned\u00e1vno jste n\u00e1m zadali ticket \"{{ ticket.title }}\". T\u00edmto e-mailem V\u00e1m potvrzujeme jeho uzav\u0159en\u00ed.
\r\n\r\nD\u016fvod roz\u0159e\u0161en\u00ed:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Pokud si p\u0159ejete prohl\u00eddnout ticket on-line, nav\u0161tivte {{ ticket.ticket_url }}. Pokud si mysl\u00edte, \u017ee ticket vy\u017eaduje dal\u0161\u00ed pr\u00e1ci, dejte n\u00e1m pros\u00edm v\u011bd\u011bt odpov\u011bd\u00ed na tento e-mail bez zm\u011bn\u011bn\u00e9ho p\u0159edm\u011btu zpr\u00e1vy.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.059Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 134, + "fields": { + "template_name": "escalated_cc", + "subject": "(Vyhroceno)", + "heading": "Ticket vyhrocen", + "plain_text": "Dobr\u00fd den,\r\n\r\nTicket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, p\u0159i\u0159azen\u00fd {{ ticket.assigned_to }}{% endif %} byl automaticky vyhrocen.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159en\u00fd: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nProhl\u00e9dnout online: {{ ticket.staff_url }} (nutn\u00e9 p\u0159\u00edhl\u00e1\u0161en\u00ed)\r\n\r\nP\u016fvodn\u00ed popis byl:\r\n\r\n{{ ticket.description }}", + "html": "Dobr\u00fd den,
\r\n\r\nTicket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, p\u0159i\u0159azen\u00fd {{ ticket.assigned_to }}{% endif %} automaticky vyhrocen.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nProhl\u00e9dnout online nebo aktualizovat (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
P\u016fvodn\u00ed popis:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.062Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 135, + "fields": { + "template_name": "escalated_owner", + "subject": "(Vyhroceno)", + "heading": "V\u00e1\u0161 p\u0159i\u0159azen\u00fd ticket byl vyhrocen", + "plain_text": "Dobr\u00fd den,\r\n\r\nticket, kter\u00fd V\u00e1m je p\u0159i\u0159azen byl automaticky vyhrocen, proto\u017ee byl otev\u0159en del\u0161\u00ed dobu, ne\u017e se \u010dekalo.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159en\u00fd: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nProhl\u00e9dnout online: {{ ticket.staff_url }} (nutn\u00e9 p\u0159\u00edhl\u00e1\u0161en\u00ed)\r\n\r\nP\u016fvodn\u00ed popis byl:\r\n\r\n{{ ticket.description }}\r\n\r\nPros\u00edm pod\u00edvejte se na ticket a pokuste se ho roz\u0159e\u0161it co nejd\u0159\u00edve.", + "html": "
Dobr\u00fd den,
\r\n\r\nticket, kter\u00fd V\u00e1m je p\u0159i\u0159azen byl automaticky vyhrocen, proto\u017ee byl otev\u0159en del\u0161\u00ed dobu, ne\u017e se \u010dekalo.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nProhl\u00e9dnout online nebo aktualizovat (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
P\u016fvodn\u00ed popis:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n\r\n
Pros\u00edm pod\u00edvejte se na ticket a pokuste se ho roz\u0159e\u0161it co nejd\u0159\u00edve.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.064Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 136, + "fields": { + "template_name": "escalated_submitter", + "subject": "(Vyhroceno)", + "heading": "Ticket vyhrocen", + "plain_text": "Dobr\u00fd den,\r\n\r\nned\u00e1vno jste n\u00e1m zadali ticket \"{{ ticket.title }}\". T\u00edmto e-mailem V\u00e1s upozor\u0148ujeme na automatick\u00e9 vyhrocen\u00ed ticketu, proto\u017ee byl otev\u0159en d\u00e9le ne\u017e se o\u010dek\u00e1valo.\r\n\r\nBudeme se sna\u017eit o jeho nejrychlej\u0161\u00ed vy\u0159e\u0161en\u00ed.\r\n\r\nPokud si p\u0159ejete nahl\u00e1dnout na ticket on-line, nav\u0161tivte {{ ticket.ticket_url }}.", + "html": "Dobr\u00fd den,
\r\n\r\nned\u00e1vno jste n\u00e1m zadali ticket \"{{ ticket.title }}\". T\u00edmto e-mailem V\u00e1s upozor\u0148ujeme na automatick\u00e9 vyhrocen\u00ed ticketu, proto\u017ee byl otev\u0159en d\u00e9le ne\u017e se o\u010dek\u00e1valo.
\r\n\r\nBudeme se sna\u017eit o jeho nejrychlej\u0161\u00ed vy\u0159e\u0161en\u00ed.
\r\n\r\nPokud si p\u0159ejete nahl\u00e1dnout na ticket on-line, nav\u0161tivte {{ ticket.ticket_url }}.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.066Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 137, + "fields": { + "template_name": "newticket_cc", + "subject": "(Otev\u0159en\u00fd)", + "heading": "Zalo\u017een nov\u00fd ticket", + "plain_text": "Dobr\u00fd den,\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem V\u00e1m d\u00e1v\u00e1me na v\u011bdom\u00ed, \u017ee ticket byl zalo\u017een\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nProhl\u00e9dnout on-line: {{ ticket.staff_url }}\r\n\r\nZad\u00e1n\u00ed ticketu je:\r\n\r\n{{ ticket.description }}", + "html": "Dobr\u00fd den,
\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem V\u00e1m d\u00e1v\u00e1me na v\u011bdom\u00ed, \u017ee ticket byl zalo\u017een.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nProhl\u00e9dnout Online pro aktualizaci (je pot\u0159eba se p\u0159ihl\u00e1sit)
Zad\u00e1n\u00ed:
\r\n\r\n{{ ticket.description|linebreaksbr }}", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.069Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 138, + "fields": { + "template_name": "newticket_submitter", + "subject": "(Otev\u0159en)", + "heading": "V\u00e1\u0161 ticket byl zalo\u017een", + "plain_text": "Dobr\u00fd den,\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem V\u00e1m d\u00e1v\u00e1me v\u011bd\u011bt, \u017ee jsme p\u0159ijali ticket \"{{ ticket.title }}\". \r\n\r\nV tuto chv\u00edli nemus\u00edte d\u011blat nic. V\u00e1\u0161 ticket dostal \u010d\u00edslo {{ ticket.ticket }} a v kr\u00e1tk\u00e9 dob\u011b se k n\u011bmu dostaneme a odpov\u00edme V\u00e1m.\r\n\r\nP\u0159ejte-li si dostat dal\u0161\u00ed detaily nebo m\u00e1te-li jak\u00fdkoliv dotaz stran ticketu, p\u0159idejte pros\u00edm do p\u0159edm\u011btu Va\u0161eho e-mailu \u010d\u00edslo ticketu '{{ ticket.ticket }}'. Nejsn\u00e1ze tak u\u010din\u00edte, pokud odpov\u00edte na tento e-mail.\r\n\r\nPod\u00edv\u00e1me se na probl\u00e9m a pokus\u00edme se ho co nejd\u0159\u00edve vy\u0159e\u0161it. Dal\u0161\u00ed detaily V\u00e1m budeme ps\u00e1t na tuto e-mailovou adresu.Pokud se pot\u0159ebujete pod\u00edvat ticket online, p\u0159idat soubory nebo dal\u0161\u00ed detaily, nav\u0161tivte {{ ticket.ticket_url }}.", + "html": "
Dobr\u00fd den,
\r\n\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem V\u00e1m d\u00e1v\u00e1me v\u011bd\u011bt, \u017ee jsme p\u0159ijali ticket {{ ticket.title }}.
\r\n\r\nV tuto chv\u00edli nemus\u00edte d\u011blat nic. V\u00e1\u0161 ticket dostal \u010d\u00edslo {{ ticket.ticket }} a v kr\u00e1tk\u00e9 dob\u011b se k n\u011bmu dostaneme a odpov\u00edme V\u00e1m.
\r\n\r\nP\u0159ejte-li si dostat dal\u0161\u00ed detaily nebo m\u00e1te-li jak\u00fdkoliv dotaz stran ticketu, p\u0159idejte pros\u00edm do p\u0159edm\u011btu Va\u0161eho e-mailu \u010d\u00edslo ticketu {{ ticket.ticket }}. Nejsn\u00e1ze tak u\u010din\u00edte, pokud odpov\u00edte na tento e-mail.
\r\n\r\nPokud se pot\u0159ebujete pod\u00edvat ticket online, p\u0159idat soubory nebo dal\u0161\u00ed detaily, nav\u0161tivte {{ ticket.ticket_url }}.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.071Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 139, + "fields": { + "template_name": "resolved_cc", + "subject": "(Roz\u0159e\u0161eno)", + "heading": "Ticket roz\u0159e\u0161en", + "plain_text": "Dobr\u00fd den,\r\n\r\nticket byl roz\u0159e\u0161en\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nOn-line: {{ ticket.staff_url }} (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)\r\n\r\nP\u016fvodn\u00ed popis ticketu:\r\n\r\n{{ ticket.description }}\r\n\r\nRoz\u0159e\u0161en\u00ed:\r\n\r\n{{ ticket.resolution }}\r\n\r\nToto roz\u0159e\u0161en\u00ed bylo zasl\u00e1no e-mailem zadavateli, kter\u00fd \u0159e\u0161en\u00ed ov\u011b\u0159\u00ed a potom jej bude mo\u017en\u00e9 uzav\u0159\u00edt.", + "html": "Dobr\u00fd den,
\r\n\r\nTicket byl roz\u0159e\u0161en.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nOn-line (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
P\u016fvodn\u00ed popis:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Roz\u0159e\u0161en\u00ed:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Toto roz\u0159e\u0161en\u00ed bylo zasl\u00e1no e-mailem zadavateli, kter\u00fd \u0159e\u0161en\u00ed ov\u011b\u0159\u00ed a potom jej bude mo\u017en\u00e9 uzav\u0159\u00edt.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.073Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 140, + "fields": { + "template_name": "resolved_owner", + "subject": "(Roz\u0159e\u0161eno)", + "heading": "Ticket roz\u0159e\u0161en", + "plain_text": "Dobr\u00fd den,\r\n\r\nticket p\u0159i\u0159azen\u00fd V\u00e1m byl pr\u00e1v\u011b roz\u0159e\u0161en\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadaatel: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nOn-line: {{ ticket.staff_url }} po\u017eadov\u00e1no p\u0159ihl\u00e1\u0161en\u00ed)\r\n\r\nP\u016fvodn\u00ed popis:\r\n\r\n{{ ticket.description }}\r\n\r\nRoz\u0159e\u0161en\u00ed:\r\n\r\n{{ ticket.resolution }}\r\n\r\nRoz\u0159e\u0161en\u00ed bylo posl\u00e1no e-mailem zadavateli, kter\u00fd jej potvrd\u00ed a potom bude mo\u017en\u00e9 ticket zav\u0159\u00edt", + "html": "Dobr\u00fd den,
\r\n\r\nticket p\u0159i\u0159azen\u00fd V\u00e1m byl pr\u00e1v\u011b roz\u0159e\u0161en
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nProhl\u00e9dnout on-line (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
P\u016fvodn\u00ed zad\u00e1n\u00ed:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
Roz\u0159e\u0161en\u00ed:
\r\n\r\n{{ ticket.resolution }}\r\n\r\n
Roz\u0159e\u0161en\u00ed bylo posl\u00e1no e-mailem zadavateli, kter\u00fd jej potvrd\u00ed a potom bude mo\u017en\u00e9 ticket zav\u0159\u00edt.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.075Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 141, + "fields": { + "template_name": "resolved_submitter", + "subject": "(Roz\u0159e\u0161eno)", + "heading": "V\u00e1\u0161 ticket byl roz\u0159e\u0161en", + "plain_text": "Dobr\u00fd den,\r\n\r\nned\u00e1vno jste n\u00e1m zadali ticket \"{{ ticket.title }}\". T\u00edmto e-mailem bychom V\u00e1s r\u00e1di informovali o jeho roz\u0159e\u0161en\u00ed.\r\n\r\nK ticketu {{ ticket.ticket }} bylo zad\u00e1no n\u00e1sleduj\u00edc\u00ed roz\u0159e\u0161en\u00ed:\r\n\r\n{{ resolution }}\r\n\r\nPros\u00edme V\u00e1s o potvrzen\u00ed, \u017ee toto roz\u0159e\u0161en\u00ed skute\u010dn\u011b \u0159e\u0161\u00ed Va\u0161e pot\u0159eby a my m\u016f\u017eeme ticket zav\u0159\u00edt. Pokud m\u00e1te jak\u00e9koliv dal\u0161\u00ed dotazy nebo pokud si mysl\u00edte, \u017ee \u0159e\u0161en\u00ed nen\u00ed adekv\u00e1tn\u00ed, odpov\u011bzte na tento e-mail a ponechte nezm\u011bn\u011bn\u00fd p\u0159edm\u011bt.\r\n\r\nPro on-line spr\u00e1vu pros\u00edm nav\u0161tivte {{ ticket.ticket_url }}", + "html": "Dobr\u00fd den,
\r\n\r\nned\u00e1vno jste n\u00e1m zadali ticket {{ ticket.title }}. T\u00edmto e-mailem bychom V\u00e1s r\u00e1di informovali o jeho roz\u0159e\u0161en\u00ed.
\r\n\r\nK ticketu {{ ticket.ticket }}: bylo zad\u00e1no n\u00e1sleduj\u00edc\u00ed roz\u0159e\u0161en\u00ed:
\r\n\r\n{{ resolution }}\r\n\r\n
Pros\u00edme V\u00e1s o potvrzen\u00ed, \u017ee toto roz\u0159e\u0161en\u00ed skute\u010dn\u011b \u0159e\u0161\u00ed Va\u0161e pot\u0159eby a my m\u016f\u017eeme ticket zav\u0159\u00edt. Pokud m\u00e1te jak\u00e9koliv dal\u0161\u00ed dotazy nebo pokud si mysl\u00edte, \u017ee \u0159e\u0161en\u00ed nen\u00ed adekv\u00e1tn\u00ed, odpov\u011bzte na tento e-mail a ponechte nezm\u011bn\u011bn\u00fd p\u0159edm\u011bt.
\r\n\r\nPro on-line spr\u00e1vu pros\u00edm nav\u0161tivte {{ ticket.ticket_url }}.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.077Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 142, + "fields": { + "template_name": "updated_cc", + "subject": "(Aktualizov\u00e1no)", + "heading": "Ticket aktualizov\u00e1n", + "plain_text": "Dobr\u00fd den,\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem bychom V\u00e1s r\u00e1di informovali, \u017ee ticket {{ ticket.ticket }} od {{ ticket.submitter_email }} byl aktualizov\u00e1n.\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nOn-line: {{ ticket.staff_url }} (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)\r\n\r\nPopis:\r\n\r\n{{ ticket.description }}\r\n\r\nP\u0159idan\u00fd koment\u00e1\u0159:\r\n\r\n{{ comment }}\r\n\r\nTato informace {% if private %}ne{% endif %}byla posl\u00e1na e-mailem zadavateli.\r\n\r\nPro on-line spr\u00e1vu ticketu nav\u0161tivte {{ ticket.staff_url }}.", + "html": "Dobr\u00fd den,
\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem bychom V\u00e1s r\u00e1di informovali, \u017ee ticket {{ ticket.ticket }} od {{ ticket.submitter_email }} byl aktualizov\u00e1n.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nOn-oline pro aktualizci (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
Popis:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
P\u0159idan\u00fd koment\u00e1\u0159:
\r\n\r\n{{ comment }}\r\n\r\n
Tato informace{% if private %}ne{% endif %}byla posl\u00e1na e-mailem zadavateli.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.079Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 143, + "fields": { + "template_name": "updated_owner", + "subject": "(Aktualizov\u00e1no)", + "heading": "Ticket aktualizov\u00e1n", + "plain_text": "Dobr\u00fd den,\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem bychom V\u00e1s r\u00e1di informovali, \u017ee V\u00e1\u0161 ticket {{ ticket.ticket }} od {{ ticket.submitter_email }} byl aktualizov\u00e1n.\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}\r\nFronta: {{ queue.title }}\r\nNadpis: {{ ticket.title }}\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nZadavatel: {{ ticket.submitter_email|default:\"Nezn\u00e1m\u00fd\" }}\r\nPriorita: {{ ticket.get_priority_display }}\r\nStav: {{ ticket.get_status }}\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}\r\nOn-line: {{ ticket.staff_url }} (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)\r\n\r\nPopis:\r\n\r\n{{ ticket.description }}\r\n\r\nP\u0159idan\u00fd koment\u00e1\u0159:\r\n\r\n{{ comment }}\r\n\r\nTato informace {% if private %}ne{% endif %}byla posl\u00e1na e-mailem zadavateli.\r\n\r\nPro on-line spr\u00e1vu ticketu nav\u0161tivte {{ ticket.staff_url }}.", + "html": "Dobr\u00fd den,
\r\n\r\nt\u00edmto automaticky generovan\u00fdm e-mailem bychom V\u00e1s r\u00e1di informovali, \u017ee V\u00e1\u0161 ticket {{ ticket.ticket }} od {{ ticket.submitter_email }} byl aktualizov\u00e1n.
\r\n\r\n\r\nTicket ID: {{ ticket.ticket }}
\r\nFronta: {{ queue.title }}
\r\nNadpis: {{ ticket.title }}
\r\nOtev\u0159eno: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nZadavatel: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorita: {{ ticket.get_priority_display }}
\r\nStav: {{ ticket.get_status }}
\r\nP\u0159i\u0159azeno: {{ ticket.get_assigned_to }}
\r\nOn-oline pro aktualizci (nutn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed)
Popis:
\r\n\r\n{{ ticket.description|linebreaksbr }}\r\n\r\n
P\u0159idan\u00fd koment\u00e1\u0159:
\r\n\r\n{{ comment }}\r\n\r\n
Tato informace{% if private %}ne{% endif %}byla posl\u00e1na e-mailem zadavateli.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.081Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 144, + "fields": { + "template_name": "updated_submitter", + "subject": "(Aktualizov\u00e1no)", + "heading": "V\u00e1\u0161 ticket byl aktualizov\u00e1n", + "plain_text": "Dobr\u00fd den,\r\n\r\nned\u00e1vno jste n\u00e1m zadali ticket \"{{ ticket.title }}\". T\u00edmto e-mailem bychom V\u00e1s r\u00e1di informovali o jeho aktualizaci.\r\n\r\nK ticketu {{ ticket.ticket }} byl p\u0159id\u00e1n n\u00e1sleduj\u00edc\u00ed koment\u00e1\u0159:\r\n\r\n{{ comment }}\r\n\r\nPokud pot\u0159ebujete p\u0159idat dal\u0161\u00ed informace, pros\u00edm odpov\u011bzte na tento e-mail a ponechte p\u016fvodn\u00ed p\u0159edm\u011bt. Dal\u0161\u00ed mo\u017enost\u00ed je nav\u0161t\u00edvit p\u0159\u00edmo formul\u00e1\u0159 ticketu na adrese {{ ticket.ticket_url }}.", + "html": "Dobr\u00fd den,
\r\n\r\nned\u00e1vno jste n\u00e1m zadali ticket {{ ticket.title }}. T\u00edmto e-mailem bychom V\u00e1s r\u00e1di informovali o jeho aktualizaci.
\r\n\r\nK ticketu {{ ticket.ticket }} byl p\u0159id\u00e1n n\u00e1sleduj\u00edc\u00ed koment\u00e1\u0159::
\r\n\r\n{{ comment }}\r\n\r\n
Pokud pot\u0159ebujete p\u0159idat dal\u0161\u00ed informace, pros\u00edm odpov\u011bzte na tento e-mail a ponechte p\u016fvodn\u00ed p\u0159edm\u011bt. Dal\u0161\u00ed mo\u017enost\u00ed je nav\u0161t\u00edvit p\u0159\u00edmo formul\u00e1\u0159 ticketu na adrese {{ ticket.ticket_url }}.
", + "locale": "cs", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.083Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 145, + "fields": { + "template_name": "vendor_notify_newcase", + "subject": "{{ subject }}", + "heading": "New Case Available", + "plain_text": "Hello,\r\n\r\n{{ body }}\r\n\r\nView Online: {{ case.case_url }}\r\n\r\nAccess to the case requires a VINCE account. If you do not have an account, please create an account: {{ signup_url }}\r\n\r\nThank you,\r\n{{ team.team_signature }}", + "html": "Hello,
\r\n\r\n{{ body }}
\r\n\r\n\r\nView Online for more information (login required)
\r\n{{ case.case_url }}
\r\n\r\n\r\nAccess to the case requires a VINCE account. If you do not have an account, please create an account.\r\n
\r\n\r\nThank you,
\r\n{{ team.team_signature }}\r\n
Hello,
Hello, you have been requested to join VINCE in the group {{ group }} by {{ groupadmin }}. Please create a VINCE account and you will be able to view any vulnerability case information associated with {{ group }}.
Sign up here: {{ signup }}
Thank you,\r\n
{{ team_signature }}
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that a case you are working on has been updated.
\r\n\r\n\r\nCase ID: {{ case.vu_vuid }}
\r\nOwner: {{ case.owner }}
\r\nCase Opened: {{ case.created|date:\"l N jS Y, \\a\\t P\"}}
\r\nModified: {{ case.modified|date:\"l N jS Y, \\a\\t P\" }}
\r\nModified By: {{ action.user }}
\r\nView Online to update this ticket (login required)
Description:
\r\n\r\n{{ action.title|linebreaksbr }}", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.090Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 148, + "fields": { + "template_name": "case_new_post", + "subject": "(New Post)", + "heading": "Case has New Post", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that a case you are working on has a new post.\r\n\r\n{{ action.title }}\r\n\r\nCase ID: {{ case.vu_vuid }}\r\nOwner: {{ case.owner }}\r\nCase Opened: {{ case.created|date:\"l N jS Y, \\a\\t P\" }}\r\nPost Time: {{ case.modified|date:\"l N jS Y, \\a\\t P\" }}\r\nView Online: {{ case.case_url }} (login required)", + "html": "
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that a case you are working on has a new post in VinceComm.
\r\n\r\n\r\nCase ID: {{ case.vu_vuid }}
\r\nOwner: {{ case.owner }}
\r\nCase Opened: {{ case.created|date:\"l N jS Y, \\a\\t P\"}}
\r\nModified: {{ case.modified|date:\"l N jS Y, \\a\\t P\" }}
\r\nView Online to update this ticket (login required)
Description:
\r\n\r\n{{ action.title|linebreaksbr }}", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-15T19:09:38.066Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 149, + "fields": { + "template_name": "case_new_message", + "subject": "(New Message in Case)", + "heading": "New Case Message", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that someone has messaged you about a case you are working on.\r\n\r\nCase ID: {{ case.vu_vuid}} {{ case.case_url }} \r\nOwner: {{ case.owner }}\r\nCase Opened: {{ case.created|date:\"l N jS Y, \\a\\t P\" }}\r\nMessage Received: {{ case.modified|date:\"l N jS Y, \\a\\t P\" }}\r\nView Online: {{ ticket.staff_url }} (login required)", + "html": "
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that a someone has messaged you about a case you are working on.
\r\n\r\n\r\nCase ID: {{ case.vu_vuid }}
\r\nOwner: {{ case.owner }}
\r\nCase Opened: {{ case.created|date:\"l N jS Y, \\a\\t P\"}}
\r\nMessage Received: {{ case.modified|date:\"l N jS Y, \\a\\t P\" }}
\r\nView Online to update this ticket (login required)
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that a vendor has updated their status for a case you are working on.
\r\n\r\n\r\nCase ID: {{ case.vu_vuid }}
\r\nOwner: {{ case.owner }}
\r\nCase Opened: {{ case.created|date:\"l N jS Y, \\a\\t P\"}}
\r\nModified: {{ case.modified|date:\"l N jS Y, \\a\\t P\" }}
\r\nView Online to update this ticket (login required)
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that a case {{ case.vu_vuid }} has been assigned to you by {{ case.assignee }}
\r\n\r\n\r\nCase ID: {{ case.vu_vuid }}
\r\nOwner: {{ case.owner }}
\r\nCase Opened: {{ case.created|date:\"l N jS Y, \\a\\t P\"}}
\r\nModified: {{ case.modified|date:\"l N jS Y, \\a\\t P\" }}
\r\nModified By: {{ action.user }}
\r\nStatus: {{ case.get_status }}
\r\nAssigned to: YOU
\r\nView Online to update this ticket (login required)
Description:
\r\n\r\n{{ action.title|linebreaksbr }}", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.099Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 152, + "fields": { + "template_name": "new_message", + "subject": "(New Message in VINCE)", + "heading": "New Message", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that {% if thread.from_group %}{{ thread.from_group }}{% else %}{{ message.sender }}{% endif %} has sent you a message. Please login to view the message. \r\n\r\n{% if thread.case %}\r\nMessage refers to Case: {{ thread.case }}\r\n{% endif %}\r\nSent at: {{ message.created|date:\"c\" }}\r\nView Online: {{ message.message_url }} (login required)", + "html": "
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that {% if thread.from_group %}{{ thread.from_group }}{% else %}{{ message.sender }}{% endif %} has sent you a message. Please login to view the message.
\r\n\r\n\r\n{% if thread.case %}\r\nMessage refers to Case: {{ thread.case }}
\r\n{% endif %}\r\nSent at: {{ message.created|date:\"c\" }}
\r\nView Online to reply to this message (login required)
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that {% if thread.from_group %}{{ thread.from_group }}{% else %}{{ message.sender }}{% endif %} has sent you a message. Please login to view the message.
\r\n\r\nSent at: {{ message.created|date:\"c\" }}
\r\nView Online to reply to this message (login required)
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that a case you are working on has been updated.
\r\n\r\n\r\nCase {{ case.vu_vuid }}: {{ case.vu_vuid }}
\r\n
\r\nTicket ID: {{ ticket.ticket }}
\r\nOpened: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSubmitter: {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nView Online to update this ticket (login required)
Hello,
\r\n\r\n{{ body }}
\r\n\r\n\r\nView Online for more information (login required)
\r\n{{ case.case_url }}
\r\n\r\n\r\nAccess to the case requires a VINCE account. If you do not have an account, please create an account.\r\n
\r\n\r\nThank you,
\r\n{{ team.team_signature }}\r\n
Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that you were tagged in a post by {{ mentioned_by }} for a case you're involved with.\r\n
\r\n\r\n\r\n\r\nView Online to view the contents of the post (login required).
\r\n\r\nIf you would prefer to not receive email notifications, please login to change your email preferences.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.109Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 157, + "fields": { + "template_name": "group_tagged", + "subject": "{% if tracking %}{{ tracking }}{% endif %} {{ vuid }} Your organization was tagged in a post.", + "heading": "Your organization was tagged in a post in Case {{vuid}}.", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that your organization was tagged in a post by {{ mentioned_by }} for a case you're involved with.\r\n\r\nTo view the post:\r\n\r\nView Online: {{ post_link }} (login required)\r\n\r\nIf you would prefer to not receive email notifications, please login to change your email preferences.", + "html": "Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that your organization was tagged in a post by {{ mentioned_by }} for a case you're involved with.\r\n
\r\n\r\n\r\n\r\nView Online to view the contents of the post (login required).
\r\n\r\nIf you would prefer to not receive email notifications, please login to change your email preferences.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.110Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 158, + "fields": { + "template_name": "approve_user", + "subject": "Your VINCE account has been approved", + "heading": "Account approved", + "plain_text": "Hello, \r\n\r\nThis is a courtesy e-mail to let you know that your VINCE account has been approved. You can now login to view the status of any reports and cases you are involved in.\r\n\r\n{{ login_url }}\r\n\r\nThank you,\r\n{{ team_signature }}", + "html": "Hello,
This is a courtesy e-mail to let you know that your VINCE account has been approved. You can now login to view the status of any reports and cases you are involved in.
\r\n\r\n{{login_url}}\r\n\r\nThank you,
\r\n\r\n{{ team_signature }}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.112Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 159, + "fields": { + "template_name": "enable_mfa", + "subject": "MFA successfully enabled", + "heading": "MFA successfully enabled", + "plain_text": "Hello, \r\n\r\nThis is a courtesy e-mail to let you know that multi-factor authentication (MFA) was successfully enabled on your VINCE account.\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.", + "html": "Hello,
This is a courtesy e-mail to let you know that multi-factor authentication (MFA) was successfully enabled on your account.
\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n
\r\n\r\n\r\nThank you,
\r\n\r\n{{team_signature}}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.114Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 160, + "fields": { + "template_name": "mfa_removed", + "subject": "MFA successfully removed", + "heading": "MFA successfully removed", + "plain_text": "Hello, \r\n\r\nThis is a courtesy e-mail to let you know that multi-factor authentication (MFA) was successfully disabled on your VINCE account.\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n\r\nThank you,\r\n\r\n{{ team_signature }}", + "html": "Hello,
This is a courtesy e-mail to let you know that multi-factor authentication (MFA) was successfully disabled on your account.
\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n
\r\n\r\n\r\nThank you,
\r\n\r\n{{ team_signature }}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.116Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 161, + "fields": { + "template_name": "blank_body", + "subject": "{% if vrf %}{{ vrf }} (Updated){% else %}{{ subject}} {% endif %}", + "heading": "{% if vrf %}{{ vrf }}{{ subject }}{% else %}{% endif %}", + "plain_text": "{{ body }}\r\n\r\n{% if caseurl %}\r\nView Online: {{ caseurl }}\r\n\r\nAccess to the case requires a VINCE account. If you do not have an account, please register at {{ signup_url }} to create an account.\r\n{% endif %}", + "html": "{{ body }}
\r\n\r\n\r\n{% if caseurl %}\r\nView Online for more information (login required)
\r\n\r\n\r\nAccess to the case requires a VINCE account. If you do not have an account, please create an account.\r\n{% endif %}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.118Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 162, + "fields": { + "template_name": "new_post", + "subject": "{% if tracking %}{{ tracking }}{% endif %} [{{vuid}}] New Post in Case Discussion", + "heading": "New Post", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that there is a new post in the case discussion for a case you're involved with.\r\n\r\nTo view the post:\r\n\r\nView Online: {{ post_link }} (login required)\r\n\r\n\r\nIf you would prefer to not receive email notifications, please login to change your email preferences.", + "html": "Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that there is a new post in the case discussion for a case you're involved with.\r\n
\r\n\r\n\r\n\r\nView Online to view the contents of the post (login required).
\r\n\r\nIf you would prefer to not receive email notifications, please login to change your email preferences.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.131Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 163, + "fields": { + "template_name": "vendor_approve_stmt", + "subject": "[{{case.vu_vuid}}] Statement Approved", + "heading": "Statement Approved", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that your status/statement has been approved.\r\n\r\nView Online: {{ case.vt_case_url }}\r\n\r\nThank you,\r\n{{ team_signature }}", + "html": "Hello,
\r\n\r\nThis is a courtesy e-mail to let you know your status/statement has been approved by CERT/CC.
\r\n\r\n\r\nView Online for more information (login required)
\r\n{{ case.vt_case_url }}
\r\n\r\n\r\nAccess to the case requires a VINCE account. If you do not have an account, please create an account.\r\n
\r\n\r\nThank you,
\r\n{{ team_signature }}\r\n
Hello,
This is a courtesy e-mail to let you know that your password was recently changed on your VINCE account.
\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n
\r\n\r\n\r\nThank you,
\r\n\r\n{{ team_signature }}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.134Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 165, + "fields": { + "template_name": "new_tracking", + "subject": "{{ tracking }} Tracking ID Added for {{vuid}}", + "heading": "Tracking ID {{ tracking }} added", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that a tracking ID ({{tracking}})was recently added to the VINCE Case {{vuid}}.\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n\r\nThank you,\r\n\r\n{{ team_signature }}", + "html": "Hello,
This is a courtesy e-mail to let you know that a tracking ID ({{tracking}}) was recently added to the VINCE Case {{ vuid }}.
\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n
\r\n\r\n\r\nThank you,
\r\n\r\n{{ team_signature }}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.136Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 166, + "fields": { + "template_name": "pinned_post", + "subject": "{% if tracking %}{{ tracking }}{% endif %} [{{vuid}}] New Post in Case Discussion", + "heading": "New Post from Coordination Team", + "plain_text": "Hello,\r\n\r\nThis is a courtesy e-mail to let you know that you there is a new post from the coordination team in the case discussion for a case you're involved with.\r\n\r\nTo view the post:\r\n\r\nView Online: {{ post_link }} (login required)", + "html": "Hello,
\r\n\r\nThis is a courtesy e-mail to let you know that you there is a new post from the coordination team in the case discussion for a case you're involved with.\r\n
\r\n\r\n\r\n\r\nView Online to view the contents of the post (login required).
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.138Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 167, + "fields": { + "template_name": "blank_body_no_sig", + "subject": "{{ subject }}", + "heading": "{{ subject }}", + "plain_text": "{{ body }}\r\n\r\n{% if caseurl %}\r\nView Online: {{ caseurl }}\r\n\r\nAccess to the case requires a VINCE account. If you do not have an account, please register at {{ signup_url }} to create an account.\r\n{% endif %}", + "html": "{{ body }}
\r\n\r\n\r\n{% if caseurl %}\r\nView Online for more information (login required)
\r\n\r\n\r\nAccess to the case requires a VINCE account. If you do not have an account, please create an account.\r\n{% endif %}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.142Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 168, + "fields": { + "template_name": "mfa_reset_request", + "subject": "(Reply Requested)", + "heading": "MFA Reset Requested", + "plain_text": "Hello,\r\n\r\nWe have recently received a request to reset the multi-factor authentication (MFA) on your VINCE account. Before we can do that, we would appreciate a reply to this email confirming your request. Please retain {{ ticket.ticket }} in the subject for tracking purposes.\r\n\r\nIf you use SMS as your MFA method, please verify your phone number in your email response.\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n\r\nThank you,\r\n\r\n{{ team.team_signature }}", + "html": "Hello,
We have recently received a request to reset the multi-factor authentication (MFA) on your VINCE account. Before we can do that, we would appreciate a reply to this email confirming your request. Please retain {{ ticket.ticket }} in the subject for tracking purposes.
\r\nIf you use SMS as your MFA method, please verify your phone number in your email response.
\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n
\r\n\r\nThank you,
\r\n\r\n{{ team.team_signature }}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.143Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 169, + "fields": { + "template_name": "default_vendor", + "subject": "New Case Available", + "heading": "", + "plain_text": "We have new information about a vulnerability that may affect your products. Please login to VINCE for more information about this vulnerability.", + "html": "", + "locale": "en", + "body_only": true, + "user": 1, + "modified": "2021-11-11T16:35:33.145Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 170, + "fields": { + "template_name": "default_participant", + "subject": "Invitation to Participate in Vulnerability Coordination", + "heading": "", + "plain_text": "You have been invited to participate in an active vulnerability disclosure case. Please login to VINCE for more information about this case.", + "html": "", + "locale": "en", + "body_only": true, + "user": 1, + "modified": "2021-11-11T16:35:33.147Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 171, + "fields": { + "template_name": "vincecomm_add_existing_user", + "subject": "Invitation to join {{ group }} on VINCE", + "heading": "Invitation to join {{ group }} on VINCE", + "plain_text": "Hello, you have been invited to access cases in VINCE for the group {{ group }} by {{ groupadmin }}. You will now be able to view vulnerability case information associated with {{ group }}. This is a courtesy notification. No immediate action is required. \r\n\r\nThank you, \r\n\r\n{{team_signature}}", + "html": "Hello,
Hello, you have been invited to access cases in VINCE for the group {{ group }} by {{ groupadmin }}. You will now be able to view vulnerability case information associated with {{ group }}.
This is a courtesy notification. No immediate action is required.
\r\n\r\n Thank you,\r\n
{{team_signature}}
Hello {{ username }}.
You have enabled daily emails for case notifications. Here's what you missed in the last 24 hours...
\r\n\r\n\r\n{% autoescape off %}{{ digest }}{% endautoescape %}\r\n
\r\n\r\nLogin to VINCE to see the full details.
\r\n\r\nCheers,
\r\n\r\n{{ team_signature }}\r\n
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.151Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 173, + "fields": { + "template_name": "vt_daily_digest", + "subject": "VINCE Daily Activity", + "heading": "Here's what you missed ...", + "plain_text": "Hello {{ username }},\r\n\r\nYou have enabled daily emails for case notifications. Here's what you may have missed in the last 24 hours in your cases:\r\n\r\n{{ digest }}\r\n\r\nLogin to VINCE to see the full details.", + "html": "Hello {{ username }}.
You have enabled daily emails for case notifications. Here's what you may have missed in the last 24 hours in your cases:
\r\n\r\n\r\n{% autoescape off %}{{ digest }}{% endautoescape %}\r\n
\r\n\r\nLogin to VINCE to see the full details.
", + "locale": "en", + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.152Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 174, + "fields": { + "template_name": "service_account_created", + "subject": "Service Account Created", + "heading": "Service Account Created", + "plain_text": "Hello, \r\n\r\nThis is a courtesy e-mail to let you know that a service account was created for your organization. This account will have API access to your organization's case information.\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n\r\nThank you,\r\n\r\n{{ team_signature }}", + "html": "Hello,
This is a courtesy e-mail to let you know that a service account was created for your organization. This account will have API access to your organization's case information.
\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n
\r\n\r\n\r\nThank you,
\r\n\r\n{{team_signature}}\r\n
", + "locale": null, + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.197Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 175, + "fields": { + "template_name": "service_account_change", + "subject": "Service Account Change", + "heading": "Service Account API Key Change", + "plain_text": "Hello, \r\n\r\nThis is a courtesy e-mail to let you know that someone has generated a new API key for the VINCE service account associated with your organization.\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n\r\nThank you,\r\n\r\n{{team_signature }}", + "html": "Hello,
This is a courtesy e-mail to let you know that someone has generated a new API key for the VINCE service account associated with your organization
\r\n\r\nIf you did not initiate this change, please let us know as soon as possible.\r\n
\r\n\r\n\r\nThank you,
\r\n\r\n{{ team_signature }}\r\n
", + "locale": null, + "body_only": false, + "user": null, + "modified": "2021-11-11T16:35:33.202Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 176, + "fields": { + "template_name": "user_verification", + "subject": "VINCE Verification", + "heading": "", + "plain_text": "Greetings,\r\n\r\nWe received a request from [EMAIL] to be associated with the [VENDOR] vendor contact within VINCE. We are reaching out to the team to ensure that this request is legitimate and that person can receive alerts on behalf of [VENDOR] before giving them access. Could a team member please confirm this? If approved, we can also make this user the administrator of the group so that they can handle future user requests and manage the team's access.\r\n\r\nRegards,\r\n\r\n[team_signature]", + "html": "", + "locale": "en", + "body_only": true, + "user": 1, + "modified": "2021-11-11T16:35:33.204Z" + } +}, +{ + "model": "vince.emailtemplate", + "pk": 177, + "fields": { + "template_name": "vendor_admin_user_request", + "subject": "VINCE Vendor User Maintenance Request", + "heading": "", + "plain_text": "Greetings--\r\n\r\nA user with email address [EMAIL] is asking to join the [VENDOR] group. Please add this user to your VINCE group if the user should have access, or please reply to let me know that the user should not receive access and I can convey that to the user.\r\n\r\nRegards,\r\n\r\n[team_signature]", + "html": "", + "locale": "en", + "body_only": true, + "user": 1, + "modified": "2021-11-11T16:35:33.207Z" + } +} +] diff --git a/vince/fixtures/TicketQueue.json b/vince/fixtures/TicketQueue.json new file mode 100644 index 0000000..bab06fe --- /dev/null +++ b/vince/fixtures/TicketQueue.json @@ -0,0 +1,67 @@ +[ +{ + "model": "vince.ticketqueue", + "pk": 1, + "fields": { + "title": "CR", + "slug": "cr", + "new_ticket_cc": null, + "updated_ticket_cc": null, + "default_owner": 1, + "queue_type": 2, + "from_email": "vince-email" + } +}, +{ + "model": "vince.ticketqueue", + "pk": 2, + "fields": { + "title": "Case", + "slug": "case", + "new_ticket_cc": null, + "updated_ticket_cc": null, + "default_owner": null, + "queue_type": 3, + "from_email": "vince-email" + } +}, +{ + "model": "vince.ticketqueue", + "pk": 3, + "fields": { + "title": "Vendor", + "slug": "vendor", + "new_ticket_cc": null, + "updated_ticket_cc": null, + "default_owner": 1, + "queue_type": 4, + "from_email": "vince-email" + } +}, +{ + "model": "vince.ticketqueue", + "pk": 4, + "fields": { + "title": "General", + "slug": "general", + "new_ticket_cc": null, + "updated_ticket_cc": null, + "default_owner": 1, + "queue_type": 1, + "from_email": "vince-email" + } +}, +{ + "model": "vince.ticketqueue", + "pk": 5, + "fields": { + "title": "Inbox", + "slug": "inbox", + "new_ticket_cc": null, + "updated_ticket_cc": null, + "default_owner": null, + "queue_type": 4, + "from_email": "vince-email" + } +} +] diff --git a/vince/fixtures/auth_group.json b/vince/fixtures/auth_group.json new file mode 100644 index 0000000..d90d9f1 --- /dev/null +++ b/vince/fixtures/auth_group.json @@ -0,0 +1,9 @@ +[ + { + "model": "auth.group", + "pk": 1, + "fields": { + "name": "vince" + } + } +] diff --git a/vince/fixtures/cwe_regular.json b/vince/fixtures/cwe_regular.json new file mode 100644 index 0000000..ad30e53 --- /dev/null +++ b/vince/fixtures/cwe_regular.json @@ -0,0 +1,129 @@ +{"examples": [ +"CWE-20 Improper Input Validation", +"CWE-129 Improper Validation of Array Index", +"CWE-74 Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')", +"CWE-1236 Improper Neutralization of Formula Elements in a CSV File", +"CWE-77 Improper Neutralization of Special Elements used in a Command ('Command Injection')", +"CWE-78 Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')", +"CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')", +"CWE-88 Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')", +"CWE-89 Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')", +"CWE-91 XML Injection (aka Blind XPath Injection)", +"CWE-917 Improper Neutralization of Special Elements used in an Expression Language Statement ('Expression Language Injection')", +"CWE-94 Improper Control of Generation of Code ('Code Injection')", +"CWE-116 Improper Encoding or Escaping of Output", +"CWE-838 Inappropriate Encoding for Output Context", +"CWE-119 Improper Restriction of Operations within the Bounds of a Memory Buffer", +"CWE-120 Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')", +"CWE-125 Out-of-bounds Read", +"CWE-787 Out-of-bounds Write", +"CWE-824 Access of Uninitialized Pointer", +"CWE-200 Exposure of Sensitive Information to an Unauthorized Actor", +"CWE-203 Observable Discrepancy", +"CWE-209 Generation of Error Message Containing Sensitive Information", +"CWE-532 Insertion of Sensitive Information into Log File", +"CWE-269 Improper Privilege Management", +"CWE-287 Improper Authentication", +"CWE-290 Authentication Bypass by Spoofing", +"CWE-294 Authentication Bypass by Capture-replay", +"CWE-295 Improper Certificate Validation", +"CWE-306 Missing Authentication for Critical Function", +"CWE-307 Improper Restriction of Excessive Authentication Attempts", +"CWE-521 Weak Password Requirements", +"CWE-522 Insufficiently Protected Credentials", +"CWE-640 Weak Password Recovery Mechanism for Forgotten Password", +"CWE-798 Use of Hard-coded Credentials", +"CWE-311 Missing Encryption of Sensitive Data", +"CWE-312 Cleartext Storage of Sensitive Information", +"CWE-319 Cleartext Transmission of Sensitive Information", +"CWE-326 Inadequate Encryption Strength", +"CWE-327 Use of a Broken or Risky Cryptographic Algorithm", +"CWE-916 Use of Password Hash With Insufficient Computational Effort", +"CWE-330 Use of Insufficiently Random Values", +"CWE-331 Insufficient Entropy", +"CWE-335 Incorrect Usage of Seeds in Pseudo-Random Number Generator (PRNG)", +"CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG)", +"CWE-345 Insufficient Verification of Data Authenticity", +"CWE-346 Origin Validation Error", +"CWE-347 Improper Verification of Cryptographic Signature", +"CWE-352 Cross-Site Request Forgery (CSRF)", +"CWE-354 Improper Validation of Integrity Check Value", +"CWE-924 Improper Enforcement of Message Integrity During Transmission in a Communication Channel", +"CWE-362 Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')", +"CWE-367 Time-of-check Time-of-use (TOCTOU) Race Condition", +"CWE-400 Uncontrolled Resource Consumption", +"CWE-770 Allocation of Resources Without Limits or Throttling", +"CWE-920 Improper Restriction of Power Consumption", +"CWE-404 Improper Resource Shutdown or Release", +"CWE-401 Missing Release of Memory after Effective Lifetime", +"CWE-459 Incomplete Cleanup", +"CWE-763 Release of Invalid Pointer or Reference", +"CWE-772 Missing Release of Resource after Effective Lifetime", +"CWE-436 Interpretation Conflict", +"CWE-444 Inconsistent Interpretation of HTTP Requests ('HTTP Request Smuggling')", +"CWE-610 Externally Controlled Reference to a Resource in Another Sphere", +"CWE-1021 Improper Restriction of Rendered UI Layers or Frames", +"CWE-384 Session Fixation", +"CWE-601 URL Redirection to Untrusted Site ('Open Redirect')", +"CWE-611 Improper Restriction of XML External Entity Reference", +"CWE-918 Server-Side Request Forgery (SSRF)", +"CWE-662 Improper Synchronization", +"CWE-667 Improper Locking", +"CWE-665 Improper Initialization", +"CWE-1188 Insecure Default Initialization of Resource", +"CWE-908 Use of Uninitialized Resource", +"CWE-909 Missing Initialization of Resource", +"CWE-668 Exposure of Resource to Wrong Sphere", +"CWE-134 Use of Externally-Controlled Format String", +"CWE-426 Untrusted Search Path", +"CWE-427 Uncontrolled Search Path Element", +"CWE-428 Unquoted Search Path or Element", +"CWE-552 Files or Directories Accessible to External Parties", +"CWE-669 Incorrect Resource Transfer Between Spheres", +"CWE-212 Improper Removal of Sensitive Information Before Storage or Transfer", +"CWE-434 Unrestricted Upload of File with Dangerous Type", +"CWE-494 Download of Code Without Integrity Check", +"CWE-565 Reliance on Cookies without Validation and Integrity Checking", +"CWE-829 Inclusion of Functionality from Untrusted Control Sphere", +"CWE-670 Always-Incorrect Control Flow Implementation", +"CWE-617 Reachable Assertion", +"CWE-672 Operation on a Resource after Expiration or Release", +"CWE-415 Double Free", +"CWE-416 Use After Free", +"CWE-613 Insufficient Session Expiration", +"CWE-674 Uncontrolled Recursion", +"CWE-776 Improper Restriction of Recursive Entity References in DTDs ('XML Entity Expansion')", +"CWE-682 Incorrect Calculation", +"CWE-131 Incorrect Calculation of Buffer Size", +"CWE-190 Integer Overflow or Wraparound", +"CWE-191 Integer Underflow (Wrap or Wraparound)", +"CWE-193 Off-by-one Error", +"CWE-369 Divide By Zero", +"CWE-697 Incorrect Comparison", +"CWE-704 Incorrect Type Conversion or Cast", +"CWE-681 Incorrect Conversion between Numeric Types", +"CWE-843 Access of Resource Using Incompatible Type ('Type Confusion')", +"CWE-706 Use of Incorrectly-Resolved Name or Reference", +"CWE-178 Improper Handling of Case Sensitivity", +"CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')", +"CWE-59 Improper Link Resolution Before File Access ('Link Following')", +"CWE-732 Incorrect Permission Assignment for Critical Resource", +"CWE-276 Incorrect Default Permissions", +"CWE-281 Improper Preservation of Permissions", +"CWE-754 Improper Check for Unusual or Exceptional Conditions", +"CWE-252 Unchecked Return Value", +"CWE-273 Improper Check for Dropped Privileges", +"CWE-476 NULL Pointer Dereference", +"CWE-755 Improper Handling of Exceptional Conditions", +"CWE-834 Excessive Iteration", +"CWE-835 Loop with Unreachable Exit Condition ('Infinite Loop')", +"CWE-862 Missing Authorization", +"CWE-425 Direct Request ('Forced Browsing')", +"CWE-863 Incorrect Authorization", +"CWE-639 Authorization Bypass Through User-Controlled Key", +"CWE-913 Improper Control of Dynamically-Managed Code Resources", +"CWE-470 Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')", +"CWE-502 Deserialization of Untrusted Data", +"CWE-915 Improperly Controlled Modification of Dynamically-Determined Object Attributes", +"CWE-922 Insecure Storage of Sensitive Information" +]} diff --git a/vince/forms.py b/vince/forms.py new file mode 100644 index 0000000..64604b0 --- /dev/null +++ b/vince/forms.py @@ -0,0 +1,2954 @@ +######################################################################### +# VINCE +# +# Copyright 2022 Carnegie Mellon University. +# +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE ENGINEERING +# INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON +# UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +# AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR +# PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE +# MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND +# WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# +# Released under a MIT (SEI)-style license, please see license.txt or contact +# permission@sei.cmu.edu for full terms. +# +# [DISTRIBUTION STATEMENT A] This material has been approved for public +# release and unlimited distribution. Please see Copyright notice for non-US +# Government use and distribution. +# +# Carnegie Mellon®, CERT® and CERT Coordination Center® are registered in the +# U.S. Patent and Trademark Office by Carnegie Mellon University. +# +# This Software includes and/or makes use of Third-Party Software each subject +# to its own license. +# +# DM21-1126 +######################################################################## +from datetime import timedelta, date +from django import forms +# from django_summernote.widgets import SummernoteWidget, SummernoteInplaceWidget +# from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from django.utils.translation import gettext, gettext_lazy as _ +from django_countries.widgets import CountrySelectWidget +from vince.lib import create_followup +from vince.lib import process_attachments, simple_merge, add_participant_vinny_case, add_coordinator_case, send_worker_email_all +from vince.mailer import send_newticket_mail, send_participant_email_notification +from django.conf import settings +from vinny.models import VTCaseRequest, CRFollowUp, VinceTrackAttachment, VinceAttachment, Case +# from django.utils import timezone +# from django.contrib.auth.forms import UserCreationForm +# from django.contrib.auth.models import User +from vince.models import * +from re import search +from django.core.exceptions import ValidationError +from vince.settings import DEFAULT_USER_SETTINGS, VULNOTE_TEMPLATE +from vince.permissions import get_user_gen_queue +import traceback +import os +from django.utils.encoding import smart_text +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + + + +class AllSearchForm(forms.Form): + searchbar = forms.CharField(max_length=100, label='Keyword(s)', widget=forms.TextInput(), required=False) + + +class RolesForm(forms.Form): + + assigned_to = forms.ChoiceField( + widget=forms.Select(attrs={'class': 'form-control'}), + choices=(), + required=False, + label=_('Assign a User'), + ) + + +class TeamSettingsForm(forms.Form): + + outgoing_email = forms.EmailField( + required=False, + label=_('Outgoing Email Address'), + widget=forms.TextInput(attrs={'class': 'form-control', 'readonly':'readonly'}), + help_text=_('This is the email address that will be used to send official case notifications ' + 'to VINCE users. Editing this field requires superuser permissions.'), + ) + + vulnote_template = forms.CharField( + widget=forms.Textarea(), + label=_('Vulnerability Note Template'), + initial=VULNOTE_TEMPLATE, + required=False + ) + + team_signature = forms.CharField( + widget=forms.Textarea(), + label=_('Email Signature'), + required=False + ) + + email_phone = forms.CharField( + label=_("Phone number in email footer"), + widget=forms.TextInput(attrs={'class': 'form-control', 'readonly':'readonly'}), + required=False, + help_text=_('Edit this in your team\'s public contact info in VINCEComm.'), + max_length=20 + ) + + email_email = forms.EmailField( + required=False, + label=_('Team email to use in email footer'), + help_text=_('Edit this in your team\'s Public Contact Info in VINCEComm.'), + widget=forms.TextInput(attrs={'class': 'form-control', 'readonly': 'readonly'}), + ) + + cna_email = forms.EmailField( + required=False, + label=_('Email to use for CVE assignment'), + help_text=('If not set, this will default to the team email field above, or the default VINCE email if team email is not set.'), + widget=forms.TextInput(attrs={'class':'form-control'}) + ) + + disclosure_link = forms.URLField( + required=False, + label=_('Link to disclosure guidance'), + help_text=_('Disclosure guidance is presented to case members at first view of case'), + ) + + def __init__(self, *args, **kwargs): + super(TeamSettingsForm, self).__init__(*args, **kwargs) + #if setting is not set for this user, set to default + + +class PreferencesForm(forms.Form): + + case_template = forms.ChoiceField( + widget = forms.Select(attrs={'class': 'form-control'}), + choices = (), + required = False, + label=_('Default Case Template'), + help_text=_('All new cases created by you will use this case template.') + ) + + new_tickets = forms.MultipleChoiceField( + choices=[], + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'})) + + updated_tickets = forms.MultipleChoiceField( + choices=[], + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'})) + + email_case_changes = forms.MultipleChoiceField( + choices=[(1, 'Immediately'), (2, 'Once Daily')], + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}), + required=False) + + email_new_posts = forms.MultipleChoiceField( + choices=[(1, 'Immediately'), (2, 'Once Daily')], + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}), + required=False) + + email_new_messages = forms.MultipleChoiceField( + choices=[(1, 'Immediately'), (2, 'Once Daily')], + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}), + required=False) + + email_new_status = forms.MultipleChoiceField( + choices=[(1, 'Immediately'), (2, 'Once Daily')], + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}), + required=False) + + email_tasks = forms.MultipleChoiceField( + choices=[(1, 'Immediately'), (2, 'Once Daily')], + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}), + required=False) + + triage_role = forms.BooleanField(required=False) + + login_view_ticketlist = forms.BooleanField( + label=_('Show Ticket List on Login?'), + help_text=_('Display the ticket list upon login? Otherwise, the dashboard is shown.'), + required=False, + ) + + email_on_ticket_change = forms.BooleanField( + label=_('E-mail me on ticket change?'), + required=False) + + email_on_ticket_assign = forms.BooleanField( + label=_('E-mail me when assigned a ticket?'), + required=False) + + tickets_per_page = forms.ChoiceField( + label=_('Number of tickets to show per page'), + help_text=_('How many tickets do you want to see on the Ticket List page?'), + required=False, + choices=((10, '10'), (25, '25'), (50, '50'), (100, '100')), + ) + + email_preference = forms.ChoiceField( + choices=[(1, 'HTML'), (2, 'Plain Text')], + label='Which email format do you prefer?', + widget=forms.RadioSelect(attrs={'class':'ul_nobullet horizontal_bullet'}), + required=False) + + + reminder_tickets = forms.BooleanField( + label=_('Remind me about tickets open > 14 days?'), + required=False) + + reminder_publication = forms.BooleanField( + label=_('Remind me about case expected publish dates?'), + required=False) + + reminder_vendor_views = forms.BooleanField( + label=_('Remind me about vendors that have not viewed a case?'), + required=False) + + reminder_vendor_status = forms.BooleanField( + label=_('Remind me about vendors that have not submitted status?'), + required=False) + + reminder_cases = forms.BooleanField( + label=_('Remind me about active cases that have not been modified > 14 days?'), + required=False) + + def __init__(self, *args, **kwargs): + super(PreferencesForm, self).__init__(*args, **kwargs) + #if setting is not set for this user, set to default + logger.debug("THIS IS THE INITIAL") + logger.debug(self.initial) + if self.initial.get('templates'): + self.fields['case_template'].choices = self.initial.get('templates') + + for x,y in DEFAULT_USER_SETTINGS.items(): + if self.initial.get(x) is None: + if self.fields.get(x): + self.fields[x].initial=y + else: + if self.initial.get(x) == True: + #a lot of preferences have changed from T/F to multiple choice + if self.fields.get(x): + self.fields[x].initial = y + + + +class CreateVulNote(forms.Form): + + content = forms.CharField( + widget=forms.Textarea(), + label=_('Contents'), + required=False, + initial=VULNOTE_TEMPLATE + ) + + title = forms.CharField( + label=_('Title'), + ) + + summary = forms.CharField( + label=_('Revision comment'), + help_text=_("Write a brief message for the vulnote history (change)log."), + initial=_('Initial vul note.'), + required = False) + + references = forms.CharField( + widget=forms.Textarea(attrs={'rows': 4}), + label=_('References'), + required=False, + help_text=_("References should be valid URLs separated by a new line.")) + + def __init__(self, *args, **kwargs): + self.case = kwargs.pop("case") + self.references = kwargs.pop('references') + super(CreateVulNote, self).__init__(*args, **kwargs) + self.fields['title'].initial = self.case.title + self.fields['content'].initial = f"{VULNOTE_TEMPLATE}" + self.fields['references'].initial = "\r\n".join(self.references) + if self.case.team_owner: + if self.case.team_owner.groupsettings.vulnote_template: + if self.case.get_assigned_to: + self.fields['content'].initial = f"{self.case.team_owner.groupsettings.vulnote_template}This document was written by {self.case.get_assigned_to}.\r\n" + else: + self.fields['content'].initial = f"{self.case.team_owner.groupsettings.vulnote_template}.\r\n" + elif self.case.get_assigned_to: + self.fields['content'].initial = f"{VULNOTE_TEMPLATE}This document was written by {self.case.get_assigned_to}.\r\n" + +class VulNoteReviewForm(forms.Form): + content = forms.CharField( + widget=forms.Textarea(), + label=_('Contents') + ) + + feedback = forms.CharField( + widget=forms.Textarea(attrs={'rows': 4}), + label=_('Feedback'), + required=False, + help_text=_("General feedback/comments about this vulnerability note.")) + + current_revision = forms.IntegerField( + required=False, + widget=forms.HiddenInput() + ) + + completed = forms.BooleanField( + required=False, + widget=forms.HiddenInput() + ) + + approved = forms.BooleanField( + required=False, + widget=forms.HiddenInput() + ) + + +class EditVulNote(forms.Form): + content = forms.CharField( + widget=forms.Textarea(), + label=_('Contents') + ) + + title = forms.CharField( + label=_('Title'), + ) + + summary = forms.CharField( + label=_('Revision comment'), + help_text=_("Write a brief message for the vulnote history (change)log."), + required = False) + + current_revision = forms.IntegerField( + required=False, + widget=forms.HiddenInput() + ) + + references = forms.CharField( + widget=forms.Textarea(attrs={'rows': 4}), + label=_('References'), + required=False, + help_text=_("References should be valid URLs separated by a new line.")) + + + def __init__(self, request, current_revision, *args, **kwargs): + self.request = request + self.no_clean = kwargs.pop('no_clean', False) + self.preview = kwargs.pop('preview', False) + self.initial_revision = current_revision + self.presumed_revision = None + + if current_revision: + initial = {'content': current_revision.content, + 'title': current_revision.title, + 'references': current_revision.references, + 'current_revision': current_revision.id} + initial.update(kwargs.get('initial', {})) + + # Manipulate any data put in args[0] such that the current_revision + # is reset to match the actual current revision. + data = None + if len(args) > 0: + data = args[0] + args = args[1:] + if data is None: + data = kwargs.get('data', None) + if data: + self.presumed_revision = data.get('current_revision', None) + if not str( + self.presumed_revision) == str( + self.initial_revision.id): + newdata = {} + for k, v in data.items(): + newdata[k] = v + newdata['current_revision'] = self.initial_revision.id + newdata['content'] = simple_merge( + self.initial_revision.content, + data.get( + 'content', + "")) + newdata['title'] = current_revision.title + kwargs['data'] = newdata + else: + # Always pass as kwarg + kwargs['data'] = data + + kwargs['initial'] = initial + + super().__init__(*args, **kwargs) + + def clean(self): + """ + Validates form data by checking that no new revisions have been created + while user attempted to edit + """ + cd = super().clean() + logger.debug(cd) + if self.no_clean or self.preview: + return cd + if not str(self.initial_revision.id) == str(self.presumed_revision): + raise forms.ValidationError( + gettext('While you were editing, someone else changed the revision.')) + if ('title' in cd) and cd['title'] == self.initial_revision.title and cd['content'] == self.initial_revision.content and cd['references'] == self.initial_revision.references: + raise forms.ValidationError(gettext('No changes made. Nothing to save.')) + return cd + + +class NotificationForm(forms.Form): + title = forms.CharField( + max_length=200, + help_text=_('The subject of the email'), + ) + + email_template = forms.ChoiceField( + choices=(), + label="Choose an email template to send to the participant(s)", + required=False) + + email_body = forms.CharField( + widget=forms.Textarea(attrs={'class': 'form-control'}), + label=_('Body of Email Notification'), + help_text=_('This email template (participant_notify_newcase) already contains a greeting, a signature, and a link to the case.'), + initial=settings.STANDARD_PARTICIPANT_EMAIL, + required=True, + ) + + class Meta: + fields = ('title', 'email_template', 'email_body') + + def save(self, cp): + if cp.group: + contact = Contact.objects.filter(vendor_name=cp.user_name).first() + if contact: + if cp.coordinator: + add_coordinator_case(cp.case, contact, cp) + followup = CaseAction(case = cp.case, + title="Notified Coordinator Group: %s" % cp.user_name, + date=timezone.now(), + user = cp.added_by, + action_type = 1) + followup.save() + else: + followup = add_participant_vinny_case(cp.case, cp) + #get email + emails = contact.get_official_emails() + followup.comment = self.cleaned_data['email_body'] + followup.save() + for email in emails: + send_participant_email_notification([email], cp.case, + self.cleaned_data['title'], + self.cleaned_data['email_body']) + else: + vcuser = User.objects.using('vincecomm').filter(username=cp.user_name).first() + if vcuser: + send_participant_email_notification([cp.user_name], cp.case, + self.cleaned_data['title'], + self.cleaned_data['email_body']) + followup = add_participant_vinny_case(cp.case, cp) + followup.comment = self.cleaned_data['email_body'] + followup.save() + else: + send_participant_email_notification([cp.user_name], cp.case, + self.cleaned_data['title'], + self.cleaned_data['email_body']) + followup = add_participant_vinny_case(cp.case, cp) + followup.comment = self.cleaned_data['email_body'] + followup.save() + cp.status = "Notified" + cp.added_to_case = timezone.now() + cp.save() + + + + +class VendorNotificationForm(forms.ModelForm): + email_body = forms.CharField( + widget=forms.Textarea(), + label=_('Email Body'), + help_text=_('This email template (vendor_notify_newcase) already contains a greeting (Hello), the team signature (configurable in team settings), and a link to the case.'), + initial=settings.STANDARD_VENDOR_EMAIL, + required=True) + email_template = forms.ChoiceField( + choices=(), + label="Choose an email template to send to the vendor(s)", + required=False) + + class Meta: + model = VendorNotificationEmail + fields = ('subject', 'email_template', 'email_body') + + def __init__(self, *args, **kwargs): + super(VendorNotificationForm, self).__init__(*args, **kwargs) + + def save(self, user=None): + + email = VendorNotificationEmail( + subject=self.cleaned_data['subject'], + email_body = self.cleaned_data['email_body']) + email.save() + + return email + + +class ShareVulNoteForm(forms.Form): + content = forms.CharField( + label="Post Content", + required=False, + widget=forms.Textarea(attrs={'class': 'form-control'}) + ) + + +class NewPostForm(forms.ModelForm): + + def __init__(self, *args, **kwargs): + super(NewPostForm,self).__init__(*args, **kwargs) + self.fields['version'].required=False + self.fields['content'].required=False + + class Meta: + model = VendorNotificationContent + fields = ('content', 'version', ) + widgets = { + 'content': forms.Textarea(attrs={'class': 'form-control white-space:pre'}), + 'version': forms.HiddenInput() + + } + + +class UploadFileForm(forms.ModelForm): + file = forms.FileField( + required=False, + label=_('Upload file'), + widget=forms.FileInput(attrs={'class':'vulupload'}) + ) + + case_id = forms.CharField( + max_length=500, + ) + + pathname = forms.CharField( + max_length=500, + ) + + def __init__(self, *args, **kwargs): + self.user = kwargs.pop("user") + super(UploadFileForm, self).__init__(*args, **kwargs) + + class Meta: + model = VinceFile + fields = ('file',) + + def save(self): + case = int(self.cleaned_data['case_id']) + + case = VulnerabilityCase.objects.filter(id=case).first() + + pathname = self.cleaned_data['pathname'] + + file = self.cleaned_data['file'] + + vulnote = False + if 'notify' in pathname: + pass + else: + vulnote = True + + logger.debug("IN FILE UPLOAD SAVE") + #create the vincecommattachment + if file.size: + filename = smart_text(file.name) + logger.debug(filename) + try: + mime_type = file.content_type + except: + mime_type = mimetypes.guess_type(filename, strict=False)[0] + if not(mime_type): + mime_type = 'application/octet-stream' + + att = VinceAttachment( + file=file, + filename=os.path.basename(filename), + mime_type=mime_type, + size=file.size, + ) + att.save(using='vincecomm') + + vc_case = Case.objects.filter(vuid=case.vuid).first() + + attach = VinceTrackAttachment( + file = att, + vulnote=vulnote, + case=vc_case) + attach.save(using='vincecomm') + + vf = VinceFile(user=self.user, + case = case, + filename=att.filename, + vulnote = vulnote, + comm_id=attach.id) + vf.save() + + return vf + return None + + + +class AddArtifactForm(forms.ModelForm): + taggles = forms.CharField( + max_length=200, + label='Tag(s)', + required=False) + + attachment = forms.FileField( + required=False, + label=_('Attach File'), + help_text=_('You can attach a file such as a document or screenshot to this ticket.'), + widget=forms.FileInput(attrs={'class':'vulupload'}) + ) + is_file = forms.ChoiceField( + choices=[(True, 'Yes'), (False, 'No')], + label='Is this a file?', + widget=forms.RadioSelect(attrs={'class':'ul_nobullet horizontal_bullet'}), + required=False) + + def __init__(self, *args, **kwargs): + super(AddArtifactForm, self).__init__(*args, **kwargs) + self.initial['is_file'] = False + + def _attach_files_to_follow_up(self, followup): + files = self.cleaned_data['attachment'] + logger.debug(files) + + if files: + files = process_attachments(followup, [files]) + return files + + class Meta: + model = Artifact + fields = ('is_file', 'attachment', 'type', 'title', 'value', 'description', 'taggles') +# exclude = ('user', 'date_added', 'date_modified') + widgets = {'description': forms.Textarea(attrs={'class': 'form-control', 'rows': 4}), + 'value': forms.Textarea(attrs={'class':'form-control', 'rows': 4})} + + def save(self, ticket=None, case=None, user=None): + """ + Writes and returns an Artifact() object + """ + if ticket: + artifact = TicketArtifact(type = self.cleaned_data['type'], + title = self.cleaned_data['title'], + value = self.cleaned_data['value'], + description = self.cleaned_data['description'], + ticket=ticket) + elif case: + artifact = CaseArtifact(type = self.cleaned_data['type'], + title = self.cleaned_data['title'], + value = self.cleaned_data['value'], + description = self.cleaned_data['description'], + case=case) + + artifact.user = user + artifact.save() + + if ticket: + followup = create_followup(ticket=ticket, + title="Added artifact", + comment=self.cleaned_data['title'], + artifact=artifact, + user=user) + followup.save() + + # Todo update this with action type. + else: + followup = CaseAction(case = case, + title="Added artifact", + date=timezone.now(), + comment=self.cleaned_data['title'], + artifact=artifact, + action_type = 1, + user=user) + followup.save() + + files = self._attach_files_to_follow_up(followup) + + + return artifact + +class EditArtifactForm(forms.ModelForm): + taggles = forms.CharField( + max_length=200, + label='Tag(s)', + required=False) + + class Meta: + model = Artifact + exclude = ('user', 'date_added', 'date_modified', 'added_to_note', 'added_to_post') + widgets = {'description': forms.Textarea(attrs={'class': 'form-control'}),} + +class CaseCommunicationsFilterForm(forms.Form): + keyword = forms.CharField( + max_length=100, + label='Keyword(s)', + widget=forms.TextInput(attrs={'placeholder':'Keyword search'}), + required=False) + vendor = forms.MultipleChoiceField( + choices=(), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + participants = forms.MultipleChoiceField( + choices = (), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + communication_type = forms.MultipleChoiceField( + choices=CaseAction.ACTION_TYPE, + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + datestart = forms.DateField(required=False) + dateend = forms.DateField(required=False) + timesort = forms.BooleanField(required=False) + + def __init__(self, *args, **kwargs): + super(CaseCommunicationsFilterForm, self).__init__(*args, **kwargs) + self.fields['dateend'].initial = timezone.now + +class CaseFilterForm(forms.Form): + + + STATUS_FILTER_CHOICES = ( + (VulnerabilityCase.ACTIVE_STATUS, _('Active')), + (VulnerabilityCase.INACTIVE_STATUS, _('Inactive')), + (3, _('Published')), + (4, _('Unpublished')), + ) + + wordSearch = forms.CharField( + max_length=100, + label='Keyword(s)', + widget=forms.TextInput(attrs={'placeholder':'Keyword/Tag search'}), + required=False) + status = forms.MultipleChoiceField( + choices=STATUS_FILTER_CHOICES, + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'})) + + team = forms.MultipleChoiceField( + choices=(), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + + tag = forms.CharField( + max_length=50, + label='Tag', + required=False, + widget=forms.HiddenInput()) + + page = forms.CharField(max_length=5, + required=False) + + datestart = forms.DateField(required=False) + dateend = forms.DateField(required=False) + owner = forms.MultipleChoiceField( + choices=(), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'})) + + def __init__(self, *args, **kwargs): + super(CaseFilterForm, self).__init__(*args, **kwargs) + self.fields['dateend'].initial = timezone.now + +class ActivityFilterForm(forms.Form): + wordSearch = forms.CharField( + max_length=100, + label='Keyword(s)', + widget=forms.TextInput(attrs={'placeholder':'Keyword search'}), + required=False) + user = forms.MultipleChoiceField( + choices = (), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + page = forms.CharField(max_length=5, + required=False) + datestart = forms.DateField(required=False) + dateend = forms.DateField(required=False) + + def __init__(self, *args, **kwargs): + super(ActivityFilterForm, self).__init__(*args, **kwargs) + self.fields['dateend'].initial = timezone.now + now = timezone.now() + self.fields['datestart'].initial = now - timedelta(days=7) + +class TriageFilterForm(forms.Form): + wordSearch = forms.CharField( + max_length=100, + label='Keyword(s)', + widget=forms.TextInput(attrs={'placeholder':'Keyword search'}), + required=False) + queue = forms.MultipleChoiceField( + choices=(), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + page = forms.CharField(max_length=5, + required=False) + datestart = forms.DateField(required=False) + dateend = forms.DateField(required=False) + + def __init__(self, *args, **kwargs): + super(TriageFilterForm, self).__init__(*args, **kwargs) + self.fields['dateend'].initial = timezone.now + +class TicketFilterForm(forms.Form): + wordSearch = forms.CharField( + max_length=100, + label='Keyword(s)', + widget=forms.TextInput(attrs={'placeholder':'Keyword/Tag search'}), + required=False) + queue = forms.MultipleChoiceField( + choices=(), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + team = forms.MultipleChoiceField( + choices=(), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + + case = forms.MultipleChoiceField( + choices=(), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'}) + ) + tag = forms.CharField( + max_length=50, + label='Tag', + required=False, + widget=forms.HiddenInput()) + + page = forms.CharField(max_length=5, + required=False) + priority = forms.MultipleChoiceField( + choices=Ticket.PRIORITY_CHOICES, + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'})) + status = forms.MultipleChoiceField( + choices=Ticket.STATUS_CHOICES, + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'})) + datestart = forms.DateField(required=False) + dateend = forms.DateField(required=False) + owner = forms.MultipleChoiceField( + choices=(), + required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'ul_nobullet'})) + + def __init__(self, *args, **kwargs): + super(TicketFilterForm, self).__init__(*args, **kwargs) + self.fields['dateend'].initial = timezone.now + + +#eventually add a create structured vul note... + +class AbstractTicketForm(forms.Form): + """ + Contain all the common code and fields between "TicketForm" and + "PublicTicketForm". This Form is not intended to be used directly. + """ + + queue = forms.ChoiceField( + widget=forms.Select(attrs={'class': 'form-control'}), + label=_('Queue'), + required=True, + choices=() + ) + + title = forms.CharField( + max_length=200, + required=True, + widget=forms.TextInput(attrs={'class': 'form-control'}), + label=_('Summary/Title'), + ) + + body = forms.CharField( + widget=forms.Textarea(attrs={'class': 'form-control'}), + label=_('Description'), + required=True, + help_text=_('Please be as descriptive as possible and include all details'), + ) + + priority = forms.ChoiceField( + widget=forms.Select(attrs={'class': 'form-control'}), + choices=Ticket.PRIORITY_CHOICES, + required=True, + initial='3', + label=_('Priority'), + help_text=_("Please select a priority carefully. If unsure, leave it as '3'."), + ) + + due_date = forms.DateTimeField( + widget=forms.TextInput(attrs={'class': 'form-control', 'autocomplete': 'off'}), + required=False, + label=_('Due on'), + ) + + attachment = forms.FileField( + required=False, + label=_('Attach File'), + help_text=_('You can attach a file such as a document or screenshot to this ticket.'), + widget=forms.FileInput(attrs={'class':'vulupload'}) + ) + + def _create_ticket(self): + queue = TicketQueue.objects.get(id=int(self.cleaned_data['queue'])) + ticket = Ticket(title=self.cleaned_data['title'], + submitter_email=self.cleaned_data['submitter_email'], + created=timezone.now(), + status=Ticket.OPEN_STATUS, + queue=queue, + description=self.cleaned_data['body'], + priority=self.cleaned_data['priority'], + due_date=self.cleaned_data['due_date'], + ) + return ticket, queue + + def _create_follow_up(self, ticket, title, user=None): + followup = FollowUp(ticket=ticket, + title=title, + date=timezone.now(), + comment=self.cleaned_data['body'], + ) + if user: + followup.user = user + return followup + + def _attach_files_to_follow_up(self, followup): + files = self.cleaned_data['attachment'] + logger.debug(f"{self.__class__.__name__}: In _attach_files_to_follow_up. Files = {files}") + if files: + files = process_attachments(followup, [files]) + return files + + + +class TicketForm(AbstractTicketForm): + """ + Ticket Form creation for registered users. + """ + submitter_email = forms.EmailField( + required=False, + label=_('Submitter E-Mail Address'), + widget=forms.TextInput(attrs={'class': 'form-control'}), + help_text=_('This e-mail address will receive copies of all public ' + 'updates to this ticket.'), + ) + + assigned_to = forms.ChoiceField( + widget=forms.Select(attrs={'class': 'form-control'}), + choices=(), + required=False, + label=_('Assign a User'), + help_text=_('If you select an owner other than yourself, they\'ll be ' + 'e-mailed details of this ticket immediately.'), + ) + + case = forms.CharField( + max_length=250, + label=_('Case'), + required=False, + help_text=_(f'If this ticket is associated with a specific Case, add it here. [{settings.CASE_IDENTIFIER}nnnnnn]'), + ) + + role = forms.ChoiceField( + choices=(), + label='Which role would you like to assign to this ticket?', + widget=forms.RadioSelect(attrs={'class':'ul_nobullet'}), + required=False) + + vulnote_approval = forms.IntegerField(required=False, widget=forms.HiddenInput()) + + def __init__(self, *args, request=None, **kwargs): + """ + Add any custom fields that are defined to the form. + """ + super(TicketForm, self).__init__(*args, **kwargs) + self.request = request + + + def clean_case(self): + data = self.cleaned_data['case'] + if data in [None, '', 'None']: + return + else: + if data.startswith(settings.CASE_IDENTIFIER): + data = data[len(settings.CASE_IDENTIFIER):] + try: + case = VulnerabilityCase.objects.get(vuid=data) + return case + except: + raise forms.ValidationError("Invalid Case Selection") + + def save(self, user=None): + """ + Writes and returns a Ticket() object + """ + + logger.debug(f"{self.__class__.__name__} save. Attachment: {self.cleaned_data['attachment']}") + ticket, queue = self._create_ticket() + if self.cleaned_data['assigned_to']: + try: + u = User.objects.get(id=self.cleaned_data['assigned_to']) + ticket.assigned_to = u + except User.DoesNotExist: + ticket.assigned_to = None + ticket.save() + + + if self.cleaned_data['case']: + case = self.cleaned_data['case'] + ticket.case = case + ticket.save() + if self.cleaned_data['vulnote_approval']: + vulnote = VulNote.objects.filter(case=case).first() + if vulnote: + vulnote.ticket_to_approve = ticket + vulnote.save() + # create dependency + dep = CaseDependency(case=case, depends_on=ticket) + dep.save() + + if self.cleaned_data['assigned_to']: + title = _('Ticket Opened & Assigned to %(name)s') % { + 'name': ticket.get_assigned_to or _("LOADING
"); + $("#id_page").val("1"); + var url = "/vince/activity/results/"; + + if(priorSearchReq) { + priorSearchReq.abort(); + } + + priorSearchReq = $.ajax({ + url: url, + type: "POST", + data: $('#searchform').serialize(), + success: function(data) { + $("#searchresults").html(data); + } + }); +} + + + +$(document).ready(function() { + + $(document).on("click", '.search_page', function(event) { + var page = $(this).attr('next'); + nextPage(page); + }); + + $(document).on("click", '.search_notes', function(event) { + var page = $(this).attr('next'); + nextActivity(page); + }); + + var input = document.getElementById("id_wordSearch"); + if (input) { + input.addEventListener("keydown", function(event) { + if (event.keyCode == 13) { + searchActivity(event); + } + }); + } + + searchActivity(); + + var form = document.getElementById('searchform'); + if (form) { + if (form.attachEvent) { + form.attachEvent("submit", searchActivity); + } else { + form.addEventListener("submit", searchActivity); + } + } + + $("#id_user").change(function() { + searchActivity(); + }); + + $("#filter_by_dropdown_select_all_2").click(function(){ + $("#id_user input[type=checkbox]").prop('checked', $(this).prop('checked')); + searchActivity(); + }); + + + var dateFormat = "yy-mm-dd", + from = $( "#id_datestart" ) + .datepicker({ + defaultDate: "+1w", + changeMonth: true, + changeYear: true, + dateFormat: dateFormat, + numberOfMonths: 1, + maxDate: "+0D" + }) + .on( "change", function() { + /*to.datepicker( "option", "minDate", getDate( this ) );*/ + searchActivity(); + }), + to = $( "#id_dateend" ).datepicker({ + defaultDate: "+1w", + changeMonth: true, + changeYear: true, + dateFormat: dateFormat, + numberOfMonths: 1, + maxDate: "+0D" + + }) + .on( "change", function() { + from.datepicker( "option", "maxDate", getDate( this ) ); + searchActivity(); + }); + + function getDate( element ) { + var date; + try { + date = $.datepicker.parseDate( dateFormat, element.value ); + } catch( error ) { + date = null; + } + + return date; + } +}); + diff --git a/vince/static/vince/js/addvuls.js b/vince/static/vince/js/addvuls.js new file mode 100644 index 0000000..51e77d3 --- /dev/null +++ b/vince/static/vince/js/addvuls.js @@ -0,0 +1,457 @@ +/*######################################################################### +# VINCE +# +# Copyright 2022 Carnegie Mellon University. +# +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE ENGINEERING +# INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON +# UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +# AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR +# PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE +# MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND +# WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# +# Released under a MIT (SEI)-style license, please see license.txt or contact +# permission@sei.cmu.edu for full terms. +# +# [DISTRIBUTION STATEMENT A] This material has been approved for public +# release and unlimited distribution. Please see Copyright notice for non-US +# Government use and distribution. +# +# Carnegie Mellon®, CERT® and CERT Coordination Center® are registered in the +# U.S. Patent and Trademark Office by Carnegie Mellon University. +# +# This Software includes and/or makes use of Third-Party Software each subject +# to its own license. +# +# DM21-1126 +######################################################################## +*/ + + +function permissionDenied(modal) { + + modal.html("Error: You are not permitted to perform this action
Error: "+data['responseJSON']['error']+"/p>