'+a.addText+"");k=l.find("tr:last a")}else e.filter(":last").after('"),
6 | k=e.filter(":last").next().find("a");k.on("click",t)})();c=""===h.val()||0 tr.form-row",b(c).tabularFormset(c,a.options)}})})};
12 |
--------------------------------------------------------------------------------
/_static/admin/js/jquery.init.js:
--------------------------------------------------------------------------------
1 | /*global jQuery:false*/
2 | 'use strict';
3 | /* Puts the included jQuery into our own namespace using noConflict and passing
4 | * it 'true'. This ensures that the included jQuery doesn't pollute the global
5 | * namespace (i.e. this preserves pre-existing values for both window.$ and
6 | * window.jQuery).
7 | */
8 | window.django = {jQuery: jQuery.noConflict(true)};
9 |
--------------------------------------------------------------------------------
/_static/admin/js/nav_sidebar.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const toggleNavSidebar = document.getElementById('toggle-nav-sidebar');
4 | if (toggleNavSidebar !== null) {
5 | const navLinks = document.querySelectorAll('#nav-sidebar a');
6 | function disableNavLinkTabbing() {
7 | for (const navLink of navLinks) {
8 | navLink.tabIndex = -1;
9 | }
10 | }
11 | function enableNavLinkTabbing() {
12 | for (const navLink of navLinks) {
13 | navLink.tabIndex = 0;
14 | }
15 | }
16 |
17 | const main = document.getElementById('main');
18 | let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen');
19 | if (navSidebarIsOpen === null) {
20 | navSidebarIsOpen = 'true';
21 | }
22 | if (navSidebarIsOpen === 'false') {
23 | disableNavLinkTabbing();
24 | }
25 | main.classList.toggle('shifted', navSidebarIsOpen === 'true');
26 |
27 | toggleNavSidebar.addEventListener('click', function() {
28 | if (navSidebarIsOpen === 'true') {
29 | navSidebarIsOpen = 'false';
30 | disableNavLinkTabbing();
31 | } else {
32 | navSidebarIsOpen = 'true';
33 | enableNavLinkTabbing();
34 | }
35 | localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen);
36 | main.classList.toggle('shifted');
37 | });
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/_static/admin/js/popup_response.js:
--------------------------------------------------------------------------------
1 | /*global opener */
2 | 'use strict';
3 | {
4 | const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse);
5 | switch(initData.action) {
6 | case 'change':
7 | opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value);
8 | break;
9 | case 'delete':
10 | opener.dismissDeleteRelatedObjectPopup(window, initData.value);
11 | break;
12 | default:
13 | opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj);
14 | break;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/_static/admin/js/prepopulate.js:
--------------------------------------------------------------------------------
1 | /*global URLify*/
2 | 'use strict';
3 | {
4 | const $ = django.jQuery;
5 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) {
6 | /*
7 | Depends on urlify.js
8 | Populates a selected field with the values of the dependent fields,
9 | URLifies and shortens the string.
10 | dependencies - array of dependent fields ids
11 | maxLength - maximum length of the URLify'd string
12 | allowUnicode - Unicode support of the URLify'd string
13 | */
14 | return this.each(function() {
15 | const prepopulatedField = $(this);
16 |
17 | const populate = function() {
18 | // Bail if the field's value has been changed by the user
19 | if (prepopulatedField.data('_changed')) {
20 | return;
21 | }
22 |
23 | const values = [];
24 | $.each(dependencies, function(i, field) {
25 | field = $(field);
26 | if (field.val().length > 0) {
27 | values.push(field.val());
28 | }
29 | });
30 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode));
31 | };
32 |
33 | prepopulatedField.data('_changed', false);
34 | prepopulatedField.on('change', function() {
35 | prepopulatedField.data('_changed', true);
36 | });
37 |
38 | if (!prepopulatedField.val()) {
39 | $(dependencies.join(',')).on('keyup change focus', populate);
40 | }
41 | });
42 | };
43 | }
44 |
--------------------------------------------------------------------------------
/_static/admin/js/prepopulate.min.js:
--------------------------------------------------------------------------------
1 | 'use strict';{const b=django.jQuery;b.fn.prepopulate=function(d,f,g){return this.each(function(){const a=b(this),h=function(){if(!a.data("_changed")){var e=[];b.each(d,function(a,c){c=b(c);01&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/bn.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/bs.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ca.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/cs.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/da.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/de.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/dsb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/el.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/en.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/es.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/et.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/eu.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/fa.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها میتوانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجهای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/fi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/fr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/gl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/he.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/hi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/hr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/hsb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/hu.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/hy.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/id.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/is.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/it.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ja.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ka.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/km.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ko.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/lt.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/lv.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/mk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ms.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/nb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ne.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/nl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/pl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ps.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/pt-BR.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/pt.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ro.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/ru.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/sk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/sl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/sq.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/sr-Cyrl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/sr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/sv.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/th.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/tk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/tr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/uk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/vi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/zh-CN.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/select2/i18n/zh-TW.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/_static/admin/js/vendor/xregexp/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License
2 |
3 | Copyright (c) 2007-2017 Steven Levithan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/_static/blog/css/blog-post.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Start Bootstrap - Blog Post (https://startbootstrap.com/templates/blog-post)
3 | * Copyright 2013-2019 Start Bootstrap
4 | * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-blog-post/blob/master/LICENSE)
5 | */
6 | body {
7 | padding-top: 56px;
8 | }
9 |
--------------------------------------------------------------------------------
/_static/django_extensions/css/jquery.autocomplete.css:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview CSS for jquery-autocomplete, the jQuery Autocompleter
3 | * @author Dylan Verheul
4 | * @license MIT | GPL | Apache 2.0, see LICENSE.txt
5 | * @see https://github.com/dyve/jquery-autocomplete
6 | */
7 | .acResults {
8 | padding: 0px;
9 | border: 1px solid WindowFrame;
10 | background-color: Window;
11 | overflow: hidden;
12 | }
13 |
14 | .acResults ul {
15 | margin: 0px;
16 | padding: 0px;
17 | list-style-position: outside;
18 | list-style: none;
19 | }
20 |
21 | .acResults ul li {
22 | margin: 0px;
23 | padding: 2px 5px;
24 | cursor: pointer;
25 | display: block;
26 | font: menu;
27 | font-size: 12px;
28 | overflow: hidden;
29 | }
30 |
31 | .acLoading {
32 | background : url('../img/indicator.gif') right center no-repeat;
33 | }
34 |
35 | .acSelect {
36 | background-color: Highlight;
37 | color: HighlightText;
38 | }
39 |
--------------------------------------------------------------------------------
/_static/django_extensions/img/indicator.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/_static/django_extensions/img/indicator.gif
--------------------------------------------------------------------------------
/_static/django_extensions/js/jquery.ajaxQueue.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Ajax Queue Plugin
3 | *
4 | * Homepage: http://jquery.com/plugins/project/ajaxqueue
5 | * Documentation: http://docs.jquery.com/AjaxQueue
6 | */
7 |
8 | /**
9 |
10 |
30 |
31 |
32 | */
33 | /*
34 | * Queued Ajax requests.
35 | * A new Ajax request won't be started until the previous queued
36 | * request has finished.
37 | */
38 |
39 | /*
40 | * Synced Ajax requests.
41 | * The Ajax request will happen as soon as you call this method, but
42 | * the callbacks (success/error/complete) won't fire until all previous
43 | * synced requests have been completed.
44 | */
45 |
46 |
47 | (function(jQuery) {
48 |
49 | var ajax = jQuery.ajax;
50 |
51 | var pendingRequests = {};
52 |
53 | var synced = [];
54 | var syncedData = [];
55 |
56 | jQuery.ajax = function(settings) {
57 | // create settings for compatibility with ajaxSetup
58 | settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
59 |
60 | var port = settings.port;
61 |
62 | switch(settings.mode) {
63 | case "abort":
64 | if ( pendingRequests[port] ) {
65 | pendingRequests[port].abort();
66 | }
67 | return pendingRequests[port] = ajax.apply(this, arguments);
68 | case "queue":
69 | var _old = settings.complete;
70 | settings.complete = function(){
71 | if ( _old )
72 | _old.apply( this, arguments );
73 | jQuery([ajax]).dequeue("ajax" + port );;
74 | };
75 |
76 | jQuery([ ajax ]).queue("ajax" + port, function(){
77 | ajax( settings );
78 | });
79 | return;
80 | case "sync":
81 | var pos = synced.length;
82 |
83 | synced[ pos ] = {
84 | error: settings.error,
85 | success: settings.success,
86 | complete: settings.complete,
87 | done: false
88 | };
89 |
90 | syncedData[ pos ] = {
91 | error: [],
92 | success: [],
93 | complete: []
94 | };
95 |
96 | settings.error = function(){ syncedData[ pos ].error = arguments; };
97 | settings.success = function(){ syncedData[ pos ].success = arguments; };
98 | settings.complete = function(){
99 | syncedData[ pos ].complete = arguments;
100 | synced[ pos ].done = true;
101 |
102 | if ( pos == 0 || !synced[ pos-1 ] )
103 | for ( var i = pos; i < synced.length && synced[i].done; i++ ) {
104 | if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );
105 | if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );
106 | if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );
107 |
108 | synced[i] = null;
109 | syncedData[i] = null;
110 | }
111 | };
112 | }
113 | return ajax.apply(this, arguments);
114 | };
115 |
116 | })((typeof window.jQuery == 'undefined' && typeof window.django != 'undefined')
117 | ? django.jQuery
118 | : jQuery
119 | );
120 |
--------------------------------------------------------------------------------
/_static/django_extensions/js/jquery.bgiframe.js:
--------------------------------------------------------------------------------
1 | /*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
2 | * Licensed under the MIT License (LICENSE.txt).
3 | *
4 | * Version 2.1.2
5 | */
6 |
7 | (function($){
8 |
9 | $.fn.bgiframe = ($.browser.msie && /msie 6\.0/i.test(navigator.userAgent) ? function(s) {
10 | s = $.extend({
11 | top : 'auto', // auto == .currentStyle.borderTopWidth
12 | left : 'auto', // auto == .currentStyle.borderLeftWidth
13 | width : 'auto', // auto == offsetWidth
14 | height : 'auto', // auto == offsetHeight
15 | opacity : true,
16 | src : 'javascript:false;'
17 | }, s);
18 | var html = '';
26 | return this.each(function() {
27 | if ( $(this).children('iframe.bgiframe').length === 0 )
28 | this.insertBefore( document.createElement(html), this.firstChild );
29 | });
30 | } : function() { return this; });
31 |
32 | // old alias
33 | $.fn.bgIframe = $.fn.bgiframe;
34 |
35 | function prop(n) {
36 | return n && n.constructor === Number ? n + 'px' : n;
37 | }
38 |
39 | })((typeof window.jQuery == 'undefined' && typeof window.django != 'undefined') ? django.jQuery : jQuery);
40 |
--------------------------------------------------------------------------------
/_static/markdownx/admin/css/markdownx.css:
--------------------------------------------------------------------------------
1 | .markdownx {
2 | display: inline-block
3 | }
4 | .markdownx .markdownx-editor,
5 | .markdownx .markdownx-preview {
6 | margin-left: 0;
7 | width: 610px
8 | }
9 | .markdownx .markdownx-preview {
10 | overflow-y: scroll;
11 | -webkit-text-size-adjust: 100%;
12 | -ms-text-size-adjust: 100%;
13 | font-size: 100%;
14 | font-size: 1em;
15 | line-height: 1.5em
16 | }
17 | .markdownx .markdownx-preview * {
18 | line-height: 1.5
19 | }
20 | .markdownx .markdownx-preview a {
21 | color: #5b80b2;
22 | text-decoration: underline
23 | }
24 | .markdownx .markdownx-preview a:visited {
25 | color: #0b0080
26 | }
27 | .markdownx .markdownx-preview a:hover {
28 | color: #0645ad
29 | }
30 | .markdownx .markdownx-preview a:active {
31 | color: #faa700
32 | }
33 | .markdownx .markdownx-preview a:focus {
34 | outline: thin dotted
35 | }
36 | .markdownx .markdownx-preview a:active,
37 | .markdownx .markdownx-preview a:hover {
38 | outline: 0
39 | }
40 | .markdownx .markdownx-preview p {
41 | margin: 1em 0;
42 | padding: 0;
43 | font-size: 14px
44 | }
45 | .markdownx .markdownx-preview img {
46 | max-width: 100%
47 | }
48 | .markdownx .markdownx-preview h1,
49 | .markdownx .markdownx-preview h2,
50 | .markdownx .markdownx-preview h3,
51 | .markdownx .markdownx-preview h4,
52 | .markdownx .markdownx-preview h5,
53 | .markdownx .markdownx-preview h6 {
54 | font-weight: 400;
55 | color: #111;
56 | margin-top: .75em;
57 | margin-bottom: .75em;
58 | padding: 0;
59 | background: 0 0
60 | }
61 | .markdownx .markdownx-preview h4,
62 | .markdownx .markdownx-preview h5,
63 | .markdownx .markdownx-preview h6 {
64 | font-weight: 700
65 | }
66 | .markdownx .markdownx-preview h1 {
67 | font-size: 2.5em
68 | }
69 | .markdownx .markdownx-preview h2 {
70 | font-size: 2em
71 | }
72 | .markdownx .markdownx-preview h3 {
73 | font-size: 1.5em
74 | }
75 | .markdownx .markdownx-preview h4 {
76 | font-size: 1.2em
77 | }
78 | .markdownx .markdownx-preview h5 {
79 | font-size: 1em
80 | }
81 | .markdownx .markdownx-preview h6 {
82 | font-size: .9em
83 | }
84 | .markdownx .markdownx-preview blockquote {
85 | color: #666;
86 | margin: 0;
87 | padding-left: 1.5em;
88 | border-left: .5em #eee solid
89 | }
90 | .markdownx .markdownx-preview hr {
91 | display: block;
92 | height: 0;
93 | border: 0;
94 | font-style: italic;
95 | border-bottom: 1px solid #ccc;
96 | margin: 20px 0;
97 | padding: 0
98 | }
99 | .markdownx .markdownx-preview code,
100 | .markdownx .markdownx-preview kbd,
101 | .markdownx .markdownx-preview pre,
102 | .markdownx .markdownx-preview samp {
103 | font-family: monospace,monospace;
104 | font-size: 14px
105 | }
106 | .markdownx .markdownx-preview code,
107 | .markdownx .markdownx-preview pre {
108 | margin: 0 2px;
109 | padding: 0 5px;
110 | border: 1px solid #ddd;
111 | background-color: #f8f8f8;
112 | border-radius: 2px;
113 | color: #444
114 | }
115 | .markdownx .markdownx-preview pre {
116 | margin: 1.5em 0 1.5em 0;
117 | padding: 1em;
118 | white-space: pre;
119 | white-space: pre-wrap;
120 | word-wrap: break-word
121 | }
122 | .markdownx .markdownx-preview pre code {
123 | margin: 0;
124 | padding: 0;
125 | background: 0 0;
126 | border: none
127 | }
128 | .markdownx .markdownx-preview b,
129 | .markdownx .markdownx-preview strong {
130 | font-weight: 700
131 | }
132 | .markdownx .markdownx-preview dfn {
133 | font-style: italic
134 | }
135 | .markdownx .markdownx-preview ins {
136 | background: #ff9;
137 | color: #000;
138 | text-decoration: none
139 | }
140 | .markdownx .markdownx-preview mark {
141 | background: #ff0;
142 | color: #000;
143 | font-style: italic;
144 | font-weight: 700
145 | }
146 | .markdownx .markdownx-preview sub,
147 | .markdownx .markdownx-preview sup {
148 | font-size: 75%;
149 | line-height: 0;
150 | position: relative;
151 | vertical-align: baseline
152 | }
153 | .markdownx .markdownx-preview sup {
154 | top: -.5em
155 | }
156 | .markdownx .markdownx-preview sub {
157 | bottom: -.25em
158 | }
159 | .markdownx .markdownx-preview ol,
160 | .markdownx .markdownx-preview ul {
161 | margin: 1em 0!important;
162 | padding: 0 0 0 2em!important
163 | }
164 | .markdownx .markdownx-preview ol li,
165 | .markdownx .markdownx-preview ul li {
166 | font-size: 14px!important;
167 | margin-bottom: .75em
168 | }
169 | .markdownx .markdownx-preview li p:last-child {
170 | margin: 0
171 | }
172 | .markdownx .markdownx-preview dd {
173 | margin: 0 0 0 2em
174 | }
175 | .markdownx .markdownx-preview img {
176 | border: 0;
177 | -ms-interpolation-mode: bicubic;
178 | vertical-align: middle
179 | }
180 | .markdownx .markdownx-preview table {
181 | border-collapse: collapse;
182 | border-spacing: 0
183 | }
184 | .markdownx .markdownx-preview th {
185 | background: 0 0;
186 | background: #f8f8f8;
187 | font-size: 14px
188 | }
189 | .markdownx .markdownx-preview td {
190 | vertical-align: top;
191 | font-size: 14px
192 | }
--------------------------------------------------------------------------------
/_static/markdownx/admin/css/markdownx.min.css:
--------------------------------------------------------------------------------
1 | .markdownx{display:inline-block}.markdownx .markdownx-editor,.markdownx .markdownx-preview{margin-left:0;width:610px}.markdownx .markdownx-preview{overflow-y:scroll;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:100%;font-size:1em;line-height:1.5em}.markdownx .markdownx-preview *{line-height:1.5}.markdownx .markdownx-preview a{color:#5b80b2;text-decoration:underline}.markdownx .markdownx-preview a:visited{color:#0b0080}.markdownx .markdownx-preview a:hover{color:#0645ad}.markdownx .markdownx-preview a:active{color:#faa700}.markdownx .markdownx-preview a:focus{outline:thin dotted}.markdownx .markdownx-preview a:active,.markdownx .markdownx-preview a:hover{outline:0}.markdownx .markdownx-preview p{margin:1em 0;padding:0;font-size:14px}.markdownx .markdownx-preview img{max-width:100%}.markdownx .markdownx-preview h1,.markdownx .markdownx-preview h2,.markdownx .markdownx-preview h3,.markdownx .markdownx-preview h4,.markdownx .markdownx-preview h5,.markdownx .markdownx-preview h6{font-weight:400;color:#111;margin-top:.75em;margin-bottom:.75em;padding:0;background:0 0}.markdownx .markdownx-preview h4,.markdownx .markdownx-preview h5,.markdownx .markdownx-preview h6{font-weight:700}.markdownx .markdownx-preview h1{font-size:2.5em}.markdownx .markdownx-preview h2{font-size:2em}.markdownx .markdownx-preview h3{font-size:1.5em}.markdownx .markdownx-preview h4{font-size:1.2em}.markdownx .markdownx-preview h5{font-size:1em}.markdownx .markdownx-preview h6{font-size:.9em}.markdownx .markdownx-preview blockquote{color:#666;margin:0;padding-left:1.5em;border-left:.5em #eee solid}.markdownx .markdownx-preview hr{display:block;height:0;border:0;font-style:italic;border-bottom:1px solid #ccc;margin:20px 0;padding:0}.markdownx .markdownx-preview code,.markdownx .markdownx-preview kbd,.markdownx .markdownx-preview pre,.markdownx .markdownx-preview samp{font-family:monospace,monospace;font-size:14px}.markdownx .markdownx-preview code,.markdownx .markdownx-preview pre{margin:0 2px;padding:0 5px;border:1px solid #ddd;background-color:#f8f8f8;border-radius:2px;color:#444}.markdownx .markdownx-preview pre{margin:1.5em 0 1.5em 0;padding:1em;white-space:pre;white-space:pre-wrap;word-wrap:break-word}.markdownx .markdownx-preview pre code{margin:0;padding:0;background:0 0;border:none}.markdownx .markdownx-preview b,.markdownx .markdownx-preview strong{font-weight:700}.markdownx .markdownx-preview dfn{font-style:italic}.markdownx .markdownx-preview ins{background:#ff9;color:#000;text-decoration:none}.markdownx .markdownx-preview mark{background:#ff0;color:#000;font-style:italic;font-weight:700}.markdownx .markdownx-preview sub,.markdownx .markdownx-preview sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdownx .markdownx-preview sup{top:-.5em}.markdownx .markdownx-preview sub{bottom:-.25em}.markdownx .markdownx-preview ol,.markdownx .markdownx-preview ul{margin:1em 0!important;padding:0 0 0 2em!important}.markdownx .markdownx-preview ol li,.markdownx .markdownx-preview ul li{font-size:14px!important;margin-bottom:.75em}.markdownx .markdownx-preview li p:last-child{margin:0}.markdownx .markdownx-preview dd{margin:0 0 0 2em}.markdownx .markdownx-preview img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle}.markdownx .markdownx-preview table{border-collapse:collapse;border-spacing:0}.markdownx .markdownx-preview th{background:0 0;background:#f8f8f8;font-size:14px}.markdownx .markdownx-preview td{vertical-align:top;font-size:14px}
--------------------------------------------------------------------------------
/_static/single_pages/css/about_me.css:
--------------------------------------------------------------------------------
1 | .margin-for-footer {
2 | margin-bottom: 130px;
3 | }
4 |
--------------------------------------------------------------------------------
/_static/single_pages/css/landing.css:
--------------------------------------------------------------------------------
1 | body {
2 | background: url('/static/single_pages/images/amsterdam_sky.jpg') no-repeat center center fixed;
3 | -webkit-background-size: cover;
4 | -moz-background-size: cover;
5 | background-size: cover;
6 | -o-background-size: cover;
7 | }
8 |
9 | section {
10 | margin-bottom: 150px;
11 | }
12 |
13 | .card {
14 | background-color: rgba(255, 255, 255, 0.6);
15 | }
16 |
--------------------------------------------------------------------------------
/_static/single_pages/images/amsterdam_sky.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/_static/single_pages/images/amsterdam_sky.jpg
--------------------------------------------------------------------------------
/_static/single_pages/images/automation_python.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/_static/single_pages/images/automation_python.png
--------------------------------------------------------------------------------
/_static/single_pages/images/inflearn_django2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/_static/single_pages/images/inflearn_django2.png
--------------------------------------------------------------------------------
/_static/single_pages/images/my_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/_static/single_pages/images/my_back.png
--------------------------------------------------------------------------------
/_static/single_pages/images/pycon_sy_2017.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/_static/single_pages/images/pycon_sy_2017.png
--------------------------------------------------------------------------------
/blog/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/blog/__init__.py
--------------------------------------------------------------------------------
/blog/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from markdownx.admin import MarkdownxModelAdmin
3 | from .models import Post, Category, Tag, Comment
4 |
5 | admin.site.register(Post, MarkdownxModelAdmin)
6 | admin.site.register(Comment)
7 |
8 | class CategoryAdmin(admin.ModelAdmin):
9 | prepopulated_fields = {'slug': ('name', )}
10 |
11 | class TagAdmin(admin.ModelAdmin):
12 | prepopulated_fields = {'slug': ('name', )}
13 |
14 |
15 | admin.site.register(Category, CategoryAdmin)
16 | admin.site.register(Tag, TagAdmin)
--------------------------------------------------------------------------------
/blog/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class BlogConfig(AppConfig):
5 | name = 'blog'
6 |
--------------------------------------------------------------------------------
/blog/forms.py:
--------------------------------------------------------------------------------
1 | from .models import Comment
2 | from django import forms
3 |
4 |
5 | class CommentForm(forms.ModelForm):
6 | class Meta:
7 | model = Comment
8 | fields = ('content',)
9 |
--------------------------------------------------------------------------------
/blog/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/blog/migrations/__init__.py
--------------------------------------------------------------------------------
/blog/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 | from django.contrib.auth.models import User
3 | from markdownx.models import MarkdownxField
4 | from markdownx.utils import markdown
5 | import os
6 |
7 |
8 | class Tag(models.Model):
9 | name = models.CharField(max_length=50)
10 | slug = models.SlugField(max_length=200, unique=True, allow_unicode=True)
11 |
12 | def __str__(self):
13 | return self.name
14 |
15 | def get_absolute_url(self):
16 | return f'/blog/tag/{self.slug}/'
17 |
18 |
19 | class Category(models.Model):
20 | name = models.CharField(max_length=50, unique=True)
21 | slug = models.SlugField(max_length=200, unique=True, allow_unicode=True)
22 |
23 | def __str__(self):
24 | return self.name
25 |
26 | def get_absolute_url(self):
27 | return f'/blog/category/{self.slug}/'
28 |
29 | class Meta:
30 | verbose_name_plural = 'categories'
31 |
32 |
33 | class Post(models.Model):
34 | title = models.CharField(max_length=30)
35 | hook_text = models.CharField(max_length=100, blank=True)
36 | content = MarkdownxField()
37 |
38 | head_image = models.ImageField(upload_to='blog/images/%Y/%m/%d/', blank=True)
39 | file_upload = models.FileField(upload_to='blog/files/%Y/%m/%d/', blank=True)
40 |
41 | created_at = models.DateTimeField(auto_now_add=True)
42 | updated_at = models.DateTimeField(auto_now=True)
43 |
44 | author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
45 |
46 | category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.SET_NULL)
47 | tags = models.ManyToManyField(Tag, blank=True)
48 |
49 | def __str__(self):
50 | return f'[{self.pk}]{self.title} :: {self.author}'
51 |
52 | def get_absolute_url(self):
53 | return f'/blog/{self.pk}/'
54 |
55 | def get_file_name(self):
56 | return os.path.basename(self.file_upload.name)
57 |
58 | def get_file_ext(self):
59 | return self.get_file_name().split('.')[-1]
60 |
61 | def get_content_markdown(self):
62 | return markdown(self.content)
63 |
64 | def get_avatar_url(self):
65 | if self.author.socialaccount_set.exists():
66 | return self.author.socialaccount_set.first().get_avatar_url()
67 | else:
68 | return f'https://api.adorable.io/avatars/60/{self.author.username}.png'
69 |
70 |
71 | class Comment(models.Model):
72 | post = models.ForeignKey(Post, on_delete=models.CASCADE)
73 | author = models.ForeignKey(User, on_delete=models.CASCADE)
74 | content = models.TextField()
75 | created_at = models.DateTimeField(auto_now_add=True)
76 | modified_at = models.DateTimeField(auto_now=True)
77 |
78 | def __str__(self):
79 | return f'{self.author}::{self.content}'
80 |
81 | def get_absolute_url(self):
82 | return f'{self.post.get_absolute_url()}#comment-{self.pk}'
83 |
84 | def get_avatar_url(self):
85 | if self.author.socialaccount_set.exists():
86 | return self.author.socialaccount_set.first().get_avatar_url()
87 | else:
88 | return f'https://api.adorable.io/avatars/60/{ self.author.username }.png'
--------------------------------------------------------------------------------
/blog/static/blog/css/blog-post.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Start Bootstrap - Blog Post (https://startbootstrap.com/templates/blog-post)
3 | * Copyright 2013-2019 Start Bootstrap
4 | * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-blog-post/blob/master/LICENSE)
5 | */
6 | body {
7 | padding-top: 56px;
8 | }
9 |
--------------------------------------------------------------------------------
/blog/templates/blog/base.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% load static %}
4 |
5 | {% block head_title %}Blog{% endblock %}
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | {% include 'blog/navbar.html' %}
14 |
15 |
16 |
17 |
18 | {% block main_area %}
19 | {% endblock %}
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
56 |
57 |
58 |
59 |
60 |
77 |
78 | {% include 'blog/footer.html' %}
79 |
80 |
83 |
86 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/blog/templates/blog/base_full_width.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% load static %}
4 |
5 | {% block head_title %}Blog{% endblock %}
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | {% include 'blog/navbar.html' %}
14 |
15 |
16 |
17 |
18 | {% block main_area %}
19 | {% endblock %}
20 |
21 |
22 |
23 |
24 | {% include 'blog/footer.html' %}
25 |
26 |
29 |
32 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/blog/templates/blog/comment_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'blog/base_full_width.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block head_title %}Edit Comment - Blog{% endblock %}
4 |
5 | {% block main_area %}
6 | Edit Comment
7 |
8 |
13 | {% endblock %}
14 |
--------------------------------------------------------------------------------
/blog/templates/blog/footer.html:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/blog/templates/blog/navbar.html:
--------------------------------------------------------------------------------
1 | {% load socialaccount %}
2 |
3 |
47 |
48 |
49 |
76 |
--------------------------------------------------------------------------------
/blog/templates/blog/post_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'blog/base_full_width.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block head_title %}Create Post - Blog{% endblock %}
4 |
5 | {% block main_area %}
6 | Create New Post
7 |
8 |
18 | {{ form.media }}
19 | {% endblock %}
20 |
--------------------------------------------------------------------------------
/blog/templates/blog/post_list.html:
--------------------------------------------------------------------------------
1 | {% extends 'blog/base.html' %}
2 |
3 | {% block main_area %}
4 | {% if user.is_authenticated%}
5 | {% if user.is_superuser or user.is_staff %}
6 | New Post
7 | {% endif %}
8 | {% endif %}
9 |
10 |
11 | Blog
12 | {% if search_info %}{{ search_info }}{% endif %}
13 | {% if category %}{{ category }}{% endif %}
14 | {% if tag %}{{ tag }} ({{ tag.post_set.count }}){% endif %}
15 |
16 |
17 | {% if post_list.exists %}
18 |
19 | {% for p in post_list %}
20 |
21 |
22 | {% if p.head_image %}
23 | 
24 | {% else %}
25 | 
26 | {% endif %}
27 |
28 | {% if p.category %}
29 | {{ p.category }}
30 | {% else %}
31 | 미분류
32 | {% endif %}
33 |
34 | {{ p.title}}
35 | {% if p.hook_text %}
36 | {{ p.hook_text }}
37 | {% endif %}
38 | {{ p.get_content_markdown | truncatewords_html:45 | safe }}
39 |
40 | {% if p.tags.exists %}
41 |
42 | {% for tag in p.tags.iterator %}
43 | {{ tag }}
44 | {% endfor %}
45 |
46 |
47 | {% endif %}
48 |
49 | Read More →
50 |
51 |
55 |
56 | {% endfor %}
57 |
58 | {% else %}
59 | 아직 게시물이 없습니다.
60 | {% endif %}
61 |
62 | {% if is_paginated %}
63 |
64 |
85 | {% endif %}
86 | {% endblock %}
--------------------------------------------------------------------------------
/blog/templates/blog/post_update_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'blog/base_full_width.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block head_title %}Edit Post - Blog{% endblock %}
4 |
5 | {% block main_area %}
6 | Edit Post
7 |
8 |
18 | {{ form.media }}
19 | {% endblock %}
20 |
--------------------------------------------------------------------------------
/blog/urls.py:
--------------------------------------------------------------------------------
1 | from django.urls import path
2 | from . import views
3 |
4 | urlpatterns = [
5 | path('search//', views.PostSearch.as_view()),
6 | path('delete_comment//', views.delete_comment),
7 | path('update_comment//', views.CommentUpdate.as_view()),
8 | path('update_post//', views.PostUpdate.as_view()),
9 | path('create_post/', views.PostCreate.as_view()),
10 | path('tag//', views.tag_page),
11 | path('category//', views.category_page),
12 | path('/new_comment/', views.new_comment),
13 | path('/', views.PostDetail.as_view()),
14 | path('', views.PostList.as_view()),
15 | # path('/', views.single_post_page),
16 | # path('', views.index),
17 | ]
18 |
--------------------------------------------------------------------------------
/blog/views.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import render, redirect
2 | from django.views.generic import ListView, DetailView, CreateView, UpdateView
3 | from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
4 | from django.utils.text import slugify
5 | from django.shortcuts import get_object_or_404
6 | from .models import Post, Category, Tag, Comment
7 | from django.core.exceptions import PermissionDenied
8 | from django.db.models import Q
9 | from .forms import CommentForm
10 |
11 |
12 | class PostList(ListView):
13 | model = Post
14 | ordering = '-pk'
15 | paginate_by = 5
16 |
17 | def get_context_data(self, **kwargs):
18 | context = super(PostList, self).get_context_data()
19 | context['categories'] = Category.objects.all()
20 | context['no_category_post_count'] = Post.objects.filter(category=None).count()
21 | return context
22 |
23 |
24 | class PostDetail(DetailView):
25 | model = Post
26 |
27 | def get_context_data(self, **kwargs):
28 | context = super(PostDetail, self).get_context_data()
29 | context['categories'] = Category.objects.all()
30 | context['no_category_post_count'] = Post.objects.filter(category=None).count()
31 | context['comment_form'] = CommentForm
32 | return context
33 |
34 |
35 | class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView):
36 | model = Post
37 | fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']
38 |
39 | def test_func(self):
40 | return self.request.user.is_superuser or self.request.user.is_staff
41 |
42 | def form_valid(self, form):
43 | current_user = self.request.user
44 | if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser):
45 | form.instance.author = current_user
46 | response = super(PostCreate, self).form_valid(form)
47 |
48 | tags_str = self.request.POST.get('tags_str')
49 | if tags_str:
50 | tags_str = tags_str.strip()
51 |
52 | tags_str = tags_str.replace(',', ';')
53 | tags_list = tags_str.split(';')
54 |
55 | for t in tags_list:
56 | t = t.strip()
57 | tag, is_tag_created = Tag.objects.get_or_create(name=t)
58 | if is_tag_created:
59 | tag.slug = slugify(t, allow_unicode=True)
60 | tag.save()
61 | self.object.tags.add(tag)
62 |
63 | return response
64 |
65 | else:
66 | return redirect('/blog/')
67 |
68 |
69 | class PostUpdate(LoginRequiredMixin, UpdateView):
70 | model = Post
71 | fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']
72 |
73 | template_name = 'blog/post_update_form.html'
74 |
75 | def get_context_data(self, **kwargs):
76 | context = super(PostUpdate, self).get_context_data()
77 | if self.object.tags.exists():
78 | tags_str_list = list()
79 | for t in self.object.tags.all():
80 | tags_str_list.append(t.name)
81 | context['tags_str_default'] = '; '.join(tags_str_list)
82 |
83 | return context
84 |
85 | def dispatch(self, request, *args, **kwargs):
86 | if request.user.is_authenticated and request.user == self.get_object().author:
87 | return super(PostUpdate, self).dispatch(request, *args, **kwargs)
88 | else:
89 | raise PermissionDenied
90 |
91 | def form_valid(self, form):
92 | response = super(PostUpdate, self).form_valid(form)
93 | self.object.tags.clear()
94 |
95 | tags_str = self.request.POST.get('tags_str')
96 | if tags_str:
97 | tags_str = tags_str.strip()
98 | tags_str = tags_str.replace(',', ';')
99 | tags_list = tags_str.split(';')
100 |
101 | for t in tags_list:
102 | t = t.strip()
103 | tag, is_tag_created = Tag.objects.get_or_create(name=t)
104 | if is_tag_created:
105 | tag.slug = slugify(t, allow_unicode=True)
106 | tag.save()
107 | self.object.tags.add(tag)
108 |
109 | return response
110 |
111 |
112 |
113 | def category_page(request, slug):
114 | if slug == 'no_category':
115 | category = '미분류'
116 | post_list = Post.objects.filter(category=None)
117 | else:
118 | category = Category.objects.get(slug=slug)
119 | post_list = Post.objects.filter(category=category)
120 |
121 | return render(
122 | request,
123 | 'blog/post_list.html',
124 | {
125 | 'post_list': post_list,
126 | 'categories': Category.objects.all(),
127 | 'no_category_post_count': Post.objects.filter(category=None).count(),
128 | 'category': category,
129 | }
130 | )
131 |
132 |
133 | def tag_page(request, slug):
134 | tag = Tag.objects.get(slug=slug)
135 | post_list = tag.post_set.all()
136 |
137 | return render(
138 | request,
139 | 'blog/post_list.html',
140 | {
141 | 'post_list': post_list,
142 | 'tag': tag,
143 | 'categories': Category.objects.all(),
144 | 'no_category_post_count': Post.objects.filter(category=None).count(),
145 | }
146 | )
147 |
148 | def new_comment(request, pk):
149 | if request.user.is_authenticated:
150 | post = get_object_or_404(Post, pk=pk)
151 |
152 | if request.method == 'POST':
153 | comment_form = CommentForm(request.POST)
154 | if comment_form.is_valid():
155 | comment = comment_form.save(commit=False)
156 | comment.post = post
157 | comment.author = request.user
158 | comment.save()
159 | return redirect(comment.get_absolute_url())
160 | else:
161 | return redirect(post.get_absolute_url())
162 | else:
163 | raise PermissionDenied
164 |
165 |
166 | class CommentUpdate(LoginRequiredMixin, UpdateView):
167 | model = Comment
168 | form_class = CommentForm
169 |
170 | def dispatch(self, request, *args, **kwargs):
171 | if request.user.is_authenticated and request.user == self.get_object().author:
172 | return super(CommentUpdate, self).dispatch(request, *args, **kwargs)
173 | else:
174 | raise PermissionDenied
175 |
176 |
177 | def delete_comment(request, pk):
178 | comment = get_object_or_404(Comment, pk=pk)
179 | post = comment.post
180 | if request.user.is_authenticated and request.user == comment.author:
181 | comment.delete()
182 | return redirect(post.get_absolute_url())
183 | else:
184 | raise PermissionDenied
185 |
186 |
187 | class PostSearch(PostList):
188 | paginate_by = None
189 |
190 | def get_queryset(self):
191 | q = self.kwargs['q']
192 | post_list = Post.objects.filter(
193 | Q(title__contains=q) | Q(tags__name__contains=q)
194 | ).distinct()
195 | return post_list
196 |
197 | def get_context_data(self, **kwargs):
198 | context = super(PostSearch, self).get_context_data()
199 | q = self.kwargs['q']
200 | context['search_info'] = f'Search: {q} ({self.get_queryset().count()})'
201 |
202 | return context
203 |
--------------------------------------------------------------------------------
/do_it_django_prj/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/do_it_django_prj/__init__.py
--------------------------------------------------------------------------------
/do_it_django_prj/asgi.py:
--------------------------------------------------------------------------------
1 | """
2 | ASGI config for do_it_django_prj project.
3 |
4 | It exposes the ASGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.asgi import get_asgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_it_django_prj.settings')
15 |
16 | application = get_asgi_application()
17 |
--------------------------------------------------------------------------------
/do_it_django_prj/settings.py:
--------------------------------------------------------------------------------
1 | """
2 | Django settings for do_it_django_prj project.
3 |
4 | Generated by 'django-admin startproject' using Django 3.1.1.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/3.1/topics/settings/
8 |
9 | For the full list of settings and their values, see
10 | https://docs.djangoproject.com/en/3.1/ref/settings/
11 | """
12 | import os
13 | from pathlib import Path
14 |
15 | # Build paths inside the project like this: BASE_DIR / 'subdir'.
16 | BASE_DIR = Path(__file__).resolve().parent.parent
17 |
18 |
19 | # Quick-start development settings - unsuitable for production
20 | # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
21 |
22 | # SECURITY WARNING: keep the secret key used in production secret!
23 | SECRET_KEY = os.environ.get('SECRET_KEY', '*&1yd@!vqkxb4a0@gi6*s1kg-z0(6h-%yu+-reyc8qg#8boe!p')
24 |
25 | # SECURITY WARNING: don't run with debug turned on in production!
26 | DEBUG = int(os.environ.get('DEBUG', 1))
27 |
28 | if os.environ.get('DJANGO_ALLOWED_HOSTS'):
29 | ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS').split(' ')
30 | else:
31 | ALLOWED_HOSTS = []
32 |
33 | # Application definition
34 | INSTALLED_APPS = [
35 | 'django.contrib.admin',
36 | 'django.contrib.auth',
37 | 'django.contrib.contenttypes',
38 | 'django.contrib.sessions',
39 | 'django.contrib.messages',
40 | 'django.contrib.staticfiles',
41 | 'django_extensions',
42 |
43 | 'crispy_forms',
44 | 'markdownx',
45 | 'django.contrib.sites',
46 | 'allauth',
47 | 'allauth.account',
48 | 'allauth.socialaccount',
49 | 'allauth.socialaccount.providers.google',
50 |
51 | 'blog',
52 | 'single_pages',
53 | ]
54 |
55 | MIDDLEWARE = [
56 | 'django.middleware.security.SecurityMiddleware',
57 | 'django.contrib.sessions.middleware.SessionMiddleware',
58 | 'django.middleware.common.CommonMiddleware',
59 | 'django.middleware.csrf.CsrfViewMiddleware',
60 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
61 | 'django.contrib.messages.middleware.MessageMiddleware',
62 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
63 | ]
64 |
65 | ROOT_URLCONF = 'do_it_django_prj.urls'
66 |
67 | TEMPLATES = [
68 | {
69 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
70 | 'DIRS': [],
71 | 'APP_DIRS': True,
72 | 'OPTIONS': {
73 | 'context_processors': [
74 | 'django.template.context_processors.debug',
75 | 'django.template.context_processors.request',
76 | 'django.contrib.auth.context_processors.auth',
77 | 'django.contrib.messages.context_processors.messages',
78 | ],
79 | },
80 | },
81 | ]
82 |
83 | WSGI_APPLICATION = 'do_it_django_prj.wsgi.application'
84 |
85 |
86 | # Database
87 | # https://docs.djangoproject.com/en/3.1/ref/settings/#databases
88 |
89 | DATABASES = {
90 | 'default': {
91 | 'ENGINE': os.environ.get("SQL_ENGINE", 'django.db.backends.sqlite3'),
92 | 'NAME': os.environ.get('SQL_DATABASE', os.path.join(BASE_DIR, 'db.sqlite3')),
93 | 'USER': os.environ.get('SQL_USER', 'user'),
94 | 'PASSWORD': os.environ.get('SQL_PASSWORD', 'password'),
95 | 'HOST': os.environ.get('SQL_HOST', 'localhost'),
96 | 'PORT': os.environ.get("SQL_PORT", '5432'),
97 | }
98 | }
99 |
100 |
101 | # Password validation
102 | # https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
103 |
104 | AUTH_PASSWORD_VALIDATORS = [
105 | {
106 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
107 | },
108 | {
109 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
110 | },
111 | {
112 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
113 | },
114 | {
115 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
116 | },
117 | ]
118 |
119 |
120 | # Internationalization
121 | # https://docs.djangoproject.com/en/3.1/topics/i18n/
122 |
123 | LANGUAGE_CODE = 'en-us'
124 |
125 | TIME_ZONE = 'Asia/Seoul'
126 |
127 | USE_I18N = True
128 |
129 | USE_L10N = True
130 |
131 | USE_TZ = True
132 |
133 |
134 | # Static files (CSS, JavaScript, Images)
135 | # https://docs.djangoproject.com/en/3.1/howto/static-files/
136 |
137 | STATIC_URL = '/static/'
138 | STATIC_ROOT = os.path.join(BASE_DIR, '_static')
139 |
140 | MEDIA_URL = '/media/'
141 | MEDIA_ROOT = os.path.join(BASE_DIR, '_media')
142 |
143 | CRISPY_TEMPLATE_PACK = 'bootstrap4'
144 |
145 | AUTHENTICATION_BACKENDS = [
146 | # Needed to login by username in Django admin, regardless of `allauth`
147 | 'django.contrib.auth.backends.ModelBackend',
148 |
149 | # `allauth` specific authentication methods, such as login by e-mail
150 | 'allauth.account.auth_backends.AuthenticationBackend',
151 | ]
152 |
153 |
154 | SITE_ID = 1
155 |
156 | ACCOUNT_EMAIL_REQUIRED = True
157 | ACCOUNT_EMAIL_VERIFICATION = 'none'
158 | LOGIN_REDIRECT_URL = '/blog/'
--------------------------------------------------------------------------------
/do_it_django_prj/urls.py:
--------------------------------------------------------------------------------
1 | """do_it_django_prj URL Configuration
2 |
3 | The `urlpatterns` list routes URLs to views. For more information please see:
4 | https://docs.djangoproject.com/en/3.1/topics/http/urls/
5 | Examples:
6 | Function views
7 | 1. Add an import: from my_app import views
8 | 2. Add a URL to urlpatterns: path('', views.home, name='home')
9 | Class-based views
10 | 1. Add an import: from other_app.views import Home
11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
12 | Including another URLconf
13 | 1. Import the include() function: from django.urls import include, path
14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
15 | """
16 | from django.contrib import admin
17 | from django.urls import path, include
18 |
19 | from django.conf import settings
20 | from django.conf.urls.static import static
21 |
22 |
23 | urlpatterns = [
24 | path('blog/', include('blog.urls')),
25 | path('admin/', admin.site.urls),
26 | path('markdownx/', include('markdownx.urls')),
27 | path('accounts/', include('allauth.urls')),
28 | path('', include('single_pages.urls')),
29 | ]
30 |
31 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
32 | urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
--------------------------------------------------------------------------------
/do_it_django_prj/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for do_it_django_prj project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_it_django_prj.settings')
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/docker-compose.dev.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 | web:
5 | build: .
6 | command: gunicorn do_it_django_prj.wsgi:application --bind 0.0.0.0:8000
7 | volumes:
8 | - ./:/usr/src/app/
9 | ports:
10 | - 8000:8000
11 | env_file:
12 | - ./.env.dev
13 | depends_on:
14 | - db
15 | db:
16 | image: postgres:12.0-alpine
17 | volumes:
18 | - postgres_data:/var/lib/postgresql/data/
19 | environment:
20 | - POSTGRES_USER=do_it_django_db_user
21 | - POSTGRES_PASSWORD=do_it_django_db_password
22 | - POSTGRES_DB=do_it_django_dev
23 | volumes:
24 | postgres_data:
25 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 | nginx:
5 | build: ./nginx
6 | volumes:
7 | - static_volume:/usr/src/app/_static
8 | - media_volume:/usr/src/app/_media
9 | - ./data/certbot/conf:/etc/letsencrypt
10 | - ./data/certbot/www:/var/www/certbot
11 | ports:
12 | - 80:80
13 | - 443:443
14 | depends_on:
15 | - web
16 | certbot:
17 | image: certbot/certbot
18 | entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
19 | volumes:
20 | - ./data/certbot/conf:/etc/letsencrypt
21 | - ./data/certbot/www:/var/www/certbot
22 | web:
23 | build: .
24 | command: gunicorn do_it_django_prj.wsgi:application --bind 0.0.0.0:8000
25 | volumes:
26 | - static_volume:/usr/src/app/_static
27 | - media_volume:/usr/src/app/_media
28 | - ./:/usr/src/app/
29 | ports:
30 | - 8000
31 | env_file:
32 | - ./.env.prod
33 | depends_on:
34 | - db
35 | db:
36 | image: postgres:12.0-alpine
37 | volumes:
38 | - postgres_data:/var/lib/postgresql/data/
39 | env_file:
40 | - ./.env.prod.db
41 | volumes:
42 | postgres_data:
43 | static_volume:
44 | media_volume:
--------------------------------------------------------------------------------
/init-letsencrypt.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if ! [ -x "$(command -v docker-compose)" ]; then
4 | echo 'Error: docker-compose is not installed.' >&2
5 | exit 1
6 | fi
7 |
8 | domains=(sungyonglee.com www.sungyonglee.com)
9 | rsa_key_size=4096
10 | data_path="./data/certbot"
11 | email="saintdragon2@gmail.com" # Adding a valid address is strongly recommended
12 | staging=0 # Set to 1 if you're testing your setup to avoid hitting request limits
13 |
14 | if [ -d "$data_path" ]; then
15 | read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision
16 | if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then
17 | exit
18 | fi
19 | fi
20 |
21 |
22 | if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then
23 | echo "### Downloading recommended TLS parameters ..."
24 | mkdir -p "$data_path/conf"
25 | curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf"
26 | curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem"
27 | echo
28 | fi
29 |
30 | echo "### Creating dummy certificate for $domains ..."
31 | path="/etc/letsencrypt/live/$domains"
32 | mkdir -p "$data_path/conf/live/$domains"
33 | docker-compose run --rm --entrypoint "\
34 | openssl req -x509 -nodes -newkey rsa:4096 -days 1\
35 | -keyout '$path/privkey.pem' \
36 | -out '$path/fullchain.pem' \
37 | -subj '/CN=localhost'" certbot
38 | echo
39 |
40 |
41 | echo "### Starting nginx ..."
42 | docker-compose up --force-recreate -d nginx
43 | echo
44 |
45 | echo "### Deleting dummy certificate for $domains ..."
46 | docker-compose run --rm --entrypoint "\
47 | rm -Rf /etc/letsencrypt/live/$domains && \
48 | rm -Rf /etc/letsencrypt/archive/$domains && \
49 | rm -Rf /etc/letsencrypt/renewal/$domains.conf" certbot
50 | echo
51 |
52 |
53 | echo "### Requesting Let's Encrypt certificate for $domains ..."
54 | #Join $domains to -d args
55 | domain_args=""
56 | for domain in "${domains[@]}"; do
57 | domain_args="$domain_args -d $domain"
58 | done
59 |
60 | # Select appropriate email arg
61 | case "$email" in
62 | "") email_arg="--register-unsafely-without-email" ;;
63 | *) email_arg="--email $email" ;;
64 | esac
65 |
66 | # Enable staging mode if needed
67 | if [ $staging != "0" ]; then staging_arg="--staging"; fi
68 |
69 | docker-compose run --rm --entrypoint "\
70 | certbot certonly --webroot -w /var/www/certbot \
71 | $staging_arg \
72 | $email_arg \
73 | $domain_args \
74 | --rsa-key-size $rsa_key_size \
75 | --agree-tos \
76 | --force-renewal" certbot
77 | echo
78 |
79 | echo "### Reloading nginx ..."
80 | docker-compose exec nginx nginx -s reload
81 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | """Django's command-line utility for administrative tasks."""
3 | import os
4 | import sys
5 |
6 |
7 | def main():
8 | """Run administrative tasks."""
9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_it_django_prj.settings')
10 | try:
11 | from django.core.management import execute_from_command_line
12 | except ImportError as exc:
13 | raise ImportError(
14 | "Couldn't import Django. Are you sure it's installed and "
15 | "available on your PYTHONPATH environment variable? Did you "
16 | "forget to activate a virtual environment?"
17 | ) from exc
18 | execute_from_command_line(sys.argv)
19 |
20 |
21 | if __name__ == '__main__':
22 | main()
23 |
--------------------------------------------------------------------------------
/nginx/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx:latest
2 | RUN rm /etc/nginx/conf.d/default.conf
3 | COPY nginx.conf /etc/nginx/conf.d
4 |
--------------------------------------------------------------------------------
/nginx/nginx.conf:
--------------------------------------------------------------------------------
1 | upstream do_it_django {
2 | server web:8000;
3 | }
4 |
5 | server {
6 | listen 80;
7 | server_name sungyonglee.com;
8 |
9 | location / {
10 | return 301 https://$host$request_uri;
11 | }
12 |
13 | location /.well-known/acme-challenge/ {
14 | root /var/www/certbot;
15 | }
16 | }
17 |
18 | server {
19 | listen 443 ssl;
20 | server_name sungyonglee.com;
21 |
22 | location / {
23 | proxy_pass http://do_it_django;
24 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
25 | proxy_set_header Host $host;
26 | proxy_redirect off;
27 | }
28 |
29 | location /static/ {
30 | alias /usr/src/app/_static/;
31 | }
32 |
33 | location /media/ {
34 | alias /usr/src/app/_media/;
35 | }
36 |
37 | ssl_certificate /etc/letsencrypt/live/sungyonglee.com/fullchain.pem;
38 | ssl_certificate_key /etc/letsencrypt/live/sungyonglee.com/privkey.pem;
39 | include /etc/letsencrypt/options-ssl-nginx.conf;
40 | ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | asgiref==3.2.10
2 | backcall==0.2.0
3 | beautifulsoup4==4.9.1
4 | certifi==2020.6.20
5 | chardet==3.0.4
6 | colorama==0.4.3
7 | decorator==4.4.2
8 | defusedxml==0.6.0
9 | Django==3.1.1
10 | django-allauth==0.42.0
11 | django-crispy-forms==1.9.2
12 | django-extensions==3.0.9
13 | django-markdownx==3.0.1
14 | gunicorn==20.0.4
15 | idna==2.10
16 | importlib-metadata==2.0.0
17 | ipython==7.18.1
18 | ipython-genutils==0.2.0
19 | jedi==0.17.2
20 | Markdown==3.2.2
21 | oauthlib==3.1.0
22 | parso==0.7.1
23 | pickleshare==0.7.5
24 | Pillow==7.2.0
25 | prompt-toolkit==3.0.7
26 | psycopg2==2.8.6
27 | Pygments==2.7.1
28 | python3-openid==3.2.0
29 | pytz==2020.1
30 | requests==2.24.0
31 | requests-oauthlib==1.3.0
32 | soupsieve==2.0.1
33 | sqlparse==0.3.1
34 | traitlets==5.0.4
35 | urllib3==1.25.10
36 | wcwidth==0.2.5
37 | zipp==3.2.0
38 |
--------------------------------------------------------------------------------
/single_pages/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/single_pages/__init__.py
--------------------------------------------------------------------------------
/single_pages/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | # Register your models here.
4 |
--------------------------------------------------------------------------------
/single_pages/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class SinglePagesConfig(AppConfig):
5 | name = 'single_pages'
6 |
--------------------------------------------------------------------------------
/single_pages/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/single_pages/migrations/__init__.py
--------------------------------------------------------------------------------
/single_pages/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 |
3 | # Create your models here.
4 |
--------------------------------------------------------------------------------
/single_pages/static/single_pages/css/about_me.css:
--------------------------------------------------------------------------------
1 | .margin-for-footer {
2 | margin-bottom: 130px;
3 | }
4 |
--------------------------------------------------------------------------------
/single_pages/static/single_pages/css/landing.css:
--------------------------------------------------------------------------------
1 | body {
2 | background: url('/static/single_pages/images/amsterdam_sky.jpg') no-repeat center center fixed;
3 | -webkit-background-size: cover;
4 | -moz-background-size: cover;
5 | background-size: cover;
6 | -o-background-size: cover;
7 | }
8 |
9 | section {
10 | margin-bottom: 150px;
11 | }
12 |
13 | .card {
14 | background-color: rgba(255, 255, 255, 0.6);
15 | }
16 |
--------------------------------------------------------------------------------
/single_pages/static/single_pages/images/amsterdam_sky.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/single_pages/static/single_pages/images/amsterdam_sky.jpg
--------------------------------------------------------------------------------
/single_pages/static/single_pages/images/automation_python.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/single_pages/static/single_pages/images/automation_python.png
--------------------------------------------------------------------------------
/single_pages/static/single_pages/images/inflearn_django2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/single_pages/static/single_pages/images/inflearn_django2.png
--------------------------------------------------------------------------------
/single_pages/static/single_pages/images/my_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/single_pages/static/single_pages/images/my_back.png
--------------------------------------------------------------------------------
/single_pages/static/single_pages/images/pycon_sy_2017.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saintdragon2/do_it_django_a_to_z/f4a7b1553146ab34963496e8823a34a1e9d01443/single_pages/static/single_pages/images/pycon_sy_2017.png
--------------------------------------------------------------------------------
/single_pages/templates/single_pages/landing.html:
--------------------------------------------------------------------------------
1 |
2 | {% load static %}
3 |
4 |
5 |
6 | Do It Django
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | {% include 'blog/navbar.html' %}
15 |
16 |
17 |
18 |
19 |
20 | Do It Django
21 | 파이썬 진영의 가장 대표적인 웹프레임워크 중 하나인 django를 이용하여 여러분만의 블로그 사이트를 만들어보세요.
22 |
23 |
24 |
25 | Blog - Recent posts
26 | {% for post in recent_posts %}
27 |
28 |
29 |
30 |
31 |
32 | {{ post.author.username }}
33 |
34 |
35 | {{ post.created_at }}
36 |
37 |
38 |
39 | {% endfor %}
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | {% include 'blog/footer.html' %}
48 |
49 |
50 |
53 |
56 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/single_pages/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase, Client
2 | from django.contrib.auth.models import User
3 | from bs4 import BeautifulSoup
4 | from blog.models import Post
5 |
6 |
7 | class TestView(TestCase):
8 | def setUp(self):
9 | self.client = Client()
10 | self.user_trump = User.objects.create_user(username='trump', password='somepassword')
11 |
12 | def test_landing(self):
13 | post_001 = Post.objects.create(
14 | title='첫 번째 포스트',
15 | content='첫 번째 포스트입니다.',
16 | author=self.user_trump
17 | )
18 |
19 | post_002 = Post.objects.create(
20 | title='두 번째 포스트',
21 | content='두 번째 포스트입니다.',
22 | author=self.user_trump
23 | )
24 |
25 | post_003 = Post.objects.create(
26 | title='세 번째 포스트',
27 | content='세 번째 포스트입니다.',
28 | author=self.user_trump
29 | )
30 |
31 | post_004 = Post.objects.create(
32 | title='네 번째 포스트',
33 | content='네 번째 포스트입니다.',
34 | author=self.user_trump
35 | )
36 |
37 | response = self.client.get('')
38 | self.assertEqual(response.status_code, 200)
39 | soup = BeautifulSoup(response.content, 'html.parser')
40 |
41 | body = soup.body
42 | self.assertNotIn(post_001.title, body.text)
43 | self.assertIn(post_002.title, body.text)
44 | self.assertIn(post_003.title, body.text)
45 | self.assertIn(post_004.title, body.text)
46 |
--------------------------------------------------------------------------------
/single_pages/urls.py:
--------------------------------------------------------------------------------
1 | from django.urls import path
2 | from . import views
3 |
4 | urlpatterns = [
5 | path('about_me/', views.about_me),
6 | path('', views.landing),
7 | ]
8 |
--------------------------------------------------------------------------------
/single_pages/views.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import render
2 | from blog.models import Post
3 |
4 |
5 | def landing(request):
6 | recent_posts = Post.objects.order_by('-pk')[:3]
7 |
8 | return render(
9 | request,
10 | 'single_pages/landing.html',
11 | {
12 | 'recent_posts': recent_posts,
13 | }
14 | )
15 |
16 |
17 | def about_me(request):
18 | return render(
19 | request,
20 | 'single_pages/about_me.html'
21 | )
22 |
--------------------------------------------------------------------------------
|