├── .env.example ├── .gitignore ├── LICENSE ├── OnlineStore ├── OnlineStore │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── about │ ├── __init__.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── urls.py │ └── views.py ├── cart │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_initial.py │ │ └── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py ├── checkout │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_initial.py │ │ └── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py ├── data.json ├── manage.py ├── media │ ├── categories │ │ ├── TV_ppwkV1B.webp │ │ ├── accessories_tmYriK7.jfif │ │ ├── books_1GGrYRo.jpg │ │ ├── cloth_3lvPJ7G.jfif │ │ ├── gifts_XeUxR8Q.jfif │ │ ├── household-appliances_tBZV85q.webp │ │ ├── jewelry_RUe9kx2.jfif │ │ ├── perfumes_K06mfT5.jfif │ │ ├── shoes_SdkPIZW.jfif │ │ ├── smartphone_a95wGX0.jpg │ │ ├── tech_WrOLWez.jfif │ │ └── transport_qqhaDGt.png │ └── items │ │ ├── 1984_XO3HTUv.jpg │ │ ├── Bosch-TWK8633P_hZC2KUv.jpg │ │ ├── Columbia-Pike-Lake-Hooded-Jacket_gePQSn1.jfif │ │ ├── DeLonghi_ECAM_23.460.S.png │ │ ├── Galaxy-Tab-S7_CST8Ne2.jfif │ │ ├── JBL-Charge-5_tpjg2Xk.webp │ │ ├── Lenovo_IdeaPad_5.webp │ │ ├── Levis-501-Original-Fit-Jeans_SsgbwEn.jfif │ │ ├── Samsung_QE55QN85A.jfif │ │ ├── Sony-WH-1000XM4_YjrBbWL.jfif │ │ ├── Timberland-6-Inch-Premium-Waterproof-Boots_HoI879Z.webp │ │ ├── Xiaomi-Mi-Electric-Scooter-3_RUMgxCZ.jpg │ │ ├── Xiaomi-Mi-Smart-Band-6_wMwNqOM.jfif │ │ ├── Xiaomi-Redmi-Note-11-Pro_CgkQnGC.jpg │ │ ├── bracer_mdB2w4O.jpg │ │ ├── brilliant_ring_WMwQsJB.jpg │ │ ├── chanel-5_a1Dm3hf.jfif │ │ ├── dior-jadore_v5cw0dV.jpg │ │ ├── giorgio-armani-si_GU7DrBB.jfif │ │ ├── ice-and-fire_Ryk7YEj.jpg │ │ ├── iphone13_NZPTaAW.jpg │ │ ├── kolie.jpg │ │ ├── little-prince_YqX3QwM.webp │ │ ├── massage-chair_RrFiiNO.webp │ │ ├── smart-bottle_E5WIu9I.jpg │ │ ├── tom-ford-black-orchid_TOXDMnZ.jpg │ │ └── yves-saint-laurent-black-opium_dCWKzwO.jpg ├── static │ ├── admin │ │ ├── css │ │ │ ├── autocomplete.css │ │ │ ├── base.css │ │ │ ├── changelists.css │ │ │ ├── dashboard.css │ │ │ ├── fonts.css │ │ │ ├── forms.css │ │ │ ├── login.css │ │ │ ├── nav_sidebar.css │ │ │ ├── responsive.css │ │ │ ├── responsive_rtl.css │ │ │ ├── rtl.css │ │ │ ├── vendor │ │ │ │ └── select2 │ │ │ │ │ ├── LICENSE-SELECT2.md │ │ │ │ │ ├── select2.css │ │ │ │ │ └── select2.min.css │ │ │ └── widgets.css │ │ ├── fonts │ │ │ ├── LICENSE.txt │ │ │ ├── README.txt │ │ │ ├── Roboto-Bold-webfont.woff │ │ │ ├── Roboto-Light-webfont.woff │ │ │ └── Roboto-Regular-webfont.woff │ │ ├── img │ │ │ ├── LICENSE │ │ │ ├── README.txt │ │ │ ├── calendar-icons.svg │ │ │ ├── gis │ │ │ │ ├── move_vertex_off.svg │ │ │ │ └── move_vertex_on.svg │ │ │ ├── icon-addlink.svg │ │ │ ├── icon-alert.svg │ │ │ ├── icon-calendar.svg │ │ │ ├── icon-changelink.svg │ │ │ ├── icon-clock.svg │ │ │ ├── icon-deletelink.svg │ │ │ ├── icon-no.svg │ │ │ ├── icon-unknown-alt.svg │ │ │ ├── icon-unknown.svg │ │ │ ├── icon-viewlink.svg │ │ │ ├── icon-yes.svg │ │ │ ├── inline-delete.svg │ │ │ ├── search.svg │ │ │ ├── selector-icons.svg │ │ │ ├── sorting-icons.svg │ │ │ ├── tooltag-add.svg │ │ │ └── tooltag-arrowright.svg │ │ └── js │ │ │ ├── SelectBox.js │ │ │ ├── SelectFilter2.js │ │ │ ├── actions.js │ │ │ ├── admin │ │ │ ├── DateTimeShortcuts.js │ │ │ └── RelatedObjectLookups.js │ │ │ ├── autocomplete.js │ │ │ ├── calendar.js │ │ │ ├── cancel.js │ │ │ ├── change_form.js │ │ │ ├── collapse.js │ │ │ ├── core.js │ │ │ ├── inlines.js │ │ │ ├── jquery.init.js │ │ │ ├── nav_sidebar.js │ │ │ ├── popup_response.js │ │ │ ├── prepopulate.js │ │ │ ├── prepopulate_init.js │ │ │ ├── urlify.js │ │ │ └── vendor │ │ │ ├── jquery │ │ │ ├── LICENSE.txt │ │ │ ├── jquery.js │ │ │ └── jquery.min.js │ │ │ ├── select2 │ │ │ ├── LICENSE.md │ │ │ ├── i18n │ │ │ │ ├── af.js │ │ │ │ ├── ar.js │ │ │ │ ├── az.js │ │ │ │ ├── bg.js │ │ │ │ ├── bn.js │ │ │ │ ├── bs.js │ │ │ │ ├── ca.js │ │ │ │ ├── cs.js │ │ │ │ ├── da.js │ │ │ │ ├── de.js │ │ │ │ ├── dsb.js │ │ │ │ ├── el.js │ │ │ │ ├── en.js │ │ │ │ ├── es.js │ │ │ │ ├── et.js │ │ │ │ ├── eu.js │ │ │ │ ├── fa.js │ │ │ │ ├── fi.js │ │ │ │ ├── fr.js │ │ │ │ ├── gl.js │ │ │ │ ├── he.js │ │ │ │ ├── hi.js │ │ │ │ ├── hr.js │ │ │ │ ├── hsb.js │ │ │ │ ├── hu.js │ │ │ │ ├── hy.js │ │ │ │ ├── id.js │ │ │ │ ├── is.js │ │ │ │ ├── it.js │ │ │ │ ├── ja.js │ │ │ │ ├── ka.js │ │ │ │ ├── km.js │ │ │ │ ├── ko.js │ │ │ │ ├── lt.js │ │ │ │ ├── lv.js │ │ │ │ ├── mk.js │ │ │ │ ├── ms.js │ │ │ │ ├── nb.js │ │ │ │ ├── ne.js │ │ │ │ ├── nl.js │ │ │ │ ├── pl.js │ │ │ │ ├── ps.js │ │ │ │ ├── pt-BR.js │ │ │ │ ├── pt.js │ │ │ │ ├── ro.js │ │ │ │ ├── ru.js │ │ │ │ ├── sk.js │ │ │ │ ├── sl.js │ │ │ │ ├── sq.js │ │ │ │ ├── sr-Cyrl.js │ │ │ │ ├── sr.js │ │ │ │ ├── sv.js │ │ │ │ ├── th.js │ │ │ │ ├── tk.js │ │ │ │ ├── tr.js │ │ │ │ ├── uk.js │ │ │ │ ├── vi.js │ │ │ │ ├── zh-CN.js │ │ │ │ └── zh-TW.js │ │ │ ├── select2.full.js │ │ │ └── select2.full.min.js │ │ │ └── xregexp │ │ │ ├── LICENSE.txt │ │ │ ├── xregexp.js │ │ │ └── xregexp.min.js │ ├── assets │ │ ├── css │ │ │ ├── cart.css │ │ │ ├── checkout.css │ │ │ ├── fontawesome-all.min.css │ │ │ ├── item_details.css │ │ │ ├── main.css │ │ │ ├── noscript.css │ │ │ ├── profile.css │ │ │ └── users.css │ │ ├── js │ │ │ ├── ajax.js │ │ │ ├── breakpoints.min.js │ │ │ ├── browser.min.js │ │ │ ├── cart.js │ │ │ ├── checkout.js │ │ │ ├── jquery.min.js │ │ │ ├── main.js │ │ │ ├── payment.js │ │ │ └── util.js │ │ ├── sass │ │ │ ├── base │ │ │ │ ├── _page.scss │ │ │ │ ├── _reset.scss │ │ │ │ └── _typography.scss │ │ │ ├── components │ │ │ │ ├── _actions.scss │ │ │ │ ├── _box.scss │ │ │ │ ├── _button.scss │ │ │ │ ├── _form.scss │ │ │ │ ├── _icon.scss │ │ │ │ ├── _icons.scss │ │ │ │ ├── _image.scss │ │ │ │ ├── _list.scss │ │ │ │ ├── _row.scss │ │ │ │ ├── _section.scss │ │ │ │ ├── _table.scss │ │ │ │ └── _tiles.scss │ │ │ ├── layout │ │ │ │ ├── _footer.scss │ │ │ │ ├── _header.scss │ │ │ │ ├── _main.scss │ │ │ │ ├── _menu.scss │ │ │ │ └── _wrapper.scss │ │ │ ├── libs │ │ │ │ ├── _breakpoints.scss │ │ │ │ ├── _functions.scss │ │ │ │ ├── _html-grid.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _vars.scss │ │ │ │ └── _vendor.scss │ │ │ ├── main.scss │ │ │ └── noscript.scss │ │ └── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.svg │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.svg │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-regular-400.woff2 │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.svg │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ └── fa-solid-900.woff2 │ └── images │ │ ├── cart.jpg │ │ ├── garbage.svg │ │ ├── logo.svg │ │ ├── pic01.jpg │ │ ├── pic14.jpg │ │ └── profile.png ├── store │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── paginator.py │ ├── urls.py │ └── views.py ├── templates │ ├── about │ │ ├── author.html │ │ └── project.html │ ├── base.html │ ├── cart │ │ └── cart.html │ ├── checkout │ │ ├── checkout.html │ │ ├── popup.html │ │ └── thank_you.html │ ├── includes │ │ ├── footer.html │ │ ├── header.html │ │ └── paginator.html │ ├── store │ │ ├── item_details.html │ │ ├── main_page.html │ │ ├── tag_details.html │ │ └── tag_list.html │ └── users │ │ ├── feedback_failed.html │ │ ├── feedback_success.html │ │ ├── logged_out.html │ │ ├── login.html │ │ ├── managment │ │ ├── password_change_done.html │ │ ├── password_change_form.html │ │ ├── password_reset_complete.html │ │ ├── password_reset_confirm.html │ │ ├── password_reset_done.html │ │ ├── password_reset_email.html │ │ ├── password_reset_form.html │ │ └── reset_done.html │ │ ├── profile.html │ │ ├── signup.html │ │ └── user_orders.html └── users │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ ├── 0001_initial.py │ └── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py ├── README.md └── requirements.txt /.env.example: -------------------------------------------------------------------------------- 1 | SECRET_KEY = 'MY-SECRET_KEY' 2 | 3 | TELEGRAM_TOKEN = '013123123:qwertyuiopsdfghjklzxcvbnm,1234567890' 4 | TELEGRAM_CHAT_ID = '123456789' -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2023, Artem Natolin 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 19 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /OnlineStore/OnlineStore/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/OnlineStore/__init__.py -------------------------------------------------------------------------------- /OnlineStore/OnlineStore/asgi.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from django.core.asgi import get_asgi_application 4 | 5 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'OnlineStore.settings') 6 | 7 | application = get_asgi_application() 8 | -------------------------------------------------------------------------------- /OnlineStore/OnlineStore/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.conf.urls.static import static 3 | from django.contrib import admin 4 | from django.urls import include, path 5 | 6 | urlpatterns = [ 7 | path('admin/', admin.site.urls), 8 | path('cart/', include('cart.urls')), 9 | path('about/', include('about.urls')), 10 | path('checkout/', include('checkout.urls')), 11 | path('users/', include('users.urls')), 12 | path('', include('store.urls')), 13 | path('', include('django.contrib.auth.urls')) 14 | ] 15 | 16 | if settings.DEBUG: 17 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 18 | urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 19 | -------------------------------------------------------------------------------- /OnlineStore/OnlineStore/wsgi.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from django.core.wsgi import get_wsgi_application 4 | 5 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'OnlineStore.settings') 6 | 7 | application = get_wsgi_application() 8 | -------------------------------------------------------------------------------- /OnlineStore/about/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/about/__init__.py -------------------------------------------------------------------------------- /OnlineStore/about/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AboutConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'about' 7 | verbose_name = 'Общая информация' 8 | -------------------------------------------------------------------------------- /OnlineStore/about/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/about/migrations/__init__.py -------------------------------------------------------------------------------- /OnlineStore/about/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import AboutAuthorView, AboutProjectView 4 | 5 | app_name = 'about' 6 | 7 | urlpatterns = [ 8 | path('project/', AboutProjectView.as_view(), name='about_project'), 9 | path('me/', AboutAuthorView.as_view(), name='about_me'), 10 | ] 11 | -------------------------------------------------------------------------------- /OnlineStore/about/views.py: -------------------------------------------------------------------------------- 1 | from django.views.generic.base import TemplateView 2 | 3 | 4 | class AboutAuthorView(TemplateView): 5 | template_name = 'about/author.html' 6 | 7 | 8 | class AboutProjectView(TemplateView): 9 | template_name = 'about/project.html' 10 | -------------------------------------------------------------------------------- /OnlineStore/cart/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/cart/__init__.py -------------------------------------------------------------------------------- /OnlineStore/cart/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Cart, CartItem 4 | 5 | 6 | class CartItemAdmin(admin.ModelAdmin): 7 | list_display = ('item', 'cart', 'quantity', 'total_price_field',) 8 | search_fields = ('item__title', 'cart__user__username',) 9 | list_filter = ('item', 'cart__user',) 10 | raw_id_fields = ('item', 'cart',) 11 | 12 | def total_price_field(self, obj): 13 | return obj.total_price 14 | 15 | total_price_field.short_description = 'Общая цена' 16 | 17 | 18 | class CartAdmin(admin.ModelAdmin): 19 | list_display = ('user', 'created_at', 'cart_items', 'total_price_field',) 20 | list_filter = ('created_at',) 21 | search_fields = ('user__username', 'user__email', 'created_at',) 22 | readonly_fields = ('total_price',) 23 | 24 | def cart_items(self, obj): 25 | return [o for o in obj.items.all()] 26 | 27 | def total_price_field(self, obj): 28 | return obj.total_price 29 | 30 | cart_items.short_description = 'Список товаров' 31 | total_price_field.short_description = 'Общая цена' 32 | 33 | 34 | admin.site.register(Cart, CartAdmin) 35 | admin.site.register(CartItem, CartItemAdmin) 36 | -------------------------------------------------------------------------------- /OnlineStore/cart/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CartConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'cart' 7 | verbose_name = 'Корзина' 8 | -------------------------------------------------------------------------------- /OnlineStore/cart/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.10 on 2023-03-21 14:58 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Cart', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')), 20 | ], 21 | options={ 22 | 'verbose_name': 'Корзина', 23 | 'verbose_name_plural': 'Корзины', 24 | }, 25 | ), 26 | migrations.CreateModel( 27 | name='CartItem', 28 | fields=[ 29 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 30 | ('quantity', models.PositiveIntegerField(default=1, verbose_name='Количество')), 31 | ('cart', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='cart.cart', verbose_name='Корзина')), 32 | ], 33 | options={ 34 | 'verbose_name': 'Товар в корзине', 35 | 'verbose_name_plural': 'Товары в корзине', 36 | }, 37 | ), 38 | ] 39 | -------------------------------------------------------------------------------- /OnlineStore/cart/migrations/0002_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.10 on 2023-03-21 14:58 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ('cart', '0001_initial'), 15 | ('store', '0001_initial'), 16 | ] 17 | 18 | operations = [ 19 | migrations.AddField( 20 | model_name='cartitem', 21 | name='item', 22 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='store.item', verbose_name='Товар'), 23 | ), 24 | migrations.AddField( 25 | model_name='cart', 26 | name='user', 27 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='carts', to=settings.AUTH_USER_MODEL, verbose_name='Покупатель'), 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /OnlineStore/cart/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/cart/migrations/__init__.py -------------------------------------------------------------------------------- /OnlineStore/cart/models.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User 2 | from django.db import models 3 | 4 | from store.models import Item 5 | 6 | 7 | class Cart(models.Model): 8 | user = models.ForeignKey( 9 | User, 10 | on_delete=models.CASCADE, 11 | related_name='carts', 12 | verbose_name='Покупатель', 13 | ) 14 | created_at = models.DateTimeField( 15 | auto_now_add=True, verbose_name='Дата создания',) 16 | 17 | class Meta: 18 | verbose_name = 'Корзина' 19 | verbose_name_plural = 'Корзины' 20 | 21 | @property 22 | def total_price(self): 23 | total_price = sum(item.total_price for item in self.items.all()) 24 | return total_price 25 | 26 | def __str__(self): 27 | return f"Cart {self.id} for {self.user.username}" 28 | 29 | def clear(self): 30 | self.items.all().delete() 31 | 32 | 33 | class CartItem(models.Model): 34 | cart = models.ForeignKey( 35 | Cart, 36 | on_delete=models.CASCADE, 37 | related_name='items', 38 | verbose_name='Корзина', 39 | ) 40 | item = models.ForeignKey( 41 | Item, 42 | on_delete=models.CASCADE, 43 | verbose_name='Товар', 44 | ) 45 | quantity = models.PositiveIntegerField( 46 | default=1, verbose_name='Количество',) 47 | 48 | class Meta: 49 | verbose_name = 'Товар в корзине' 50 | verbose_name_plural = 'Товары в корзине' 51 | 52 | @property 53 | def total_price(self): 54 | total_price = self.quantity * self.item.price 55 | return total_price 56 | 57 | def __str__(self): 58 | return f"{self.quantity} x {self.item.title}" 59 | -------------------------------------------------------------------------------- /OnlineStore/cart/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import add_to_cart, cart, delete_cart_item, update_cart_item 4 | 5 | app_name = 'cart' 6 | 7 | urlpatterns = [ 8 | path('', cart, name='cart'), 9 | path('add//', add_to_cart, name='add_to_cart'), 10 | path('delete//', delete_cart_item, name='delete_cart_item'), 11 | path('update_cart_item/', update_cart_item, name='update_cart_item'), 12 | ] 13 | -------------------------------------------------------------------------------- /OnlineStore/checkout/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/checkout/__init__.py -------------------------------------------------------------------------------- /OnlineStore/checkout/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Order, OrderItem, ShippingAddress 4 | 5 | 6 | class OrderAdmin(admin.ModelAdmin): 7 | list_display = ('user', 'created_at', 'shipping_address', 'status', 8 | 'order_items', 'payment_method', 'total_price_field',) 9 | list_filter = ('status', 'payment_method',) 10 | search_fields = ('user__username', 'shipping_address__first_name', 'shipping_address__last_name',) 11 | date_hierarchy = 'created_at' 12 | 13 | def order_items(self, obj): 14 | return [o for o in obj.items.all()] 15 | 16 | def total_price_field(self, obj): 17 | return obj.total_price 18 | 19 | total_price_field.short_description = 'Общая цена' 20 | order_items.short_description = 'Список товаров' 21 | 22 | 23 | class OrderItemAdmin(admin.ModelAdmin): 24 | list_display = ('item', 'order', 'quantity', 'total_price_field',) 25 | list_filter = ('order__status',) 26 | search_fields = ('item__title', 'order__user__username',) 27 | 28 | def total_price_field(self, obj): 29 | return obj.total_price 30 | 31 | total_price_field.short_description = 'Общая цена' 32 | 33 | 34 | class ShippingAddressAdmin(admin.ModelAdmin): 35 | list_display = ('id', 'first_name', 'last_name', 'email', 36 | 'phone', 'address_line_1', 'address_line_2',) 37 | search_fields = ('first_name', 'last_name', 'email',) 38 | 39 | 40 | admin.site.register(Order, OrderAdmin) 41 | admin.site.register(OrderItem, OrderItemAdmin) 42 | admin.site.register(ShippingAddress, ShippingAddressAdmin) 43 | -------------------------------------------------------------------------------- /OnlineStore/checkout/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CheckoutConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'checkout' 7 | verbose_name = 'Оформление заказа' 8 | -------------------------------------------------------------------------------- /OnlineStore/checkout/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | from .models import Order 4 | 5 | 6 | class PlaceholderForm(forms.Form): 7 | def __init__(self, *args, **kwargs): 8 | super(PlaceholderForm, self).__init__(*args, **kwargs) 9 | for _, field in self.fields.items(): 10 | field.widget.attrs['placeholder'] = field.help_text 11 | 12 | 13 | class OrderCreateForm(PlaceholderForm): 14 | first_name = forms.CharField(max_length=100, help_text='Имя') 15 | last_name = forms.CharField(max_length=100, help_text='Фамилия') 16 | email = forms.EmailField(help_text='Email') 17 | phone = forms.CharField(max_length=20, help_text='Телефон') 18 | address_line_1 = forms.CharField(max_length=100, help_text='Адрес') 19 | address_line_2 = forms.CharField( 20 | max_length=100, 21 | required=False, 22 | help_text='Адрес (дополнительно)' 23 | ) 24 | payment_method = forms.ChoiceField(choices=Order.PAYMENT_METHOD_CHOICES) 25 | -------------------------------------------------------------------------------- /OnlineStore/checkout/migrations/0002_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.10 on 2023-03-21 14:58 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ('checkout', '0001_initial'), 15 | ('store', '0001_initial'), 16 | ] 17 | 18 | operations = [ 19 | migrations.AddField( 20 | model_name='orderitem', 21 | name='item', 22 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='store.item', verbose_name='Товар'), 23 | ), 24 | migrations.AddField( 25 | model_name='orderitem', 26 | name='order', 27 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='checkout.order', verbose_name='Заказ'), 28 | ), 29 | migrations.AddField( 30 | model_name='order', 31 | name='user', 32 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL, verbose_name='Покупатель'), 33 | ), 34 | ] 35 | -------------------------------------------------------------------------------- /OnlineStore/checkout/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/checkout/migrations/__init__.py -------------------------------------------------------------------------------- /OnlineStore/checkout/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import checkout, create_order, thank_you 4 | 5 | app_name = 'checkout' 6 | 7 | urlpatterns = [ 8 | path('', checkout, name='checkout'), 9 | path('create-order/', create_order, name='create_order'), 10 | path('thank-you//', thank_you, name='thank_you'), 11 | ] 12 | -------------------------------------------------------------------------------- /OnlineStore/checkout/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib import messages 2 | from django.contrib.auth.decorators import login_required 3 | from django.shortcuts import get_object_or_404, redirect, render 4 | 5 | from cart.views import Cart 6 | from .forms import OrderCreateForm 7 | from .models import Order, OrderItem, ShippingAddress 8 | 9 | 10 | @login_required 11 | def checkout(request): 12 | """ 13 | Представление чекаута. 14 | """ 15 | cart = Cart.objects.get(user=request.user) 16 | form = OrderCreateForm() 17 | context = {'cart': cart, 'form': form} 18 | 19 | return render(request, 'checkout/checkout.html', context) 20 | 21 | 22 | @login_required 23 | def thank_you(request, order_id): 24 | """ 25 | Страница благодарности за заказ. 26 | """ 27 | order = get_object_or_404(Order, id=order_id, user=request.user) 28 | return render(request, 'checkout/thank_you.html', {'order': order}) 29 | 30 | 31 | @login_required 32 | def create_order(request): 33 | """ 34 | Создание экземпляров Order и ShippingAddress 35 | из формы и редирект в профиль пользователя, 36 | либо передаем форму обратно. 37 | """ 38 | cart = get_object_or_404(Cart, user=request.user) 39 | 40 | if cart.items.exists() and request.method == 'POST': 41 | form = OrderCreateForm(request.POST) 42 | if form.is_valid(): 43 | order = Order.objects.create( 44 | payment_method=form.cleaned_data['payment_method'], 45 | user=request.user, 46 | ) 47 | 48 | ShippingAddress.objects.create( 49 | first_name=form.cleaned_data['first_name'], 50 | last_name=form.cleaned_data['last_name'], 51 | email=form.cleaned_data['email'], 52 | phone=form.cleaned_data['phone'], 53 | address_line_1=form.cleaned_data['address_line_1'], 54 | address_line_2=form.cleaned_data['address_line_2'], 55 | order=order, 56 | ) 57 | 58 | for cart_item in cart.items.all(): 59 | OrderItem.objects.create( 60 | order=order, 61 | item=cart_item.item, 62 | quantity=cart_item.quantity, 63 | price=cart_item.item.price 64 | ) 65 | 66 | cart.clear() 67 | return redirect('checkout:thank_you', order_id=order.id) 68 | else: 69 | form = OrderCreateForm() 70 | messages.warning( 71 | request, 'Форма не была корректно обработана, введите данные еще раз') 72 | context = {'form': form, 'cart': cart} 73 | return render(request, 'checkout/checkout.html', context) 74 | -------------------------------------------------------------------------------- /OnlineStore/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', 'OnlineStore.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 | -------------------------------------------------------------------------------- /OnlineStore/media/categories/TV_ppwkV1B.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/TV_ppwkV1B.webp -------------------------------------------------------------------------------- /OnlineStore/media/categories/accessories_tmYriK7.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/accessories_tmYriK7.jfif -------------------------------------------------------------------------------- /OnlineStore/media/categories/books_1GGrYRo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/books_1GGrYRo.jpg -------------------------------------------------------------------------------- /OnlineStore/media/categories/cloth_3lvPJ7G.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/cloth_3lvPJ7G.jfif -------------------------------------------------------------------------------- /OnlineStore/media/categories/gifts_XeUxR8Q.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/gifts_XeUxR8Q.jfif -------------------------------------------------------------------------------- /OnlineStore/media/categories/household-appliances_tBZV85q.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/household-appliances_tBZV85q.webp -------------------------------------------------------------------------------- /OnlineStore/media/categories/jewelry_RUe9kx2.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/jewelry_RUe9kx2.jfif -------------------------------------------------------------------------------- /OnlineStore/media/categories/perfumes_K06mfT5.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/perfumes_K06mfT5.jfif -------------------------------------------------------------------------------- /OnlineStore/media/categories/shoes_SdkPIZW.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/shoes_SdkPIZW.jfif -------------------------------------------------------------------------------- /OnlineStore/media/categories/smartphone_a95wGX0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/smartphone_a95wGX0.jpg -------------------------------------------------------------------------------- /OnlineStore/media/categories/tech_WrOLWez.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/tech_WrOLWez.jfif -------------------------------------------------------------------------------- /OnlineStore/media/categories/transport_qqhaDGt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/categories/transport_qqhaDGt.png -------------------------------------------------------------------------------- /OnlineStore/media/items/1984_XO3HTUv.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/1984_XO3HTUv.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/Bosch-TWK8633P_hZC2KUv.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Bosch-TWK8633P_hZC2KUv.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/Columbia-Pike-Lake-Hooded-Jacket_gePQSn1.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Columbia-Pike-Lake-Hooded-Jacket_gePQSn1.jfif -------------------------------------------------------------------------------- /OnlineStore/media/items/DeLonghi_ECAM_23.460.S.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/DeLonghi_ECAM_23.460.S.png -------------------------------------------------------------------------------- /OnlineStore/media/items/Galaxy-Tab-S7_CST8Ne2.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Galaxy-Tab-S7_CST8Ne2.jfif -------------------------------------------------------------------------------- /OnlineStore/media/items/JBL-Charge-5_tpjg2Xk.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/JBL-Charge-5_tpjg2Xk.webp -------------------------------------------------------------------------------- /OnlineStore/media/items/Lenovo_IdeaPad_5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Lenovo_IdeaPad_5.webp -------------------------------------------------------------------------------- /OnlineStore/media/items/Levis-501-Original-Fit-Jeans_SsgbwEn.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Levis-501-Original-Fit-Jeans_SsgbwEn.jfif -------------------------------------------------------------------------------- /OnlineStore/media/items/Samsung_QE55QN85A.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Samsung_QE55QN85A.jfif -------------------------------------------------------------------------------- /OnlineStore/media/items/Sony-WH-1000XM4_YjrBbWL.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Sony-WH-1000XM4_YjrBbWL.jfif -------------------------------------------------------------------------------- /OnlineStore/media/items/Timberland-6-Inch-Premium-Waterproof-Boots_HoI879Z.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Timberland-6-Inch-Premium-Waterproof-Boots_HoI879Z.webp -------------------------------------------------------------------------------- /OnlineStore/media/items/Xiaomi-Mi-Electric-Scooter-3_RUMgxCZ.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Xiaomi-Mi-Electric-Scooter-3_RUMgxCZ.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/Xiaomi-Mi-Smart-Band-6_wMwNqOM.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Xiaomi-Mi-Smart-Band-6_wMwNqOM.jfif -------------------------------------------------------------------------------- /OnlineStore/media/items/Xiaomi-Redmi-Note-11-Pro_CgkQnGC.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/Xiaomi-Redmi-Note-11-Pro_CgkQnGC.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/bracer_mdB2w4O.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/bracer_mdB2w4O.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/brilliant_ring_WMwQsJB.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/brilliant_ring_WMwQsJB.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/chanel-5_a1Dm3hf.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/chanel-5_a1Dm3hf.jfif -------------------------------------------------------------------------------- /OnlineStore/media/items/dior-jadore_v5cw0dV.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/dior-jadore_v5cw0dV.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/giorgio-armani-si_GU7DrBB.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/giorgio-armani-si_GU7DrBB.jfif -------------------------------------------------------------------------------- /OnlineStore/media/items/ice-and-fire_Ryk7YEj.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/ice-and-fire_Ryk7YEj.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/iphone13_NZPTaAW.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/iphone13_NZPTaAW.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/kolie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/kolie.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/little-prince_YqX3QwM.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/little-prince_YqX3QwM.webp -------------------------------------------------------------------------------- /OnlineStore/media/items/massage-chair_RrFiiNO.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/massage-chair_RrFiiNO.webp -------------------------------------------------------------------------------- /OnlineStore/media/items/smart-bottle_E5WIu9I.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/smart-bottle_E5WIu9I.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/tom-ford-black-orchid_TOXDMnZ.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/tom-ford-black-orchid_TOXDMnZ.jpg -------------------------------------------------------------------------------- /OnlineStore/media/items/yves-saint-laurent-black-opium_dCWKzwO.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/media/items/yves-saint-laurent-black-opium_dCWKzwO.jpg -------------------------------------------------------------------------------- /OnlineStore/static/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | 3 | .dashboard .module table th { 4 | width: 100%; 5 | } 6 | 7 | .dashboard .module table td { 8 | white-space: nowrap; 9 | } 10 | 11 | .dashboard .module table td a { 12 | display: block; 13 | padding-right: .6em; 14 | } 15 | 16 | /* RECENT ACTIONS MODULE */ 17 | 18 | .module ul.actionlist { 19 | margin-left: 0; 20 | } 21 | 22 | ul.actionlist li { 23 | list-style-type: none; 24 | overflow: hidden; 25 | text-overflow: ellipsis; 26 | } 27 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Roboto'; 3 | src: url('../fonts/Roboto-Bold-webfont.woff'); 4 | font-weight: 700; 5 | font-style: normal; 6 | } 7 | 8 | @font-face { 9 | font-family: 'Roboto'; 10 | src: url('../fonts/Roboto-Regular-webfont.woff'); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Roboto'; 17 | src: url('../fonts/Roboto-Light-webfont.woff'); 18 | font-weight: 300; 19 | font-style: normal; 20 | } 21 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | .login { 4 | background: var(--darkened-bg); 5 | height: auto; 6 | } 7 | 8 | .login #header { 9 | height: auto; 10 | padding: 15px 16px; 11 | justify-content: center; 12 | } 13 | 14 | .login #header h1 { 15 | font-size: 18px; 16 | } 17 | 18 | .login #header h1 a { 19 | color: var(--header-link-color); 20 | } 21 | 22 | .login #content { 23 | padding: 20px 20px 0; 24 | } 25 | 26 | .login #container { 27 | background: var(--body-bg); 28 | border: 1px solid var(--hairline-color); 29 | border-radius: 4px; 30 | overflow: hidden; 31 | width: 28em; 32 | min-width: 300px; 33 | margin: 100px auto; 34 | height: auto; 35 | } 36 | 37 | .login .form-row { 38 | padding: 4px 0; 39 | } 40 | 41 | .login .form-row label { 42 | display: block; 43 | line-height: 2em; 44 | } 45 | 46 | .login .form-row #id_username, .login .form-row #id_password { 47 | padding: 8px; 48 | width: 100%; 49 | box-sizing: border-box; 50 | } 51 | 52 | .login .submit-row { 53 | padding: 1em 0 0 0; 54 | margin: 0; 55 | text-align: center; 56 | } 57 | 58 | .login .password-reset-link { 59 | text-align: center; 60 | } 61 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/css/responsive_rtl.css: -------------------------------------------------------------------------------- 1 | /* TABLETS */ 2 | 3 | @media (max-width: 1024px) { 4 | [dir="rtl"] .colMS { 5 | margin-right: 0; 6 | } 7 | 8 | [dir="rtl"] #user-tools { 9 | text-align: right; 10 | } 11 | 12 | [dir="rtl"] #changelist .actions label { 13 | padding-left: 10px; 14 | padding-right: 0; 15 | } 16 | 17 | [dir="rtl"] #changelist .actions select { 18 | margin-left: 0; 19 | margin-right: 15px; 20 | } 21 | 22 | [dir="rtl"] .change-list .filtered .results, 23 | [dir="rtl"] .change-list .filtered .paginator, 24 | [dir="rtl"] .filtered #toolbar, 25 | [dir="rtl"] .filtered div.xfull, 26 | [dir="rtl"] .filtered .actions, 27 | [dir="rtl"] #changelist-filter { 28 | margin-left: 0; 29 | } 30 | 31 | [dir="rtl"] .inline-group ul.tools a.add, 32 | [dir="rtl"] .inline-group div.add-row a, 33 | [dir="rtl"] .inline-group .tabular tr.add-row td a { 34 | padding: 8px 26px 8px 10px; 35 | background-position: calc(100% - 8px) 9px; 36 | } 37 | 38 | [dir="rtl"] .related-widget-wrapper-link + .selector { 39 | margin-right: 0; 40 | margin-left: 15px; 41 | } 42 | 43 | [dir="rtl"] .selector .selector-filter label { 44 | margin-right: 0; 45 | margin-left: 8px; 46 | } 47 | 48 | [dir="rtl"] .object-tools li { 49 | float: right; 50 | } 51 | 52 | [dir="rtl"] .object-tools li + li { 53 | margin-left: 0; 54 | margin-right: 15px; 55 | } 56 | 57 | [dir="rtl"] .dashboard .module table td a { 58 | padding-left: 0; 59 | padding-right: 16px; 60 | } 61 | } 62 | 63 | /* MOBILE */ 64 | 65 | @media (max-width: 767px) { 66 | [dir="rtl"] .aligned .related-lookup, 67 | [dir="rtl"] .aligned .datetimeshortcuts { 68 | margin-left: 0; 69 | margin-right: 15px; 70 | } 71 | 72 | [dir="rtl"] .aligned ul { 73 | margin-right: 0; 74 | } 75 | 76 | [dir="rtl"] #changelist-filter { 77 | margin-left: 0; 78 | margin-right: 0; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/css/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors 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 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/fonts/README.txt: -------------------------------------------------------------------------------- 1 | Roboto webfont source: https://www.google.com/fonts/specimen/Roboto 2 | WOFF files extracted using https://github.com/majodev/google-webfonts-helper 3 | Weights used in this project: Light (300), Regular (400), Bold (700) 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /OnlineStore/static/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /OnlineStore/static/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Code Charm Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | 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, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/README.txt: -------------------------------------------------------------------------------- 1 | All icons are taken from Font Awesome (http://fontawesome.io/) project. 2 | The Font Awesome font is licensed under the SIL OFL 1.1: 3 | - https://scripts.sil.org/OFL 4 | 5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG 6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license 7 | in current folder). 8 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-viewlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/autocomplete.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const $ = django.jQuery; 4 | const init = function($element, options) { 5 | const settings = $.extend({ 6 | ajax: { 7 | data: function(params) { 8 | return { 9 | term: params.term, 10 | page: params.page, 11 | app_label: $element.data('app-label'), 12 | model_name: $element.data('model-name'), 13 | field_name: $element.data('field-name') 14 | }; 15 | } 16 | } 17 | }, options); 18 | $element.select2(settings); 19 | }; 20 | 21 | $.fn.djangoAdminSelect2 = function(options) { 22 | const settings = $.extend({}, options); 23 | $.each(this, function(i, element) { 24 | const $element = $(element); 25 | init($element, settings); 26 | }); 27 | return this; 28 | }; 29 | 30 | $(function() { 31 | // Initialize all autocomplete widgets except the one in the template 32 | // form used when a new formset is added. 33 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); 34 | }); 35 | 36 | $(document).on('formset:added', (function() { 37 | return function(event, $newFormset) { 38 | return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); 39 | }; 40 | })(this)); 41 | } 42 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/cancel.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | // Call function fn when the DOM is loaded and ready. If it is already 4 | // loaded, call the function now. 5 | // http://youmightnotneedjquery.com/#ready 6 | function ready(fn) { 7 | if (document.readyState !== 'loading') { 8 | fn(); 9 | } else { 10 | document.addEventListener('DOMContentLoaded', fn); 11 | } 12 | } 13 | 14 | ready(function() { 15 | function handleClick(event) { 16 | event.preventDefault(); 17 | const params = new URLSearchParams(window.location.search); 18 | if (params.has('_popup')) { 19 | window.close(); // Close the popup. 20 | } else { 21 | window.history.back(); // Otherwise, go back. 22 | } 23 | } 24 | 25 | document.querySelectorAll('.cancel-link').forEach(function(el) { 26 | el.addEventListener('click', handleClick); 27 | }); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/change_form.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; 4 | const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; 5 | if (modelName) { 6 | const form = document.getElementById(modelName + '_form'); 7 | for (const element of form.elements) { 8 | // HTMLElement.offsetParent returns null when the element is not 9 | // rendered. 10 | if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { 11 | element.focus(); 12 | break; 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/collapse.js: -------------------------------------------------------------------------------- 1 | /*global gettext*/ 2 | 'use strict'; 3 | { 4 | window.addEventListener('load', function() { 5 | // Add anchor tag for Show/Hide link 6 | const fieldsets = document.querySelectorAll('fieldset.collapse'); 7 | for (const [i, elem] of fieldsets.entries()) { 8 | // Don't hide if fields in this fieldset have errors 9 | if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) { 10 | elem.classList.add('collapsed'); 11 | const h2 = elem.querySelector('h2'); 12 | const link = document.createElement('a'); 13 | link.id = 'fieldsetcollapser' + i; 14 | link.className = 'collapse-toggle'; 15 | link.href = '#'; 16 | link.textContent = gettext('Show'); 17 | h2.appendChild(document.createTextNode(' (')); 18 | h2.appendChild(link); 19 | h2.appendChild(document.createTextNode(')')); 20 | } 21 | } 22 | // Add toggle to hide/show anchor tag 23 | const toggleFunc = function(ev) { 24 | if (ev.target.matches('.collapse-toggle')) { 25 | ev.preventDefault(); 26 | ev.stopPropagation(); 27 | const fieldset = ev.target.closest('fieldset'); 28 | if (fieldset.classList.contains('collapsed')) { 29 | // Show 30 | ev.target.textContent = gettext('Hide'); 31 | fieldset.classList.remove('collapsed'); 32 | } else { 33 | // Hide 34 | ev.target.textContent = gettext('Show'); 35 | fieldset.classList.add('collapsed'); 36 | } 37 | } 38 | }; 39 | document.querySelectorAll('fieldset.module').forEach(function(el) { 40 | el.addEventListener('click', toggleFunc); 41 | }); 42 | }); 43 | } 44 | -------------------------------------------------------------------------------- /OnlineStore/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 | -------------------------------------------------------------------------------- /OnlineStore/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 | -------------------------------------------------------------------------------- /OnlineStore/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 | -------------------------------------------------------------------------------- /OnlineStore/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 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/prepopulate_init.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const $ = django.jQuery; 4 | const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); 5 | $.each(fields, function(index, field) { 6 | $('.empty-form .form-row .field-' + field.name + ', .empty-form.form-row .field-' + field.name).addClass('prepopulated_field'); 7 | $(field.id).data('dependency_list', field.dependency_list).prepopulate( 8 | field.dependency_ids, field.maxLength, field.allowUnicode 9 | ); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/vendor/jquery/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright JS Foundation and other contributors, https://js.foundation/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/vendor/select2/LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors 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 | -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/vendor/select2/i18n/af.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/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/vendor/select2/i18n/ar.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/ar",[],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}(); -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/vendor/select2/i18n/az.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/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /OnlineStore/static/admin/js/vendor/select2/i18n/bg.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/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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}(); -------------------------------------------------------------------------------- /OnlineStore/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 | -------------------------------------------------------------------------------- /OnlineStore/static/assets/css/cart.css: -------------------------------------------------------------------------------- 1 | .count { 2 | display: flex; 3 | justify-content: center; 4 | text-align: center; 5 | align-items: center; 6 | max-width: 45px; 7 | max-height:45px; 8 | -webkit-box-sizing: border-box; 9 | -moz-box-sizing: border-box; 10 | box-sizing: border-box; 11 | overflow: hidden; 12 | padding: 15px; 13 | margin: auto; 14 | background: #e0e0e0; 15 | border-radius: 30px; 16 | -webkit-transition: max-width 0.5s; 17 | -moz-transition: max-width 0.5s; 18 | -o-transition: max-width 0.5s; 19 | transition: max-width 0.5s; 20 | } 21 | .count:hover, 22 | .count.active { 23 | max-width: 110px; 24 | background: #ffffff; 25 | border: 1px #c2c2c2 solid; 26 | } 27 | .count:hover input, 28 | .count.active input { 29 | border-bottom: 1px #404040 solid; 30 | margin-bottom: -1px; 31 | } 32 | .count input { 33 | width: 45px; 34 | border: none; 35 | background: transparent; 36 | text-align: center; 37 | padding: 0; 38 | margin: 0; 39 | margin-left: -3px; 40 | } 41 | .count span { 42 | cursor: pointer; 43 | } 44 | .count .minus{ 45 | font-size: 12px; 46 | margin-right: 10px; 47 | } 48 | .count .plus{ 49 | margin-left: 10px; 50 | } 51 | input[type='number'] { 52 | -moz-appearance:textfield; 53 | } 54 | input::-webkit-outer-spin-button, 55 | input::-webkit-inner-spin-button { 56 | -webkit-appearance: none; 57 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/css/checkout.css: -------------------------------------------------------------------------------- 1 | /* Error message */ 2 | .error-message { 3 | color: #dc3545; 4 | font-size: 14px; 5 | margin-top: 5px; 6 | } 7 | 8 | .error-message span { 9 | display: block; 10 | margin-bottom: 5px; 11 | } 12 | 13 | /* Popup message */ 14 | .messages-container { 15 | position: fixed; 16 | top: 0; 17 | left: 0; 18 | width: 100%; 19 | height: 10%; 20 | background-color: rgb(255, 94, 94); 21 | color: #fff; 22 | opacity: 0; 23 | transition: opacity 0.5s ease-in-out; 24 | display: flex; 25 | justify-content: center; 26 | align-items: center; 27 | z-index: 9999; 28 | } 29 | 30 | .messages-container.show { 31 | opacity: 1; 32 | } 33 | 34 | .messages-container.hide { 35 | opacity: 0; 36 | } 37 | 38 | 39 | /* Popup cart online */ 40 | .overlay { 41 | position: fixed; 42 | top: 0; 43 | left: 0; 44 | width: 100%; 45 | height: 100%; 46 | z-index: 999; 47 | background-color: rgba(0, 0, 0, 0.5); 48 | display: none; 49 | } 50 | 51 | 52 | #close-btn { 53 | position: absolute; 54 | top: 10px; 55 | right: 10px; 56 | cursor: pointer; 57 | } 58 | 59 | #online-payment-info { 60 | position: fixed; 61 | top: 50%; 62 | left: 50%; 63 | transform: translate(-50%, -50%); 64 | width: 40%; 65 | height: 70%; 66 | background-color: white; 67 | z-index: 1000; 68 | padding: 20px; 69 | display: none; 70 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/css/item_details.css: -------------------------------------------------------------------------------- 1 | .price { 2 | display: flex; 3 | justify-content: center; 4 | align-items: center; 5 | margin: 20px 0; 6 | font-size: 1.5rem; 7 | } 8 | 9 | .old-price { 10 | text-decoration: line-through; 11 | margin-right: 20px; 12 | color: #999; 13 | } 14 | 15 | .new-price { 16 | color: #ff5e00; 17 | } 18 | 19 | .cart { 20 | display: flex; 21 | justify-content: center; 22 | align-items: center; 23 | } 24 | 25 | .cart a { 26 | display: inline-block; 27 | padding: 12px 24px; 28 | background-color: #ff5e00; 29 | color: #fff; 30 | text-decoration: none; 31 | font-size: 1.2rem; 32 | border-radius: 5px; 33 | } 34 | 35 | .cart a:hover { 36 | background-color: #ff7f2a; 37 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/css/noscript.css: -------------------------------------------------------------------------------- 1 | /* 2 | Phantom by HTML5 UP 3 | html5up.net | @ajlkn 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /* Tiles */ 8 | 9 | body.is-preload .tiles article { 10 | -moz-transform: none; 11 | -webkit-transform: none; 12 | -ms-transform: none; 13 | transform: none; 14 | opacity: 1; 15 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/css/profile.css: -------------------------------------------------------------------------------- 1 | .order-wrapper { 2 | background-color: #f2f2f2; 3 | border-radius: 10px; 4 | padding: 20px; 5 | } 6 | 7 | .order-header { 8 | display: flex; 9 | justify-content: space-between; 10 | margin-bottom: 20px; 11 | } 12 | 13 | .table-wrapper { 14 | overflow-x: auto; 15 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/css/users.css: -------------------------------------------------------------------------------- 1 | .form-field { 2 | display: flex; 3 | align-items: center; 4 | } 5 | .form-field label { 6 | width: 200px; 7 | padding-right: 10px; 8 | } 9 | .form-field input { 10 | flex-grow: 1; 11 | box-sizing: border-box; 12 | } 13 | 14 | .alert-danger { 15 | color: red; 16 | } 17 | 18 | p { 19 | margin-bottom: 5px; 20 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/js/ajax.js: -------------------------------------------------------------------------------- 1 | $('.minus, .plus').click(function () { 2 | var $input = $(this).parent().find('input'); 3 | var count = parseInt($input.val()); 4 | 5 | if ($(this).hasClass('minus')) { 6 | count = count < 2 ? 1 : count - 1; 7 | } else { 8 | count = count + 1; 9 | } 10 | 11 | $input.val(count); 12 | 13 | var cartItemId = $input.attr('data-cart-item-id'); 14 | var newQuantityInput = document.getElementById('new-quantity-input'); 15 | var cartItemIdInput = document.getElementById('cart-item-id-input'); 16 | var csrfToken = $('input[name="csrfmiddlewaretoken"]').val(); 17 | var cartId = $('#cart-total-price').data('cart-id'); // Получение значения cart.id 18 | 19 | newQuantityInput.value = count; 20 | cartItemIdInput.value = cartItemId; 21 | 22 | $.ajax({ 23 | url: 'update_cart_item/', 24 | method: "POST", 25 | data: { 26 | cart_id: cartId, 27 | new_quantity: newQuantityInput.value, 28 | cart_item_id: cartItemIdInput.value, 29 | csrfmiddlewaretoken: csrfToken, 30 | }, 31 | success: function (data) { 32 | var newQuantity = data.cart_item_quantity; 33 | var newTotalPrice = data.cart_item_total_price; 34 | var newCartTotalPrice = data.cart_total_price; 35 | 36 | $('#cart-item-count').text(data.cart_item_count); 37 | $input.val(newQuantity); 38 | $('.cart-item-total-price[data-cart-item-id="' + cartItemId + '"]').text(newTotalPrice); 39 | $('#cart-total-price').text(newCartTotalPrice); 40 | 41 | console.log('Successful uptated'); 42 | }, 43 | 44 | error: function () { 45 | console.log('Failed to update cart item'); 46 | }, 47 | }); 48 | }); -------------------------------------------------------------------------------- /OnlineStore/static/assets/js/breakpoints.min.js: -------------------------------------------------------------------------------- 1 | /* breakpoints.js v1.0 | @ajlkn | MIT licensed */ 2 | var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e 0) { 7 | messagesContainer.classList.add('show'); 8 | setTimeout(function() { 9 | messagesContainer.classList.add('hide'); 10 | messagesContainer.classList.remove('show'); 11 | }, 2000); 12 | } 13 | } 14 | 15 | // Скрипт для всплывающего окна с оплатой 16 | const paymentMethodSelect = document.getElementById('id_payment_method'); 17 | const onlinePaymentInfo = document.getElementById('online-payment-info'); 18 | const overlay = document.getElementById('overlay'); 19 | const closeBtn = document.getElementById('close-btn'); 20 | 21 | paymentMethodSelect.addEventListener('change', (event) => { 22 | if (event.target.value === 'card_online') { 23 | onlinePaymentInfo.style.display = 'block'; 24 | overlay.style.display = 'block'; 25 | } else { 26 | onlinePaymentInfo.style.display = 'none'; 27 | overlay.style.display = 'none'; 28 | } 29 | }); 30 | 31 | closeBtn.addEventListener('click', () => { 32 | onlinePaymentInfo.style.display = 'none'; 33 | overlay.style.display = 'none'; 34 | }); -------------------------------------------------------------------------------- /OnlineStore/static/assets/js/payment.js: -------------------------------------------------------------------------------- 1 | // Render the PayPal button into #paypal-button-container 2 | paypal.Buttons({ 3 | // Call your server to set up the transaction 4 | createOrder: function(data, actions) { 5 | return fetch('/demo/checkout/api/paypal/order/create/', { 6 | method: 'post' 7 | }).then(function(res) { 8 | return res.json(); 9 | }).then(function(orderData) { 10 | return orderData.id; 11 | }); 12 | }, 13 | 14 | // Call your server to finalize the transaction 15 | onApprove: function(data, actions) { 16 | return fetch('/demo/checkout/api/paypal/order/' + data.orderID + '/capture/', { 17 | method: 'post' 18 | }).then(function(res) { 19 | return res.json(); 20 | }).then(function(orderData) { 21 | // Three cases to handle: 22 | // (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart() 23 | // (2) Other non-recoverable errors -> Show a failure message 24 | // (3) Successful transaction -> Show confirmation or thank you 25 | 26 | // This example reads a v2/checkout/orders capture response, propagated from the server 27 | // You could use a different API or structure for your 'orderData' 28 | var errorDetail = Array.isArray(orderData.details) && orderData.details[0]; 29 | 30 | if (errorDetail && errorDetail.issue === 'INSTRUMENT_DECLINED') { 31 | return actions.restart(); // Recoverable state, per: 32 | // https://developer.paypal.com/docs/checkout/integration-features/funding-failure/ 33 | } 34 | 35 | if (errorDetail) { 36 | var msg = 'Sorry, your transaction could not be processed.'; 37 | if (errorDetail.description) msg += '\n\n' + errorDetail.description; 38 | if (orderData.debug_id) msg += ' (' + orderData.debug_id + ')'; 39 | return alert(msg); // Show a failure message (try to avoid alerts in production environments) 40 | } 41 | 42 | // Successful capture! For demo purposes: 43 | console.log('Capture result', orderData, JSON.stringify(orderData, null, 2)); 44 | var transaction = orderData.purchase_units[0].payments.captures[0]; 45 | alert('Transaction '+ transaction.status + ': ' + transaction.id + '\n\nSee console for all available details'); 46 | 47 | actions.redirect('thank_you.html'); 48 | }); 49 | } 50 | }).render('#paypal-button-container'); -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/base/_page.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Basic */ 8 | 9 | // MSIE: Required for IEMobile. 10 | @-ms-viewport { 11 | width: device-width; 12 | } 13 | 14 | // MSIE: Prevents scrollbar from overlapping content. 15 | body { 16 | -ms-overflow-style: scrollbar; 17 | } 18 | 19 | // Ensures page width is always >=320px. 20 | @include breakpoint('<=xsmall') { 21 | html, body { 22 | min-width: 320px; 23 | } 24 | } 25 | 26 | // Set box model to border-box. 27 | // Based on css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice 28 | html { 29 | box-sizing: border-box; 30 | } 31 | 32 | *, *:before, *:after { 33 | box-sizing: inherit; 34 | } 35 | 36 | body { 37 | background: _palette(bg); 38 | 39 | // Stops initial animations until page loads. 40 | &.is-preload { 41 | *, *:before, *:after { 42 | @include vendor('animation', 'none !important'); 43 | @include vendor('transition', 'none !important'); 44 | } 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/base/_reset.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | // Reset. 8 | // Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain) 9 | 10 | html, body, div, span, applet, object, 11 | iframe, h1, h2, h3, h4, h5, h6, p, blockquote, 12 | pre, a, abbr, acronym, address, big, cite, 13 | code, del, dfn, em, img, ins, kbd, q, s, samp, 14 | small, strike, strong, sub, sup, tt, var, b, 15 | u, i, center, dl, dt, dd, ol, ul, li, fieldset, 16 | form, label, legend, table, caption, tbody, 17 | tfoot, thead, tr, th, td, article, aside, 18 | canvas, details, embed, figure, figcaption, 19 | footer, header, hgroup, menu, nav, output, ruby, 20 | section, summary, time, mark, audio, video { 21 | margin: 0; 22 | padding: 0; 23 | border: 0; 24 | font-size: 100%; 25 | font: inherit; 26 | vertical-align: baseline; 27 | } 28 | 29 | article, aside, details, figcaption, figure, 30 | footer, header, hgroup, menu, nav, section { 31 | display: block; 32 | } 33 | 34 | body { 35 | line-height: 1; 36 | } 37 | 38 | ol, ul { 39 | list-style:none; 40 | } 41 | 42 | blockquote, q { 43 | quotes: none; 44 | 45 | &:before, 46 | &:after { 47 | content: ''; 48 | content: none; 49 | } 50 | } 51 | 52 | table { 53 | border-collapse: collapse; 54 | border-spacing: 0; 55 | } 56 | 57 | body { 58 | -webkit-text-size-adjust: none; 59 | } 60 | 61 | mark { 62 | background-color: transparent; 63 | color: inherit; 64 | } 65 | 66 | input::-moz-focus-inner { 67 | border: 0; 68 | padding: 0; 69 | } 70 | 71 | input, select, textarea { 72 | -moz-appearance: none; 73 | -webkit-appearance: none; 74 | -ms-appearance: none; 75 | appearance: none; 76 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_actions.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Actions */ 8 | 9 | ul.actions { 10 | @include vendor('display', 'flex'); 11 | cursor: default; 12 | list-style: none; 13 | margin-left: (_size(element-margin) * -0.5); 14 | padding-left: 0; 15 | 16 | li { 17 | padding: 0 0 0 (_size(element-margin) * 0.5); 18 | vertical-align: middle; 19 | } 20 | 21 | &.special { 22 | @include vendor('justify-content', 'center'); 23 | width: 100%; 24 | margin-left: 0; 25 | 26 | li { 27 | &:first-child { 28 | padding-left: 0; 29 | } 30 | } 31 | } 32 | 33 | &.stacked { 34 | @include vendor('flex-direction', 'column'); 35 | margin-left: 0; 36 | 37 | li { 38 | padding: (_size(element-margin) * 0.65) 0 0 0; 39 | 40 | &:first-child { 41 | padding-top: 0; 42 | } 43 | } 44 | } 45 | 46 | &.fit { 47 | width: calc(100% + #{_size(element-margin) * 0.5}); 48 | 49 | li { 50 | @include vendor('flex-grow', '1'); 51 | @include vendor('flex-shrink', '1'); 52 | width: 100%; 53 | 54 | > * { 55 | width: 100%; 56 | } 57 | } 58 | 59 | &.stacked { 60 | width: 100%; 61 | } 62 | } 63 | 64 | @include breakpoint('<=xsmall') { 65 | &:not(.fixed) { 66 | @include vendor('flex-direction', 'column'); 67 | margin-left: 0; 68 | width: 100% !important; 69 | 70 | li { 71 | @include vendor('flex-grow', '1'); 72 | @include vendor('flex-shrink', '1'); 73 | padding: (_size(element-margin) * 0.5) 0 0 0; 74 | text-align: center; 75 | width: 100%; 76 | 77 | > * { 78 | width: 100%; 79 | } 80 | 81 | &:first-child { 82 | padding-top: 0; 83 | } 84 | 85 | input[type="submit"], 86 | input[type="reset"], 87 | input[type="button"], 88 | button, 89 | .button { 90 | width: 100%; 91 | 92 | &.icon { 93 | &:before { 94 | margin-left: -0.5rem; 95 | } 96 | } 97 | } 98 | } 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_box.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Box */ 8 | 9 | .box { 10 | border-radius: _size(border-radius); 11 | border: solid _size(border-width) _palette(border); 12 | margin-bottom: _size(element-margin); 13 | padding: 1.5em; 14 | 15 | > :last-child, 16 | > :last-child > :last-child, 17 | > :last-child > :last-child > :last-child { 18 | margin-bottom: 0; 19 | } 20 | 21 | &.alt { 22 | border: 0; 23 | border-radius: 0; 24 | padding: 0; 25 | } 26 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_button.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Button */ 8 | 9 | input[type="submit"], 10 | input[type="reset"], 11 | input[type="button"], 12 | button, 13 | .button { 14 | @include vendor('appearance', 'none'); 15 | @include vendor('transition', ( 16 | 'background-color #{_duration(transition)} ease-in-out', 17 | 'color #{_duration(transition)} ease-in-out', 18 | 'box-shadow #{_duration(transition)} ease-in-out' 19 | )); 20 | background-color: transparent; 21 | border-radius: _size(border-radius); 22 | border: 0; 23 | box-shadow: inset 0 0 0 (_size(border-width) * 2) _palette(fg); 24 | color: _palette(fg) !important; 25 | cursor: pointer; 26 | display: inline-block; 27 | font-size: 0.8em; 28 | font-weight: _font(weight-bold); 29 | height: 3.5em; 30 | letter-spacing: _font(letter-spacing); 31 | line-height: 3.45em; 32 | overflow: hidden; 33 | padding: 0 1.25em 0 #{1.25em + _font(letter-spacing)}; 34 | text-align: center; 35 | text-decoration: none; 36 | text-overflow: ellipsis; 37 | text-transform: uppercase; 38 | white-space: nowrap; 39 | 40 | &.icon { 41 | &:before { 42 | margin-right: 0.5em; 43 | } 44 | } 45 | 46 | &.fit { 47 | width: 100%; 48 | } 49 | 50 | &:hover { 51 | color: _palette(accent1) !important; 52 | box-shadow: inset 0 0 0 (_size(border-width) * 2) _palette(accent1); 53 | } 54 | 55 | &:active { 56 | background-color: transparentize(_palette(accent1), 0.9); 57 | } 58 | 59 | &.small { 60 | font-size: 0.6em; 61 | } 62 | 63 | &.large { 64 | font-size: 1em; 65 | } 66 | 67 | &.primary { 68 | box-shadow: none; 69 | background-color: _palette(fg); 70 | color: _palette(bg) !important; 71 | 72 | &:hover { 73 | background-color: _palette(accent1); 74 | } 75 | 76 | &:active { 77 | background-color: darken(_palette(accent1), 8); 78 | } 79 | } 80 | 81 | &.disabled, 82 | &:disabled { 83 | @include vendor('pointer-events', 'none'); 84 | opacity: 0.25; 85 | } 86 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_icon.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Icon */ 8 | 9 | .icon { 10 | @include icon; 11 | border-bottom: none; 12 | position: relative; 13 | 14 | > .label { 15 | display: none; 16 | } 17 | 18 | &:before { 19 | line-height: inherit; 20 | } 21 | 22 | &.solid { 23 | &:before { 24 | font-weight: 900; 25 | } 26 | } 27 | 28 | &.brands { 29 | &:before { 30 | font-family: 'Font Awesome 5 Brands'; 31 | } 32 | } 33 | 34 | &.style1 { 35 | } 36 | 37 | &.style2 { 38 | @include vendor('transition', ( 39 | 'background-color #{_duration(transition)} ease-in-out', 40 | 'color #{_duration(transition)} ease-in-out', 41 | 'border-color #{_duration(transition)} ease-in-out' 42 | )); 43 | background-color: transparent; 44 | border: solid 1px _palette(border); 45 | border-radius: _size(border-radius); 46 | width: 2.65em; 47 | height: 2.65em; 48 | display: inline-block; 49 | text-align: center; 50 | line-height: 2.65em; 51 | color: inherit; 52 | 53 | &:before { 54 | font-size: 1.1em; 55 | } 56 | 57 | &:hover { 58 | color: _palette(accent1); 59 | border-color: _palette(accent1); 60 | } 61 | 62 | &:active { 63 | background-color: transparentize(_palette(accent1), 0.9); 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_icons.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Icons */ 8 | 9 | ul.icons { 10 | cursor: default; 11 | list-style: none; 12 | padding-left: 0; 13 | margin: -1em 0 _size(element-margin) -1em; 14 | 15 | li { 16 | display: inline-block; 17 | padding: 1em 0 0 1em; 18 | } 19 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_image.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Image */ 8 | 9 | .image { 10 | border-radius: _size(border-radius); 11 | border: 0; 12 | display: inline-block; 13 | position: relative; 14 | 15 | img { 16 | border-radius: _size(border-radius); 17 | display: block; 18 | } 19 | 20 | &.left, 21 | &.right { 22 | max-width: 40%; 23 | 24 | img { 25 | width: 100%; 26 | } 27 | } 28 | 29 | &.left { 30 | float: left; 31 | padding: 0 1.5em 1em 0; 32 | top: 0.25em; 33 | } 34 | 35 | &.right { 36 | float: right; 37 | padding: 0 0 1em 1.5em; 38 | top: 0.25em; 39 | } 40 | 41 | &.fit { 42 | display: block; 43 | margin: 0 0 _size(element-margin) 0; 44 | width: 100%; 45 | 46 | img { 47 | width: 100%; 48 | } 49 | } 50 | 51 | &.main { 52 | display: block; 53 | margin: 0 0 (_size(element-margin) * 1.5) 0; 54 | width: 100%; 55 | 56 | img { 57 | width: 100%; 58 | } 59 | 60 | @include breakpoint('<=small') { 61 | margin: 0 0 _size(element-margin) 0; 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_list.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* List */ 8 | 9 | ol { 10 | list-style: decimal; 11 | margin: 0 0 _size(element-margin) 0; 12 | padding-left: 1.25em; 13 | 14 | li { 15 | padding-left: 0.25em; 16 | } 17 | } 18 | 19 | ul { 20 | list-style: disc; 21 | margin: 0 0 _size(element-margin) 0; 22 | padding-left: 1em; 23 | 24 | li { 25 | padding-left: 0.5em; 26 | } 27 | 28 | &.alt { 29 | list-style: none; 30 | padding-left: 0; 31 | 32 | li { 33 | border-top: solid _size(border-width) _palette(border); 34 | padding: 0.5em 0; 35 | 36 | &:first-child { 37 | border-top: 0; 38 | padding-top: 0; 39 | } 40 | } 41 | } 42 | } 43 | 44 | dl { 45 | margin: 0 0 _size(element-margin) 0; 46 | 47 | dt { 48 | display: block; 49 | font-weight: _font(weight-bold); 50 | margin: 0 0 (_size(element-margin) * 0.5) 0; 51 | } 52 | 53 | dd { 54 | margin-left: _size(element-margin); 55 | } 56 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_row.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Row */ 8 | 9 | .row { 10 | @include html-grid(2em); 11 | 12 | @include breakpoint('<=xlarge') { 13 | @include html-grid(2em, 'xlarge'); 14 | } 15 | 16 | @include breakpoint('<=large') { 17 | @include html-grid(2em, 'large'); 18 | } 19 | 20 | @include breakpoint('<=medium') { 21 | @include html-grid(1.5em, 'medium'); 22 | } 23 | 24 | @include breakpoint('<=small') { 25 | @include html-grid(1em, 'small'); 26 | } 27 | 28 | @include breakpoint('<=xsmall') { 29 | @include html-grid(1em, 'xsmall'); 30 | } 31 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_section.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Section/Article */ 8 | 9 | section, article { 10 | &.special { 11 | text-align: center; 12 | } 13 | } 14 | 15 | header { 16 | p { 17 | margin-top: _size(element-margin) * -0.5; 18 | } 19 | 20 | @include breakpoint('<=small') { 21 | p { 22 | margin-top: 0; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/components/_table.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Table */ 8 | 9 | .table-wrapper { 10 | -webkit-overflow-scrolling: touch; 11 | overflow-x: auto; 12 | } 13 | 14 | table { 15 | margin: 0 0 _size(element-margin) 0; 16 | width: 100%; 17 | 18 | tbody { 19 | tr { 20 | border: solid _size(border-width) _palette(border); 21 | border-left: 0; 22 | border-right: 0; 23 | 24 | &:nth-child(2n + 1) { 25 | background-color: _palette(border-bg); 26 | } 27 | } 28 | } 29 | 30 | td { 31 | padding: 0.75em 0.75em; 32 | } 33 | 34 | th { 35 | color: _palette(fg-bold); 36 | font-size: 0.9em; 37 | font-weight: _font(weight-bold); 38 | padding: 0 0.75em 0.75em 0.75em; 39 | text-align: left; 40 | } 41 | 42 | thead { 43 | border-bottom: solid (_size(border-width) * 2) _palette(border); 44 | } 45 | 46 | tfoot { 47 | border-top: solid (_size(border-width) * 2) _palette(border); 48 | } 49 | 50 | &.alt { 51 | border-collapse: separate; 52 | 53 | tbody { 54 | tr { 55 | td { 56 | border: solid _size(border-width) _palette(border); 57 | border-left-width: 0; 58 | border-top-width: 0; 59 | 60 | &:first-child { 61 | border-left-width: _size(border-width); 62 | } 63 | } 64 | 65 | &:first-child { 66 | td { 67 | border-top-width: _size(border-width); 68 | } 69 | } 70 | } 71 | } 72 | 73 | thead { 74 | border-bottom: 0; 75 | } 76 | 77 | tfoot { 78 | border-top: 0; 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/layout/_main.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Main */ 8 | 9 | #main { 10 | @include padding(5em, 0, (-5em, 0, 3em, 0)); 11 | 12 | @include breakpoint('<=small') { 13 | @include padding(3em, 0, (-3em, 0, 3em, 0)); 14 | } 15 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/layout/_wrapper.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Wrapper */ 8 | 9 | #wrapper { 10 | > * { 11 | > .inner { 12 | $gutter: _size(gutter); 13 | 14 | width: 100%; 15 | max-width: _size(inner); 16 | margin: 0 auto; 17 | padding: 0 $gutter; 18 | 19 | @include breakpoint('<=small') { 20 | $gutter: _size(gutter) * 0.5; 21 | 22 | padding: 0 $gutter; 23 | } 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/libs/_functions.scss: -------------------------------------------------------------------------------- 1 | /// Removes a specific item from a list. 2 | /// @author Hugo Giraudel 3 | /// @param {list} $list List. 4 | /// @param {integer} $index Index. 5 | /// @return {list} Updated list. 6 | @function remove-nth($list, $index) { 7 | 8 | $result: null; 9 | 10 | @if type-of($index) != number { 11 | @warn "$index: #{quote($index)} is not a number for `remove-nth`."; 12 | } 13 | @else if $index == 0 { 14 | @warn "List index 0 must be a non-zero integer for `remove-nth`."; 15 | } 16 | @else if abs($index) > length($list) { 17 | @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; 18 | } 19 | @else { 20 | 21 | $result: (); 22 | $index: if($index < 0, length($list) + $index + 1, $index); 23 | 24 | @for $i from 1 through length($list) { 25 | 26 | @if $i != $index { 27 | $result: append($result, nth($list, $i)); 28 | } 29 | 30 | } 31 | 32 | } 33 | 34 | @return $result; 35 | 36 | } 37 | 38 | /// Gets a value from a map. 39 | /// @author Hugo Giraudel 40 | /// @param {map} $map Map. 41 | /// @param {string} $keys Key(s). 42 | /// @return {string} Value. 43 | @function val($map, $keys...) { 44 | 45 | @if nth($keys, 1) == null { 46 | $keys: remove-nth($keys, 1); 47 | } 48 | 49 | @each $key in $keys { 50 | $map: map-get($map, $key); 51 | } 52 | 53 | @return $map; 54 | 55 | } 56 | 57 | /// Gets a duration value. 58 | /// @param {string} $keys Key(s). 59 | /// @return {string} Value. 60 | @function _duration($keys...) { 61 | @return val($duration, $keys...); 62 | } 63 | 64 | /// Gets a font value. 65 | /// @param {string} $keys Key(s). 66 | /// @return {string} Value. 67 | @function _font($keys...) { 68 | @return val($font, $keys...); 69 | } 70 | 71 | /// Gets a misc value. 72 | /// @param {string} $keys Key(s). 73 | /// @return {string} Value. 74 | @function _misc($keys...) { 75 | @return val($misc, $keys...); 76 | } 77 | 78 | /// Gets a palette value. 79 | /// @param {string} $keys Key(s). 80 | /// @return {string} Value. 81 | @function _palette($keys...) { 82 | @return val($palette, $keys...); 83 | } 84 | 85 | /// Gets a size value. 86 | /// @param {string} $keys Key(s). 87 | /// @return {string} Value. 88 | @function _size($keys...) { 89 | @return val($size, $keys...); 90 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/libs/_mixins.scss: -------------------------------------------------------------------------------- 1 | /// Makes an element's :before pseudoelement a FontAwesome icon. 2 | /// @param {string} $content Optional content value to use. 3 | /// @param {string} $category Optional category to use. 4 | /// @param {string} $where Optional pseudoelement to target (before or after). 5 | @mixin icon($content: false, $category: regular, $where: before) { 6 | 7 | text-decoration: none; 8 | 9 | &:#{$where} { 10 | 11 | @if $content { 12 | content: $content; 13 | } 14 | 15 | -moz-osx-font-smoothing: grayscale; 16 | -webkit-font-smoothing: antialiased; 17 | display: inline-block; 18 | font-style: normal; 19 | font-variant: normal; 20 | text-rendering: auto; 21 | line-height: 1; 22 | text-transform: none !important; 23 | 24 | @if ($category == brands) { 25 | font-family: 'Font Awesome 5 Brands'; 26 | } 27 | @elseif ($category == solid) { 28 | font-family: 'Font Awesome 5 Free'; 29 | font-weight: 900; 30 | } 31 | @else { 32 | font-family: 'Font Awesome 5 Free'; 33 | font-weight: 400; 34 | } 35 | 36 | } 37 | 38 | } 39 | 40 | /// Applies padding to an element, taking the current element-margin value into account. 41 | /// @param {mixed} $tb Top/bottom padding. 42 | /// @param {mixed} $lr Left/right padding. 43 | /// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) 44 | /// @param {bool} $important If true, adds !important. 45 | @mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { 46 | 47 | @if $important { 48 | $important: '!important'; 49 | } 50 | 51 | $x: 0.1em; 52 | 53 | @if unit(_size(element-margin)) == 'rem' { 54 | $x: 0.1rem; 55 | } 56 | 57 | padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; 58 | 59 | } 60 | 61 | /// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). 62 | /// @param {string} $svg SVG data URL. 63 | /// @return {string} Encoded SVG data URL. 64 | @function svg-url($svg) { 65 | 66 | $svg: str-replace($svg, '"', '\''); 67 | $svg: str-replace($svg, '%', '%25'); 68 | $svg: str-replace($svg, '<', '%3C'); 69 | $svg: str-replace($svg, '>', '%3E'); 70 | $svg: str-replace($svg, '&', '%26'); 71 | $svg: str-replace($svg, '#', '%23'); 72 | $svg: str-replace($svg, '{', '%7B'); 73 | $svg: str-replace($svg, '}', '%7D'); 74 | $svg: str-replace($svg, ';', '%3B'); 75 | 76 | @return url("data:image/svg+xml;charset=utf8,#{$svg}"); 77 | 78 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/libs/_vars.scss: -------------------------------------------------------------------------------- 1 | // Misc. 2 | $misc: ( 3 | z-index-base: 10000 4 | ); 5 | 6 | // Duration. 7 | $duration: ( 8 | menu: 0.45s, 9 | transition: 0.2s 10 | ); 11 | 12 | // Size. 13 | $size: ( 14 | border-radius: 4px, 15 | border-width: 1px, 16 | element-height: 3em, 17 | element-margin: 2em, 18 | gutter: 2.5em, 19 | field-gutter: 2em, 20 | inner: 68em, 21 | menu: 22em 22 | ); 23 | 24 | // Font. 25 | $font: ( 26 | family: ('Source Sans Pro', Helvetica, sans-serif), 27 | family-fixed: ('Courier New', monospace), 28 | weight: 300, 29 | weight-bold: 900, 30 | weight-bold-alt: 700, 31 | letter-spacing: 0.35em, 32 | letter-spacing-alt: -0.035em 33 | ); 34 | 35 | // Palette. 36 | $palette: ( 37 | bg: #ffffff, 38 | bg-accent: #333333, 39 | bg-alt: #f6f6f6, 40 | fg: #585858, 41 | fg-accent: #ffffff, 42 | border: #c9c9c9, 43 | border-bg: rgba(144,144,144,0.075), 44 | accent1: #f2849e, 45 | accent2: #7ecaf6, 46 | accent3: #7bd0c1, 47 | accent4: #c75b9b, 48 | accent5: #ae85ca, 49 | accent6: #8499e7, 50 | ); -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/main.scss: -------------------------------------------------------------------------------- 1 | @import 'libs/vars'; 2 | @import 'libs/functions'; 3 | @import 'libs/mixins'; 4 | @import 'libs/vendor'; 5 | @import 'libs/breakpoints'; 6 | @import 'libs/html-grid'; 7 | @import 'fontawesome-all.min.css'; 8 | @import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,700,900'); 9 | 10 | /* 11 | Phantom by HTML5 UP 12 | html5up.net | @ajlkn 13 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 14 | */ 15 | 16 | // Breakpoints. 17 | 18 | @include breakpoints(( 19 | xlarge: ( 1281px, 1680px ), 20 | large: ( 981px, 1280px ), 21 | medium: ( 737px, 980px ), 22 | small: ( 481px, 736px ), 23 | xsmall: ( 361px, 480px ), 24 | xxsmall: ( null, 360px ) 25 | )); 26 | 27 | // Base. 28 | 29 | @import 'base/reset'; 30 | @import 'base/page'; 31 | @import 'base/typography'; 32 | 33 | // Component. 34 | 35 | @import 'components/row'; 36 | @import 'components/section'; 37 | @import 'components/icon'; 38 | @import 'components/list'; 39 | @import 'components/actions'; 40 | @import 'components/icons'; 41 | @import 'components/form'; 42 | @import 'components/box'; 43 | @import 'components/image'; 44 | @import 'components/table'; 45 | @import 'components/button'; 46 | @import 'components/tiles'; 47 | 48 | // Layout. 49 | 50 | @import 'layout/header'; 51 | @import 'layout/menu'; 52 | @import 'layout/main'; 53 | @import 'layout/footer'; 54 | @import 'layout/wrapper'; -------------------------------------------------------------------------------- /OnlineStore/static/assets/sass/noscript.scss: -------------------------------------------------------------------------------- 1 | @import 'libs/vars'; 2 | @import 'libs/functions'; 3 | @import 'libs/mixins'; 4 | @import 'libs/vendor'; 5 | @import 'libs/breakpoints'; 6 | @import 'libs/html-grid'; 7 | 8 | /* 9 | Phantom by HTML5 UP 10 | html5up.net | @ajlkn 11 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 12 | */ 13 | 14 | /* Tiles */ 15 | 16 | .tiles { 17 | body.is-preload & { 18 | article { 19 | @include vendor('transform', 'none'); 20 | opacity: 1; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /OnlineStore/static/assets/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/assets/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /OnlineStore/static/images/cart.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/images/cart.jpg -------------------------------------------------------------------------------- /OnlineStore/static/images/garbage.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /OnlineStore/static/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /OnlineStore/static/images/pic01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/images/pic01.jpg -------------------------------------------------------------------------------- /OnlineStore/static/images/pic14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/images/pic14.jpg -------------------------------------------------------------------------------- /OnlineStore/static/images/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/static/images/profile.png -------------------------------------------------------------------------------- /OnlineStore/store/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/store/__init__.py -------------------------------------------------------------------------------- /OnlineStore/store/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Item, ItemTag 4 | 5 | 6 | class ItemAdmin(admin.ModelAdmin): 7 | list_display = ('title', 'short_description', 'slug', 'price', 8 | 'old_price', 'is_available', 'tag_list',) 9 | search_fields = ('title', 'description', 'tags__name',) 10 | list_filter = ('is_available', 'tags',) 11 | 12 | def short_description(self, obj): 13 | if len(obj.description) > 100: 14 | return obj.description[:100] + '...' 15 | else: 16 | return obj.description 17 | 18 | def get_queryset(self, request): 19 | return super().get_queryset(request).prefetch_related('tags') 20 | 21 | def tag_list(self, obj): 22 | return u", ".join(o.name for o in obj.tags.all()) 23 | 24 | short_description.short_description = 'Описание' 25 | tag_list.short_description = 'Список категорий' 26 | 27 | 28 | class ItemTagAdmin(admin.ModelAdmin): 29 | list_display = ('name', 'slug', 'short_description', 'item_list',) 30 | 31 | def short_description(self, obj): 32 | if len(obj.description) > 100: 33 | return obj.description[:100] + '...' 34 | else: 35 | return obj.description 36 | 37 | def item_list(self, obj): 38 | return [Item.objects.get( 39 | pk=o.get('object_id') 40 | ) for o in obj.items.values()] 41 | 42 | short_description.short_description = 'Описание' 43 | item_list.short_description = 'Список товаров' 44 | 45 | 46 | admin.site.register(Item, ItemAdmin) 47 | admin.site.register(ItemTag, ItemTagAdmin) 48 | -------------------------------------------------------------------------------- /OnlineStore/store/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class StoreConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'store' 7 | verbose_name = 'Магазин' 8 | -------------------------------------------------------------------------------- /OnlineStore/store/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/store/migrations/__init__.py -------------------------------------------------------------------------------- /OnlineStore/store/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils.translation import gettext_lazy as _ 3 | from taggit.managers import TaggableManager 4 | from taggit.models import GenericTaggedItemBase, TagBase 5 | 6 | 7 | class ItemTag(TagBase): 8 | image = models.ImageField( 9 | upload_to='categories/', 10 | verbose_name='Изображение', 11 | blank=True 12 | ) 13 | description = models.TextField( 14 | blank=True, 15 | verbose_name='Описание', 16 | ) 17 | 18 | class Meta: 19 | verbose_name = _("Категория") 20 | verbose_name_plural = _("Категории") 21 | 22 | 23 | class TaggedItem(GenericTaggedItemBase): 24 | tag = models.ForeignKey( 25 | ItemTag, 26 | on_delete=models.CASCADE, 27 | related_name="items", 28 | verbose_name='Категория', 29 | ) 30 | 31 | 32 | class Item(models.Model): 33 | title = models.CharField(max_length=200, verbose_name='Название',) 34 | description = models.TextField(verbose_name='Описание',) 35 | slug = models.CharField( 36 | unique=True, 37 | max_length=50, 38 | ) 39 | pub_date = models.DateTimeField(auto_now_add=True, verbose_name='Дата добавления',) 40 | price = models.DecimalField( 41 | max_digits=8, 42 | decimal_places=2, 43 | verbose_name='Новая цена', 44 | ) 45 | old_price = models.DecimalField( 46 | max_digits=8, 47 | decimal_places=2, 48 | verbose_name='Старая цена', 49 | blank=True, 50 | null=True, 51 | ) 52 | image = models.ImageField( 53 | verbose_name='Изображение', 54 | upload_to='items/', 55 | blank=True, 56 | ) 57 | is_available = models.BooleanField( 58 | default=True, 59 | verbose_name='Доступно', 60 | ) 61 | tags = TaggableManager(through=TaggedItem, related_name="tagged_items", verbose_name='Категории',) 62 | 63 | def __str__(self): 64 | return self.title 65 | 66 | class Meta: 67 | ordering = ['-price'] 68 | verbose_name = 'Товар' 69 | verbose_name_plural = 'Товары' 70 | -------------------------------------------------------------------------------- /OnlineStore/store/paginator.py: -------------------------------------------------------------------------------- 1 | from django.core.paginator import Paginator 2 | 3 | 4 | def paginator(request, items, items_on_page): 5 | paginator = Paginator(items, items_on_page) 6 | page_number = request.GET.get('page') 7 | 8 | return paginator.get_page(page_number) 9 | -------------------------------------------------------------------------------- /OnlineStore/store/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import item_details, store, tag_details, tag_list 4 | 5 | app_name = 'store' 6 | 7 | 8 | urlpatterns = [ 9 | path('', store, name='home'), 10 | path('categories/', tag_list, name='tag_list'), 11 | path('category-details//', tag_details, name='tag_details'), 12 | path('/', item_details, name='item_details'), 13 | ] 14 | -------------------------------------------------------------------------------- /OnlineStore/store/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import get_object_or_404, render 2 | 3 | from .models import Item, ItemTag 4 | from .paginator import paginator 5 | 6 | 7 | def store(request): 8 | items = Item.objects.filter(is_available=True) 9 | context = { 10 | 'page_obj': paginator(request, items, 9), 11 | 'range': [*range(1, 7)], # For random css styles 12 | } 13 | 14 | return render(request, 'store/main_page.html', context) 15 | 16 | 17 | def item_details(request, item_slug): 18 | item = get_object_or_404(Item, slug=item_slug) 19 | context = { 20 | 'item': item, 21 | } 22 | return render(request, 'store/item_details.html', context) 23 | 24 | 25 | def tag_details(request, slug): 26 | tag = get_object_or_404(ItemTag, slug=slug) 27 | items = Item.objects.filter(tags__in=[tag]) 28 | context = { 29 | 'tag': tag, 30 | 'page_obj': paginator(request, items, 3), 31 | } 32 | return render(request, 'store/tag_details.html', context) 33 | 34 | 35 | def tag_list(request): 36 | tags = ItemTag.objects.all() 37 | context = { 38 | 'page_obj': paginator(request, tags, 6), 39 | } 40 | return render(request, 'store/tag_list.html', context) 41 | -------------------------------------------------------------------------------- /OnlineStore/templates/about/author.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

Привет! Меня зовут Натолин Артем, и я создатель этого проекта по созданию интернет-магазина. Я занимаюсь web-разработкой и стремлюсь к тому, чтобы создавать качественные, удобные и функциональные веб-приложения.

5 |

Я изучаю web-разработку уже несколько лет и мой проект по созданию интернет-магазина является частью моего обучения. В этом проекте я стараюсь применить все знания и навыки, которые я приобрел, и создать максимально полезный и удобный магазин.

6 |

Если вы хотите связаться со мной, то можете написать мне на почту или посетить мою страницу в социальных сетях, где я буду рад ответить на ваши вопросы и обсудить возможности сотрудничества. Ссылки на них расположены ниже.

7 |

Спасибо, что посетили мой проект по созданию интернет-магазина! Другие мои проекты можно также посмотреть на моей странице GitHub

8 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/about/project.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

Сайт был создан с помощью фреймворка Django и библиотек для него. База данных реализована на SQLite, а дизайн сайта был разработан с использованием HTML и CSS и JS.

5 |

Я работал на тем чтобы сайт был максимально быстрым и удобным для пользователей. Фреймворк Django был выбран для создания надежного и безопасного веб-приложения, а база данных SQLite позволяет эффективно хранить и управлять информацией.

6 |

Дизайн основан на HTML, CSS и JS, которые использовались для создания красивого и функционального пользовательского интерфейса. Я постоянно работаю над улучшением дизайна сайта чтобы предоставить пользователям наилучший опыт.

7 |

Если у вас есть какие-либо вопросы или предложения по улучшению сайта, пожалуйста, свяжитесь со мной по ссылкам снизу. Я буду рад услышать ваше мнение и помочь вам в любых вопросах.

8 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 7 | {% load static %} 8 | 9 | 10 | Artem Nalolin's Online Store 11 | 12 | 13 | 14 | 15 | 16 | {% block css %} 17 | {% endblock %} 18 | 19 | 20 | 21 | 22 |
23 | 24 | {% include 'includes/header.html' %} 25 | 26 |
27 |
28 | {% block content %} 29 | 30 | {% endblock %} 31 | 32 | {% if page_obj %}

{% include 'includes/paginator.html' %}
{% endif %} 33 |
34 |
35 | 36 | {% include 'includes/footer.html' %} 37 |
38 | 39 | 40 | 41 | 42 | 43 | 44 | {% block js %} 45 | {% endblock %} 46 | 47 | -------------------------------------------------------------------------------- /OnlineStore/templates/cart/cart.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% load static %} 4 | {% block css %} 5 | 6 | {% endblock %} 7 | 8 | {% block content %} 9 |

Корзина

10 | {% if cart_items %} 11 |
12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {% for cart_item in cart_items %} 23 | 24 | 25 | 37 | 38 | 43 | 44 | {% endfor %} 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
НазваниеКоличествоЦена
{{ cart_item.item.title }} 26 |
27 | 28 | 29 | + 30 |
31 | 36 |
{{ cart_item.total_price }} 39 | 40 | 41 | 42 |
{{ cart.total_price }}
53 |
54 |
55 | 59 | {% else %} 60 |

Ваша корзина пуста.

61 | {% endif %} 62 | {% block js %} 63 | 64 | {% endblock %} 65 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/checkout/popup.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /OnlineStore/templates/checkout/thank_you.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |

Спасибо за ваш заказ!

5 |

Содержимое заказа: 6 | {% for item in order.items.all %} 7 |

  • {{ item.quantity }} х {{ item.item.title }}
  • 8 | {% endfor %} 9 |
    10 |

    На сумму {{ order.total_price }} рублей.

    11 |

    12 |

    Привезем по адресу:

    13 |

    {{ order.shipping_address }}

    14 | 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /OnlineStore/templates/includes/footer.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |

    Оставлись вопросы? Свяжитесь с нами

    5 |
    6 | {% csrf_token %} 7 |
    8 |
    9 | 10 |
    11 |
    12 | 13 |
    14 |
    15 | 16 |
    17 |
    18 |
      19 |
    • 20 |
    21 |
    22 |
    23 |
    24 |

    Мои ресурсы

    25 | 30 |
    31 |
    32 |
    33 | -------------------------------------------------------------------------------- /OnlineStore/templates/includes/header.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 26 | 27 | -------------------------------------------------------------------------------- /OnlineStore/templates/includes/paginator.html: -------------------------------------------------------------------------------- 1 | {% if page_obj.has_previous %} 2 | Prev 3 | {% else %} 4 | Prev 5 | {% endif %} 6 | {% for i in page_obj.paginator.page_range %} 7 | {% if page_obj.number == i %} 8 | {{ i }} 9 | {% else %} 10 | {{ i }} 11 | {% endif %} 12 | {% endfor %} 13 | {% if page_obj.has_next %} 14 | Next 15 | {% else %} 16 | Next 17 | {% endif %} 18 | -------------------------------------------------------------------------------- /OnlineStore/templates/store/item_details.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | {% load static %} 5 |

    {{ item.title }}

    6 |

    Товар принадлежит к категории 7 | {% for tag in item.tags.all %} 8 | {{ tag }} 9 | {% if not forloop.last %},{% endif %} 10 | {% endfor %} 11 |

    12 | {% if item.image %} 13 |

    14 | {% else %} 15 |

    16 | {% endif %} 17 | 18 | Добавить в корзину 19 | 20 | {{ item.description }}{{ item.description }} 21 |

    22 | {% if item.old_price %} 23 |

    Старая цена: {{ item.old_price }} рублей 24 | Новая цена: {{ item.price }} рублей

    25 | {% else %} 26 |

    Цена: {{ item.price }} рублей

    27 | {% endif %} 28 | {% endblock %} 29 | -------------------------------------------------------------------------------- /OnlineStore/templates/store/main_page.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | {% load static %} 5 |

    OnlineStore: Онлайн-магазин для всех ваших потребностей

    6 |

    Мой проект - это современный интернет-магазин, который был разработан с использованием передовых технологий веб-разработки. Использовался язык программирования Python и его фреймворк Django для создания серверной части сайта.

    7 |

    Для создания пользовательского интерфейса были использованы языки HTML, CSS и JavaScript. Большее количество шаблонов было взято с HTML5 UP

    8 |

    Я также использовал SQLite для хранения данных, таких как информация о продуктах и заказах.

    9 |
    10 | {% for item in page_obj %} 11 | 34 | {% endfor %} 35 |
    36 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/store/tag_details.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | {% load static %} 5 |

    {{ tag.name }}

    6 | Количество товаров: {{ tag.items.count }} 7 |

    Все категории

    8 |
    9 | {% for item in page_obj %} 10 | {{ item.title }} 11 |

    12 | {% if item.image %} 13 | 14 | {% else %} 15 | 16 | {% endif %} 17 | 18 | Добавить в корзину 19 | 20 |

    21 |

    {{ item.description }}

    22 | {% if item.old_price %} 23 |

    Старая цена: {{ item.old_price }} рублей 24 | Новая цена: {{ item.price }} рублей

    25 | {% else %} 26 |

    Цена: {{ item.price }} рублей

    27 | {% endif %} 28 | {% if not forloop.last %}
    {% endif %} 29 | {% endfor %} 30 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/store/tag_list.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | {% load static %} 5 |

    Список всех категорий

    6 |
    7 | {% for tag in page_obj %} 8 | {{ tag.name }} 9 |

    10 | {% if tag.image %} 11 | 12 | {% else %} 13 | 14 | {% endif %} 15 | {{tag.description}}{{tag.description}}

    16 | {% if not forloop.last %}
    {% endif %} 17 | {% endfor %} 18 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/feedback_failed.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |

    Извините, Ваш отзыв был не обработан =(

    5 |

    К сожалению, Ваше сообщение не было обработано. Возможно, форма не была корректно заполнена.

    6 |

    Если же Вы уверены что форма заполнена корректно, свяжитесь с нами по почте или по социальным сетям. Ссылки на них расположены внизу страницы.

    7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /OnlineStore/templates/users/feedback_success.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |

    Спасибо за отзыв!

    5 |

    Ваше сообщение уже принято в обработку. В ближайшее время мы свяжемся с Вами.

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /OnlineStore/templates/users/logged_out.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |

    Вы успешно вышли из системы

    5 |

    Вернуться на страницу входа.

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /OnlineStore/templates/users/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% load static %} 4 | {% block css %} 5 | 6 | {% endblock %} 7 | 8 | {% block content %} 9 |

    Войти на сайт

    10 |
    11 | {% csrf_token %} 12 | {% for field in form %} 13 |

    14 |

    15 | {{ field }} 16 |
    17 | {% if form.errors %} 18 |
    19 | {% for field, errors in form.errors.items %} 20 | {% for error in errors %} 21 | {{ error }} 22 | {% endfor %} 23 | {% endfor %} 24 |
    25 | {% endif %} 26 |

    27 | {% endfor %} 28 |
    29 | 30 |
    31 |
    32 | Еще не зарегистрированы? 33 | Зарегистрироваться 34 |
    35 | 36 | Забыли пароль? 37 | 38 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/managment/password_change_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

    Пароль изменен

    5 |

    Ваш пароль был успешно изменен.

    6 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/managment/password_change_form.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% load static %} 4 | {% block css %} 5 | 6 | {% endblock %} 7 | 8 | {% block content %} 9 |

    Смена пароля

    10 |

    Заполните форму для смены пароля.

    11 |
    12 | {% csrf_token %} 13 | {% for field in form %} 14 |

    15 |

    16 | {{ field }} 17 |
    18 | {% if form.errors %} 19 |
    20 | {% for error in field.errors %} 21 |

    {{ error }}

    22 | {% endfor %} 23 |
    24 | {% endif %} 25 |

    26 | {% endfor %} 27 | 28 |
    29 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/managment/password_reset_complete.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |

    Пароль изменен успешно!

    5 |

    Установлен новый пароль. Вы можете войти.

    6 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/managment/password_reset_confirm.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% load static %} 4 | {% block css %} 5 | 6 | {% endblock %} 7 | 8 | {% block content %} 9 | {% if validlink %} 10 |

    Установите новый пароль

    11 |
    12 | {% csrf_token %} 13 | {% for field in form %} 14 |

    15 |

    16 | {{ field }} 17 |
    18 | {% if form.errors %} 19 |
    20 | {% for error in field.errors %} 21 |

    {{ error }}

    22 | {% endfor %} 23 |
    24 | {% endif %} 25 |

    26 | {% endfor %} 27 | 28 |
    29 | {% else %} 30 |

    Ссылка измененения пароля недействительна, скорее всего она уже была использована. Пожалуйста, запросите смену пароля еще раз.

    31 | {% endif %} 32 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/managment/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

    Отправлено письмо

    5 |

    Проверьте свою почту, вам должно прийти письмо со ссылкой для восстановления пароля.

    6 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/managment/password_reset_email.html: -------------------------------------------------------------------------------- 1 | Someone asked for password reset for email {{ email }}. Follow thelink below: 2 | {{ protocol }}://{{ domain }}{% url "users:password_reset_confirm" uidb64=uid token=token %} 3 | Your username, in case you've forgotten: {{ user.get_username }} -------------------------------------------------------------------------------- /OnlineStore/templates/users/managment/password_reset_form.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% load static %} 4 | {% block css %} 5 | 6 | {% endblock %} 7 | 8 | {% block content %} 9 |

    Забыли пароль?

    10 |

    Введите почту в форму и мы вышлем Вам на нее инстуркцию по смене пароля.

    11 | 12 |
    13 | {% csrf_token %} 14 | {% for field in form %} 15 |

    16 |

    17 | {{ field }} 18 |
    19 | {% if form.errors %} 20 |
    21 | {% for error in field.errors %} 22 |

    {{ error }}

    23 | {% endfor %} 24 |
    25 | {% endif %} 26 |

    27 | {% endfor %} 28 | 29 |
    30 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/managment/reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

    Восстановление пароля завершено

    5 |

    Ваш пароль был сохранен. Теперь вы можете войти.

    6 |

    Войти

    7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /OnlineStore/templates/users/profile.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |

    Ваш профиль

    5 |

    Здравствуйте, {{ request.user.get_username }}. Всего у вас {{ request.user.orders.count }} заказов.

    6 |

    Ваши заказы: Перейти к заказам

    7 |

    Если вы хотите выйти из системы: Выйти

    8 |

    Если вы хотите сменить пароль: Сменить пароль

    9 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% load static %} 4 | {% block css %} 5 | 6 | {% endblock %} 7 | 8 | {% block content %} 9 |

    Зарегистрироваться

    10 |
    11 | {% csrf_token %} 12 | {% for field in form %} 13 |

    14 |

    15 | {{ field }} 16 |
    17 | {% if form.errors %} 18 |
    19 | {% for error in field.errors %} 20 |

    {{ error }}

    21 | {% endfor %} 22 |
    23 | {% endif %} 24 |

    25 | {% endfor %} 26 | 29 |
    30 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/templates/users/user_orders.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% load static %} 4 | {% block css %} 5 | 6 | {% endblock %} 7 | 8 | {% block content %} 9 |

    Ваши заказы

    10 | {% if orders %} 11 | {% for order in orders %} 12 |
    13 |
    14 |

    Адрес: {{ order.shipping_address }}

    15 |

    Статус заказа: {{ order.get_status_display }}

    16 |
    17 |
    18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | {% for order_item in order.items.all %} 28 | 29 | 30 | 33 | 34 | 35 | {% endfor %} 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |
    НазваниеКоличествоЦена
    {{ order_item.item.title }} 31 | {{ order_item.quantity }} 32 | {{ order_item.total_price }}
    {{ order.total_price }}
    44 |
    45 |
    46 | {% if not forloop.last %}
    {% endif %} 47 | {% endfor %} 48 | {% else %} 49 |

    У вас пока нет заказов.

    50 | {% endif %} 51 | {% endblock %} -------------------------------------------------------------------------------- /OnlineStore/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/users/__init__.py -------------------------------------------------------------------------------- /OnlineStore/users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Feedback 4 | 5 | 6 | class FeedbackAdmin(admin.ModelAdmin): 7 | list_display = ('feedback_name', 'feedback_email', 8 | 'feedback_message', 'created_at',) 9 | ordering = ('-created_at',) 10 | 11 | 12 | admin.site.register(Feedback, FeedbackAdmin) 13 | -------------------------------------------------------------------------------- /OnlineStore/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'users' 7 | verbose_name = 'Пользователи' 8 | -------------------------------------------------------------------------------- /OnlineStore/users/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth import get_user_model 3 | from django.contrib.auth.forms import UserCreationForm 4 | 5 | from .models import Feedback 6 | 7 | User = get_user_model() 8 | 9 | 10 | class CreationForm(UserCreationForm): 11 | class Meta(UserCreationForm.Meta): 12 | model = User 13 | fields = ('first_name', 'last_name', 'username', 'email') 14 | 15 | 16 | class FeedbackForm(forms.ModelForm): 17 | class Meta: 18 | model = Feedback 19 | fields = ['feedback_name', 'feedback_email', 'feedback_message'] 20 | -------------------------------------------------------------------------------- /OnlineStore/users/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.10 on 2023-03-21 14:58 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Feedback', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('feedback_name', models.CharField(max_length=50, verbose_name='Имя покупателя')), 19 | ('feedback_email', models.EmailField(max_length=254, verbose_name='Почта покупателя')), 20 | ('feedback_message', models.TextField(verbose_name='Текст')), 21 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')), 22 | ], 23 | options={ 24 | 'verbose_name': 'Обратная связь покупателя', 25 | 'verbose_name_plural': 'Обратная связь покупателя', 26 | }, 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /OnlineStore/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dagedarr/StoreProject/e227f96b843db8e30878a0bd088e700ac28a231b/OnlineStore/users/migrations/__init__.py -------------------------------------------------------------------------------- /OnlineStore/users/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Feedback(models.Model): 5 | feedback_name = models.CharField(max_length=50, verbose_name='Имя покупателя',) 6 | feedback_email = models.EmailField(verbose_name='Почта покупателя',) 7 | feedback_message = models.TextField(verbose_name='Текст',) 8 | created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания',) 9 | 10 | class Meta: 11 | verbose_name = 'Обратная связь покупателя' 12 | verbose_name_plural = 'Обратная связь покупателя' 13 | 14 | def __str__(self): 15 | return self.feedback_message[:30] 16 | -------------------------------------------------------------------------------- /OnlineStore/users/views.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | import telegram 4 | from django.contrib.auth.decorators import login_required 5 | from django.shortcuts import render 6 | from django.urls import reverse_lazy 7 | from django.views.generic import CreateView 8 | 9 | from OnlineStore.settings import TELEGRAM_CHAT_ID, TELEGRAM_TOKEN 10 | from checkout.models import Order 11 | from .forms import CreationForm, FeedbackForm 12 | from .models import Feedback 13 | 14 | 15 | @login_required 16 | def user_orders(request): 17 | """ 18 | Представление списка заказов пользователя. 19 | """ 20 | orders = Order.objects.filter(user=request.user) 21 | context = { 22 | 'orders': orders, 23 | } 24 | return render(request, 'users/user_orders.html', context) 25 | 26 | 27 | @login_required 28 | def profile(request): 29 | """ 30 | Представление профиля пользователя. 31 | """ 32 | return render(request, 'users/profile.html') 33 | 34 | 35 | class SignUp(CreateView): 36 | form_class = CreationForm 37 | success_url = reverse_lazy('store:home') 38 | template_name = 'users/signup.html' 39 | 40 | 41 | async def send_telegram_message(message): 42 | """ 43 | Асинхронная функция для отправки сообщения в ТГ. 44 | """ 45 | bot = telegram.Bot(token=TELEGRAM_TOKEN) 46 | chat_id = TELEGRAM_CHAT_ID 47 | await bot.send_message(chat_id=chat_id, text=message) 48 | 49 | 50 | def feedback_processing(request): 51 | """ 52 | Представление приема и обработки для обратной связи. 53 | """ 54 | if request.method == 'POST': 55 | form = FeedbackForm(request.POST) 56 | if form.is_valid(): 57 | feedback = Feedback( 58 | feedback_name=form.cleaned_data['feedback_name'], 59 | feedback_email=form.cleaned_data['feedback_email'], 60 | feedback_message=form.cleaned_data['feedback_message'], 61 | ) 62 | feedback.save() 63 | 64 | # Отпрака сообщения 65 | message = f"Новое сообщение от {feedback.feedback_name} ({feedback.feedback_email}): {feedback.feedback_message}" 66 | asyncio.run(send_telegram_message(message)) 67 | 68 | return render(request, 'users/feedback_success.html') 69 | return render(request, 'users/feedback_failed.html') 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # https://natolin.pythonanywhere.com/ 2 | 3 | # Интернет магазин на Django 4 | 5 | Это полноценный проект интернет-магазина, разработанный на Django. 6 | В нем я использовал ***AJAX-запросы*** для динамического обновления количества товаров на странице корзины без перезагрузки страницы, а ***asyncio*** я применял для отправки сообщений в Telegram-бота асинхронно, не блокируя основной поток выполнения приложения. 7 | 8 | # Установка 9 | 10 | 1. Клонируйте репозиторий 11 | ``` 12 | https://github.com/dagedarr/StoreProject.git 13 | 14 | cd OnlineStore 15 | ``` 16 | Если вы не используете Git, то вы можете просто скачать исходный код репозитория в ZIP-архиве и распаковать его на свой компьютер. 17 | 18 | 2. Создайте виртуальное окружение и активируйте его 19 | ``` 20 | python -m venv venv 21 | source venv/bin/activate 22 | ``` 23 | 3. Установите зависимости 24 | ``` 25 | pip install -r requirements.txt 26 | ``` 27 | 4. Создайте в корне проекта .env по обазу .env.example 28 | 29 | 5. Запустите миграции и загрузите данные в БД 30 | ``` 31 | python manage.py migrate 32 | python manage.py loaddata data.json 33 | ``` 34 | 6. Создайте администратора магазина 35 | ``` 36 | python manage.py createsuperuser 37 | ``` 38 | 7. Запустите сервер 39 | ``` 40 | python manage.py runserver 41 | ``` 42 | Откройте браузер и перейдите по адресу http://127.0.0.1:8000/admin/. Введите имя пользователя и пароль администратора, чтобы войти в панель управления магазином. 43 | 44 | # Готово! 45 | Вы успешно установили магазин на Django и готовы начать его использовать! 46 | 47 | # Вклад в проект 48 | Если у вас есть предложения по улучшению или вы обнаружили баг, не стесняйтесь создать issue, отправить pull request либо написать напрямую автору. Ваш вклад приветствуется! 49 | 50 | # Автор 51 | [Натолин Артем](https://github.com/dagedarr) 52 | 53 | [Ссылка на еще один мой проект - финансовый ассистент](https://github.com/dagedarr/telegram-budget) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Django==3.2.10 2 | django-taggit==3.1.0 3 | Pillow==8.0.1 4 | python-telegram-bot==20.1 5 | python-dotenv==1.0.0 --------------------------------------------------------------------------------