├── .DS_Store ├── .github └── pull_request_template.md ├── .gitignore ├── README.md ├── cart ├── .DS_Store ├── __init__.py ├── admin.py ├── apps.py ├── context_processors.py ├── models.py ├── templates │ ├── .DS_Store │ ├── cart.html │ └── email │ │ └── email.html ├── tests.py ├── urls.py └── views.py ├── manage.py ├── order ├── .DS_Store ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── templates │ ├── .DS_Store │ ├── admin │ │ ├── .DS_Store │ │ └── order │ │ │ └── tabular.html │ ├── order │ │ ├── order_detail.html │ │ └── orders_list.html │ └── thanks.html ├── tests.py ├── urls.py └── views.py ├── perfectcushion ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── requirements.txt ├── screenshots ├── Capture.PNG ├── Capture1.PNG ├── Capture2.PNG ├── Capture3.PNG └── add to cart.PNG ├── search_app ├── .DS_Store ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── templates │ └── search.html ├── tests.py ├── urls.py └── views.py ├── shop ├── .DS_Store ├── __init__.py ├── admin.py ├── apps.py ├── context_processors.py ├── forms.py ├── models.py ├── templates │ ├── .DS_Store │ ├── accounts │ │ ├── .DS_Store │ │ ├── reset_done.html │ │ ├── reset_password.html │ │ ├── reset_password_confirm.html │ │ ├── reset_password_done.html │ │ ├── signin.html │ │ └── signup.html │ ├── base.html │ ├── footer.html │ ├── header.html │ ├── navbar.html │ ├── shop │ │ ├── category.html │ │ └── product.html │ └── top-navbar.html ├── tests.py ├── urls.py └── views.py ├── static ├── .DS_Store ├── css │ ├── .DS_Store │ ├── bootstrap.min.css │ ├── custom.css │ └── fontawesome-all.min.css ├── img │ ├── banner.jpg │ └── logo.png ├── js │ ├── bootstrap.min.js │ ├── jquery-3.2.1.slim.min.js │ └── popper.min.js ├── media │ ├── .DS_Store │ ├── category │ │ ├── cotton_banner.jpg │ │ └── polyester_banner.jpg │ └── product │ │ ├── Frida.jpg │ │ ├── black_urban.jpg │ │ ├── despicable_me.jpg │ │ ├── elephant.jpg │ │ ├── floral.jpg │ │ ├── nautical.jpg │ │ ├── paw_patrol.jpg │ │ ├── pug_dog.jpg │ │ ├── red_decorative.jpg │ │ ├── red_stripe_square.jpg │ │ └── woodland.jpg └── 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 └── staticfiles ├── admin ├── css │ ├── autocomplete.css │ ├── base.css │ ├── changelists.css │ ├── dashboard.css │ ├── fonts.css │ ├── forms.css │ ├── login.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-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 │ ├── actions.min.js │ ├── admin │ ├── DateTimeShortcuts.js │ └── RelatedObjectLookups.js │ ├── autocomplete.js │ ├── calendar.js │ ├── cancel.js │ ├── change_form.js │ ├── collapse.js │ ├── collapse.min.js │ ├── core.js │ ├── inlines.js │ ├── inlines.min.js │ ├── jquery.init.js │ ├── popup_response.js │ ├── prepopulate.js │ ├── prepopulate.min.js │ ├── prepopulate_init.js │ ├── timeparse.js │ ├── urlify.js │ └── vendor │ ├── jquery │ ├── LICENSE-JQUERY.txt │ ├── jquery.js │ └── jquery.min.js │ ├── select2 │ ├── LICENSE-SELECT2.md │ ├── i18n │ │ ├── ar.js │ │ ├── az.js │ │ ├── bg.js │ │ ├── ca.js │ │ ├── cs.js │ │ ├── da.js │ │ ├── de.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 │ │ ├── hu.js │ │ ├── id.js │ │ ├── is.js │ │ ├── it.js │ │ ├── ja.js │ │ ├── km.js │ │ ├── ko.js │ │ ├── lt.js │ │ ├── lv.js │ │ ├── mk.js │ │ ├── ms.js │ │ ├── nb.js │ │ ├── nl.js │ │ ├── pl.js │ │ ├── pt-BR.js │ │ ├── pt.js │ │ ├── ro.js │ │ ├── ru.js │ │ ├── sk.js │ │ ├── sr-Cyrl.js │ │ ├── sr.js │ │ ├── sv.js │ │ ├── th.js │ │ ├── tr.js │ │ ├── uk.js │ │ ├── vi.js │ │ ├── zh-CN.js │ │ └── zh-TW.js │ ├── select2.full.js │ └── select2.full.min.js │ └── xregexp │ ├── LICENSE-XREGEXP.txt │ ├── xregexp.js │ └── xregexp.min.js ├── css ├── bootstrap.min.css ├── custom.css └── fontawesome-all.min.css ├── img ├── banner.jpg └── logo.png ├── js ├── bootstrap.min.js ├── jquery-3.2.1.slim.min.js └── popper.min.js ├── media ├── category │ ├── cotton_banner.jpg │ └── polyester_banner.jpg └── product │ ├── Frida.jpg │ ├── black_urban.jpg │ ├── despicable_me.jpg │ ├── elephant.jpg │ ├── floral.jpg │ ├── nautical.jpg │ ├── paw_patrol.jpg │ ├── pug_dog.jpg │ ├── red_decorative.jpg │ ├── red_stripe_square.jpg │ └── woodland.jpg └── 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 /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/.DS_Store -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Issue: ISSUENUMBER 2 | 3 | 4 | 5 | 6 | #### Short description of what this resolves: 7 | 8 | 9 | 10 | #### Changes proposed in this pull request and/or Screenshots of changes: 11 | 12 | - 13 | - 14 | - -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | env 2 | __pycache__ 3 | migrations 4 | db.sqlite3 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Shopping-Cart 2 | This is an online Shopping Site made using **Django** and **postgresql** containing **login/sign-up**, **add to cart**, product purchase features/ **payment option** (using **Stripe**) 3 | 4 | # Oops your cart seems to be empty! :ok_woman: 5 |

6 | Meme Studio 7 |

8 | 9 | # Why don't you check out the Products Page :wink: 10 | 11 |

12 | Meme Studio 13 |

14 | 15 | # What about adding this cute Elephant Cushion to your cart :heart_eyes: 16 | 17 |

18 | Meme Studio 19 |

20 | 21 | ## Setup on local machine 22 | 23 | To set-up the development environment on your local machine, follow the below steps: 24 | 25 | 1. Fork the repository to your github account. 26 | 2. Clone the forked repository to your local machine. 27 | 3. Download and install Python from [here](https://www.python.org/downloads/). 28 | *Downloading python is mandatory for windows users. On macOS you may have python 2.x pre-installed, consider installing python 3.7 or higher. This step is generally not required for most linux users since most linux distros come with pre-installed python (typically 3.7 or higher).* 29 | 30 | **Make sure you add python to your system path if it's not already added** 31 | 32 | ### Windows 33 | 34 | - Open command prompt and navigate to the directory where you want to create a virtual environment (preferably the parent directory of the one in which the cloned project resides). 35 | - Create a virtual environment: `python -m venv env`. Here, `env` can be replaced by any name of your choice. 36 | - Activate the virtual environment: `env\Scripts\activate.bat`. 37 | - run: `pip install -r requirements.txt`. 38 | - Navigate into the project directory where you have the `manage.py` file 39 | - Now run the server: `python manage.py runserver`. 40 | - Open a browser and go to: `https://localhost:8000/`. You should see a working django app showing that "the install worked successfully." 41 | 42 | ### Linux/macOS 43 | 44 | - Open the terminal and follow the same steps as in the above **Windows** section with a few changes described below. 45 | - Instead of using `python` in commands, use `python3`. 46 | - To activate the virtual environment: `source env/bin/activate`. 47 | - Other steps are same as in Windows. 48 | 49 | --- 50 | 51 | # Now you're all set to buy your own perfectcushion! 52 | 53 | 54 | -------------------------------------------------------------------------------- /cart/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/cart/.DS_Store -------------------------------------------------------------------------------- /cart/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/cart/__init__.py -------------------------------------------------------------------------------- /cart/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /cart/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CartConfig(AppConfig): 5 | name = 'cart' 6 | -------------------------------------------------------------------------------- /cart/context_processors.py: -------------------------------------------------------------------------------- 1 | from .models import Cart, CartItem 2 | from .views import _cart_id 3 | 4 | def counter(request): 5 | item_count = 0 6 | if 'admin' in request.path: 7 | return {} 8 | else: 9 | try: 10 | cart = Cart.objects.filter(cart_id=_cart_id(request)) 11 | cart_items = CartItem.objects.all().filter(cart=cart[:1]) 12 | for cart_item in cart_items: 13 | item_count += cart_item.quantity 14 | except Cart.DoesNotExist: 15 | item_count = 0 16 | return dict(item_count = item_count) -------------------------------------------------------------------------------- /cart/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from shop.models import Product 3 | 4 | class Cart(models.Model): 5 | cart_id = models.CharField(max_length=250, blank=True) 6 | date_added = models.DateField(auto_now_add=True) 7 | class Meta: 8 | db_table = 'Cart' 9 | ordering = ['date_added'] 10 | 11 | def __str__(self): 12 | return self.cart_id 13 | 14 | class CartItem(models.Model): 15 | product = models.ForeignKey(Product, on_delete=models.CASCADE) 16 | cart = models.ForeignKey(Cart, on_delete=models.CASCADE) 17 | quantity = models.IntegerField() 18 | active = models.BooleanField(default=True) 19 | class Meta: 20 | db_table = 'CartItem' 21 | 22 | def sub_total(self): 23 | return self.product.price * self.quantity 24 | 25 | def __str__(self): 26 | return self.product -------------------------------------------------------------------------------- /cart/templates/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/cart/templates/.DS_Store -------------------------------------------------------------------------------- /cart/templates/cart.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block metadescription %} 4 | This is the shopping cart page. Proceed to review your items and place the order. 5 | {% endblock %} 6 | {% block title %} 7 | Cart - Perfect Cushion Store 8 | {% endblock %} 9 | {% block content %} 10 | {% if not cart_items %} 11 |
12 |
13 |
14 |

15 | Your shopping cart is empty 16 |

17 |
18 |

19 | Please click here to continue shopping. 20 |

21 |
22 |
23 | {% else %} 24 |
25 |
26 |
27 |

28 | Your shopping cart 29 |

30 |
31 |
32 |
33 |
34 |
35 | 36 | 37 | 38 | 41 | 42 | 43 | 44 | 45 | {% for cart_item in cart_items %} 46 | 47 | 50 | 59 | 62 | {% if cart_item.quantity < cart_item.product.stock %} 63 | 66 | {% else %} 67 | 70 | 71 | {% endif %} 72 | 73 | {% endfor %} 74 | 75 |
39 | Your items 40 |
48 | 49 | 51 | {{cart_item.product.name}} 52 |
53 | SKU: {{cart_item.product.id}} 54 |
55 | Unit Price: £{{cart_item.product.price}} 56 |
57 | Qty: {{cart_item.quantity}} x £{{cart_item.product.price}} 58 |
60 | £{{cart_item.sub_total}} 61 | 64 |    65 | 68 |    69 |
76 | 77 |
78 |
79 | 80 | 81 | 82 | 85 | 86 | 87 | 88 | 89 | 92 | 93 | 94 | 97 | 98 | 99 |
83 | Checkout 84 |
90 | Please review your shopping cart items before proceeding with the order payment. 91 |
95 | Your total is: £{{ total }} 96 |
100 |
101 |
102 | {% csrf_token %} 103 | 116 |
117 | Continue Shopping 118 |
119 |
120 |
121 |
122 | {% endif %} 123 | {% endblock %} -------------------------------------------------------------------------------- /cart/templates/email/email.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | New Order #{{ transaction.id }} - Perfect Cushion Store 7 | 21 | 22 | 23 |
24 |

Thanks for shopping with us

25 |

This email is to confirm that you have placed an order on the Perfect Cushion Store.
Please make sure that all the details of your order are correct.

26 |
27 |
28 | 29 | 30 | 38 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | {% for item in order_items %} 50 | 51 | 52 | 53 | 54 | 55 | 56 | {% endfor %} 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 74 | 78 | 79 |
31 | Bill to:
32 | {{ transaction.billingName }}
33 | {{ transaction.billingAddress1 }}
34 | {{ transaction.billingCity }}
35 | {{ transaction.billingPostcode }}
36 | {{ transaction.billingCountry }}
37 |
39 | Order: #{{ transaction.id }}
40 | Date: {{ transaction.created|date:"d M Y" }} 41 |
Product DescriptionQtyUnit PriceSub-Total
{{ item.product }}{{ item.quantity }}£{{ item.price }}£{{ item.sub_total }}
Total£{{ transaction.total }}
Total paid£{{ transaction.total }}
67 | Ship to:
68 | {{ transaction.shippingName }}
69 | {{ transaction.shippingAddress1 }}
70 | {{ transaction.shippingCity }}
71 | {{ transaction.shippingPostcode }}
72 | {{ transaction.shippingCountry }}
73 |
75 | Payment details:
76 | £{{ transaction.total }} was paid successfully via Stripe. 77 |
80 |
81 |
82 |

If you are a registered customer and want to check your order history, please sign in.
Otherwise sign up to create a new account with us.

83 |
84 | 85 | -------------------------------------------------------------------------------- /cart/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /cart/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name='cart' 5 | 6 | urlpatterns = [ 7 | path('add//', views.add_cart, name='add_cart'), 8 | path('', views.cart_detail, name='cart_detail'), 9 | path('remove//', views.cart_remove, name='cart_remove'), 10 | path('full_remove//', views.full_remove, name='full_remove'), 11 | 12 | ] -------------------------------------------------------------------------------- /cart/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, redirect, get_object_or_404 2 | from shop.models import Product 3 | from .models import Cart, CartItem 4 | from django.core.exceptions import ObjectDoesNotExist 5 | import stripe 6 | from django.conf import settings 7 | from order.models import Order, OrderItem 8 | from django.template.loader import get_template 9 | from django.core.mail import EmailMessage 10 | 11 | 12 | def _cart_id(request): 13 | cart = request.session.session_key 14 | if not cart: 15 | cart = request.session.create() 16 | return cart 17 | 18 | def add_cart(request, product_id): 19 | product = Product.objects.get(id=product_id) 20 | try: 21 | cart = Cart.objects.get(cart_id=_cart_id(request)) 22 | except Cart.DoesNotExist: 23 | cart = Cart.objects.create( 24 | cart_id = _cart_id(request) 25 | ) 26 | cart.save() 27 | try: 28 | cart_item = CartItem.objects.get(product=product, cart=cart) 29 | if cart_item.quantity < cart_item.product.stock: 30 | cart_item.quantity += 1 31 | cart_item.save() 32 | except CartItem.DoesNotExist: 33 | cart_item = CartItem.objects.create( 34 | product = product, 35 | quantity = 1, 36 | cart = cart 37 | ) 38 | cart_item.save() 39 | return redirect('cart:cart_detail') 40 | 41 | def cart_detail(request, total=0, counter=0, cart_items = None): 42 | try: 43 | cart = Cart.objects.get(cart_id=_cart_id(request)) 44 | cart_items = CartItem.objects.filter(cart=cart, active=True) 45 | for cart_item in cart_items: 46 | total += (cart_item.product.price * cart_item.quantity) 47 | counter += cart_item.quantity 48 | except ObjectDoesNotExist: 49 | pass 50 | 51 | stripe.api_key = settings.STRIPE_SECRET_KEY 52 | stripe_total = int(total * 100) 53 | description = 'Perfect Cushion Shop - New Order' 54 | data_key = settings.STRIPE_PUBLISHABLE_KEY 55 | if request.method == 'POST': 56 | # print(request.POST) 57 | try: 58 | token = request.POST['stripeToken'] 59 | email = request.POST['stripeEmail'] 60 | billingName = request.POST['stripeBillingName'] 61 | billingAddress1 = request.POST['stripeBillingAddressLine1'] 62 | billingcity = request.POST['stripeBillingAddressCity'] 63 | billingPostcode = request.POST['stripeBillingAddressZip'] 64 | billingCountry = request.POST['stripeBillingAddressCountryCode'] 65 | shippingName = request.POST['stripeShippingName'] 66 | shippingAddress1 = request.POST['stripeShippingAddressLine1'] 67 | shippingcity = request.POST['stripeShippingAddressCity'] 68 | shippingPostcode = request.POST['stripeShippingAddressZip'] 69 | shippingCountry = request.POST['stripeShippingAddressCountryCode'] 70 | customer = stripe.Customer.create( 71 | email=email, 72 | source = token 73 | ) 74 | charge = stripe.Charge.create( 75 | amount=stripe_total, 76 | currency="gbp", 77 | description=description, 78 | customer=customer.id 79 | ) 80 | '''Creating the order''' 81 | try: 82 | order_details = Order.objects.create( 83 | token = token, 84 | total = total, 85 | emailAddress = email, 86 | billingName = billingName, 87 | billingAddress1 = billingAddress1, 88 | billingCity = billingcity, 89 | billingPostcode = billingPostcode, 90 | billingCountry = billingCountry, 91 | shippingName = shippingName, 92 | shippingAddress1 = shippingAddress1, 93 | shippingCity = shippingcity, 94 | shippingPostcode = shippingPostcode, 95 | shippingCountry = shippingCountry 96 | ) 97 | order_details.save() 98 | for order_item in cart_items: 99 | oi = OrderItem.objects.create( 100 | product = order_item.product.name, 101 | quantity = order_item.quantity, 102 | price = order_item.product.price, 103 | order = order_details 104 | ) 105 | oi.save() 106 | '''Reduce stock when order is placed or saved''' 107 | products = Product.objects.get(id=order_item.product.id) 108 | products.stock = int(order_item.product.stock - order_item.quantity) 109 | products.save() 110 | order_item.delete() 111 | '''The terminal will print this message when the order is saved''' 112 | print('The order has been created') 113 | try: 114 | '''Calling the sendEmail function''' 115 | sendEmail(order_details.id) 116 | print('The order email has been sent to the customer.') 117 | except IOError as e: 118 | return e 119 | return redirect('order:thanks', order_details.id) 120 | except ObjectDoesNotExist: 121 | pass 122 | except stripe.error.CardError as e: 123 | return False,e 124 | return render(request, 'cart.html', dict(cart_items = cart_items, total = total, counter = counter, data_key = data_key, stripe_total = stripe_total, description = description)) 125 | 126 | 127 | def cart_remove(request, product_id): 128 | cart = Cart.objects.get(cart_id=_cart_id(request)) 129 | product = get_object_or_404(Product, id=product_id) 130 | cart_item = CartItem.objects.get(product=product, cart=cart) 131 | if cart_item.quantity > 1: 132 | cart_item.quantity -= 1 133 | cart_item.save() 134 | else: 135 | cart_item.delete() 136 | return redirect('cart:cart_detail') 137 | 138 | def full_remove(request, product_id): 139 | cart = Cart.objects.get(cart_id=_cart_id(request)) 140 | product = get_object_or_404(Product, id=product_id) 141 | cart_item = CartItem.objects.get(product=product, cart=cart) 142 | cart_item.delete() 143 | return redirect('cart:cart_detail') 144 | 145 | def sendEmail(order_id): 146 | transaction = Order.objects.get(id=order_id) 147 | order_items = OrderItem.objects.filter(order=transaction) 148 | try: 149 | '''Sending the order''' 150 | subject = "Perfect Cushion Store - New Order #{}".format(transaction.id) 151 | to = ['{}'.format(transaction.emailAddress)] 152 | from_email = "orders@perfectcushionstore.com" 153 | order_information = { 154 | 'transaction' : transaction, 155 | 'order_items' : order_items 156 | } 157 | message = get_template('email/email.html').render(order_information) 158 | msg = EmailMessage(subject, message, to=to, from_email=from_email) 159 | msg.content_subtype = 'html' 160 | msg.send() 161 | except IOError as e: 162 | return e 163 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "perfectcushion.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError as exc: 10 | raise ImportError( 11 | "Couldn't import Django. Are you sure it's installed and " 12 | "available on your PYTHONPATH environment variable? Did you " 13 | "forget to activate a virtual environment?" 14 | ) from exc 15 | execute_from_command_line(sys.argv) 16 | -------------------------------------------------------------------------------- /order/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/order/.DS_Store -------------------------------------------------------------------------------- /order/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/order/__init__.py -------------------------------------------------------------------------------- /order/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Order, OrderItem 3 | 4 | class OrderItemAdmin(admin.TabularInline): 5 | model = OrderItem 6 | fieldsets = [ 7 | ('Product',{'fields':['product'],}), 8 | ('Quantity',{'fields':['quantity'],}), 9 | ('Price',{'fields':['price'],}), 10 | ] 11 | readonly_fields = ['product','quantity','price'] 12 | can_delete= False 13 | max_num = 0 14 | template = 'admin/order/tabular.html' 15 | 16 | @admin.register(Order) 17 | class OrderAdmin(admin.ModelAdmin): 18 | list_display = ['id','billingName','emailAddress','created'] 19 | list_display_links = ('id','billingName') 20 | search_fields = ['id','billingName','emailAddress'] 21 | readonly_fields = ['id','token','total','emailAddress','created','billingName','billingAddress1','billingCity', 22 | 'billingPostcode','billingCountry','shippingName','shippingAddress1','shippingCity','shippingPostcode','shippingCountry'] 23 | fieldsets = [ 24 | ('ORDER INFORMATION',{'fields': ['id','token','total','created']}), 25 | ('BILLING INFORMATION', {'fields': ['billingName','billingAddress1','billingCity','billingPostcode','billingCountry','emailAddress']}), 26 | ('SHIPPING INFORMATION', {'fields': ['shippingName','shippingAddress1','shippingCity','shippingPostcode','shippingCountry']}), 27 | ] 28 | 29 | inlines = [ 30 | OrderItemAdmin, 31 | ] 32 | 33 | def has_delete_permission(self, request, obj=None): 34 | return False 35 | 36 | def has_add_permission(self, request): 37 | return False 38 | 39 | -------------------------------------------------------------------------------- /order/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class OrderConfig(AppConfig): 5 | name = 'order' 6 | -------------------------------------------------------------------------------- /order/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class Order(models.Model): 4 | token = models.CharField(max_length=250, blank=True) 5 | total = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='GBP Order Total') 6 | emailAddress = models.EmailField(max_length=250, blank=True, verbose_name='Email Address') 7 | created = models.DateTimeField(auto_now_add=True) 8 | billingName = models.CharField(max_length=250, blank=True) 9 | billingAddress1 = models.CharField(max_length=250, blank=True) 10 | billingCity = models.CharField(max_length=250, blank=True) 11 | billingPostcode = models.CharField(max_length=10, blank=True) 12 | billingCountry = models.CharField(max_length=200, blank=True) 13 | shippingName = models.CharField(max_length=250, blank=True) 14 | shippingAddress1 = models.CharField(max_length=250, blank=True) 15 | shippingCity = models.CharField(max_length=250, blank=True) 16 | shippingPostcode = models.CharField(max_length=10, blank=True) 17 | shippingCountry = models.CharField(max_length=200, blank=True) 18 | 19 | class Meta: 20 | db_table = 'Order' 21 | ordering = ['-created'] 22 | 23 | def __str__(self): 24 | return str(self.id) 25 | 26 | 27 | class OrderItem(models.Model): 28 | product = models.CharField(max_length=250) 29 | quantity = models.IntegerField() 30 | price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='GBP Price') 31 | order = models.ForeignKey(Order, on_delete=models.CASCADE) 32 | 33 | class Meta: 34 | db_table = 'OrderItem' 35 | 36 | def sub_total(self): 37 | return self.quantity * self.price 38 | 39 | def __str__(self): 40 | return self.product -------------------------------------------------------------------------------- /order/templates/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/order/templates/.DS_Store -------------------------------------------------------------------------------- /order/templates/admin/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/order/templates/admin/.DS_Store -------------------------------------------------------------------------------- /order/templates/admin/order/tabular.html: -------------------------------------------------------------------------------- 1 | {% load i18n admin_urls static admin_modify %} 2 |
5 | 77 |
78 | -------------------------------------------------------------------------------- /order/templates/order/order_detail.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block title %} 4 | Order Details - Perfect Cushion Store 5 | {% endblock %} 6 | {% block content %} 7 |
8 |
9 |
10 |

Order Details

11 |
12 | 13 | 14 | 20 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | {% for item in order_items %} 36 | 37 | 38 | 39 | 40 | 41 | 42 | {% endfor %} 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 60 | 64 | 65 |
15 | Order: #{{ order.id }}
16 | Date: {{ order.created|date:"d M Y" }}
17 | Order Total: £{{ order.total }}
18 | Order Status: Complete. 19 |
21 | Billing Address:
22 | {{ order.billingName }}
23 | {{ order.billingAddress1 }}
24 | {{ order.billingCity }}
25 | {{ order.billingPostcode }}
26 | {{ order.billingCountry }}
27 |
Product DescriptionQtyUnit PriceSub-Total
{{ item.product }}{{ item.quantity }}£{{ item.price }}£{{ item.sub_total }}
Total£{{ order.total }}
Total Paid£{{ order.total }}
53 | Shipping Address:
54 | {{ order.shippingName }}
55 | {{ order.shippingAddress1 }}
56 | {{ order.shippingCity }}
57 | {{ order.shippingPostcode }}
58 | {{ order.shippingCountry }}
59 |
61 | Payment Details:
62 | The order #{{ order.id }} has been paid successfully via Stripe. 63 |
66 | 67 |
68 |
69 |
70 |
71 | {% endblock %} -------------------------------------------------------------------------------- /order/templates/order/orders_list.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block title %} 4 | Order History - Perfect Cushion Store 5 | {% endblock %} 6 | {% block content %} 7 |
8 |
9 |
10 |

Order History

11 |
12 | {% if order_details %} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | {% for order in order_details %} 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | {% endfor %} 33 | 34 |
Order NumberOrder DateTotal AmountStatusAction
{{ order.id }}{{ order.created|date:"d M Y" }}{{ order.total }} CompleteView order
35 | {% else %} 36 |

You have not placed any orders yet.

Continue shopping

37 | {% endif %} 38 |
39 |
40 |
41 |
42 | {% endblock %} -------------------------------------------------------------------------------- /order/templates/thanks.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block title %} 4 | Thanks - Perfect Cushion Store 5 | {% endblock %} 6 | {% block content %} 7 |
8 |
9 |
10 |
11 |

12 | Thanks for placing your order 13 |

14 |
15 |
16 |

Your order number is: {{ customer_order.id }}

17 |
18 |

19 | We have received your order and will begin processing right away. For your records an email confirmation has been sent to you. It contains details of the items you purchased. 20 |

21 |
22 |
23 |
24 |
25 | {% endblock %} -------------------------------------------------------------------------------- /order/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /order/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name='order' 5 | 6 | urlpatterns = [ 7 | path('thanks//', views.thanks, name='thanks'), 8 | path('history/', views.orderHistory, name='order_history'), 9 | path('/', views.viewOrder, name='order_detail'), 10 | ] -------------------------------------------------------------------------------- /order/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, get_object_or_404 2 | from .models import Order, OrderItem 3 | from django.contrib.auth.decorators import login_required 4 | 5 | def thanks(request, order_id): 6 | if order_id: 7 | customer_order = get_object_or_404(Order, id=order_id) 8 | return render(request, 'thanks.html', {'customer_order': customer_order}) 9 | 10 | @login_required() 11 | def orderHistory(request): 12 | if request.user.is_authenticated: 13 | email = str(request.user.email) 14 | order_details = Order.objects.filter(emailAddress=email) 15 | return render(request, 'order/orders_list.html', {'order_details':order_details}) 16 | 17 | @login_required() 18 | def viewOrder(request, order_id): 19 | if request.user.is_authenticated: 20 | email = str(request.user.email) 21 | order = Order.objects.get(id=order_id, emailAddress=email) 22 | order_items = OrderItem.objects.filter(order=order) 23 | return render(request, 'order/order_detail.html', {'order':order, 'order_items':order_items}) 24 | -------------------------------------------------------------------------------- /perfectcushion/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/perfectcushion/__init__.py -------------------------------------------------------------------------------- /perfectcushion/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for perfectcushion project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.0. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.0/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = '6ri9zvqwu93wtw7m_!2&b@9%jt!yy-hqe)ofm)@jbeb^rcl313' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 'shop', 41 | 'search_app', 42 | 'cart', 43 | 'stripe', 44 | 'order', 45 | 'crispy_forms', 46 | ] 47 | 48 | MIDDLEWARE = [ 49 | 'django.middleware.security.SecurityMiddleware', 50 | 'django.contrib.sessions.middleware.SessionMiddleware', 51 | 'django.middleware.common.CommonMiddleware', 52 | 'django.middleware.csrf.CsrfViewMiddleware', 53 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 54 | 'django.contrib.messages.middleware.MessageMiddleware', 55 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 56 | ] 57 | 58 | ROOT_URLCONF = 'perfectcushion.urls' 59 | 60 | TEMPLATES = [ 61 | { 62 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 63 | 'DIRS': [os.path.join(BASE_DIR,'shop','templates/'), os.path.join(BASE_DIR,'search_app','templates/'), os.path.join(BASE_DIR, 'cart', 'templates/'), os.path.join(BASE_DIR,'order','templates/')], 64 | 'APP_DIRS': True, 65 | 'OPTIONS': { 66 | 'context_processors': [ 67 | 'django.template.context_processors.debug', 68 | 'django.template.context_processors.request', 69 | 'django.contrib.auth.context_processors.auth', 70 | 'django.contrib.messages.context_processors.messages', 71 | 'shop.context_processors.menu_links', 72 | 'cart.context_processors.counter', 73 | ], 74 | }, 75 | }, 76 | ] 77 | 78 | WSGI_APPLICATION = 'perfectcushion.wsgi.application' 79 | 80 | 81 | # Database 82 | # https://docs.djangoproject.com/en/2.0/ref/settings/#databases 83 | 84 | DATABASES = { 85 | 'default': { 86 | 'ENGINE': 'django.db.backends.sqlite3', 87 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 88 | } 89 | } 90 | 91 | 92 | # Password validation 93 | # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators 94 | 95 | AUTH_PASSWORD_VALIDATORS = [ 96 | { 97 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 98 | }, 99 | { 100 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 101 | }, 102 | { 103 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 104 | }, 105 | { 106 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 107 | }, 108 | ] 109 | 110 | 111 | # Internationalization 112 | # https://docs.djangoproject.com/en/2.0/topics/i18n/ 113 | 114 | LANGUAGE_CODE = 'en-us' 115 | 116 | TIME_ZONE = 'UTC' 117 | 118 | USE_I18N = True 119 | 120 | USE_L10N = True 121 | 122 | USE_TZ = True 123 | 124 | 125 | # Static files (CSS, JavaScript, Images) 126 | # https://docs.djangoproject.com/en/2.0/howto/static-files/ 127 | 128 | STATIC_URL = '/static/' 129 | STATIC_ROOT = os.path.join(BASE_DIR,'staticfiles') 130 | STATICFILES_DIRS = ( 131 | os.path.join(BASE_DIR,'static'), 132 | ) 133 | MEDIA_URL = '/media/' 134 | MEDIA_ROOT = os.path.join(BASE_DIR,'static','media') 135 | 136 | ###Stripe Settings### 137 | 138 | STRIPE_PUBLISHABLE_KEY = 'pk_test_fajTlXXGwkCUEMDBfTlIcy1c00lq57KE0s' 139 | STRIPE_SECRET_KEY = 'sk_test_D71ecdmlyGIh825aPi8ySSpw00DGuAeNSh' 140 | CRISPY_TEMPLATE_PACK = 'bootstrap4' 141 | 142 | ###EmailMessage Settings### 143 | EMAIL_HOST = 'smtp.mailgun.org' 144 | EMAIL_PORT = '587' 145 | EMAIL_USE_TLS = True 146 | EMAIL_HOST_USER = 'youremail@mailgun.com' 147 | EMAIL_HOST_PASSWORD = 'yourMailGunPassword' 148 | -------------------------------------------------------------------------------- /perfectcushion/urls.py: -------------------------------------------------------------------------------- 1 | """perfectcushion URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/2.0/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path, include, re_path 18 | from shop import views 19 | from django.conf import settings 20 | from django.conf.urls.static import static 21 | 22 | urlpatterns = [ 23 | path('admin/', admin.site.urls), 24 | path('', views.index, name='index'), 25 | path('shop/', include('shop.urls')), 26 | path('search/', include('search_app.urls')), 27 | path('cart/', include('cart.urls')), 28 | path('order/', include('order.urls')), 29 | path('account/create/', views.signupView, name='signup'), 30 | path('account/login/', views.signinView, name='signin'), 31 | path('account/logout/', views.signoutView, name='signout'), 32 | ] 33 | 34 | if settings.DEBUG: 35 | urlpatterns += static(settings.STATIC_URL,document_root=settings.STATIC_ROOT) 36 | urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT) -------------------------------------------------------------------------------- /perfectcushion/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for perfectcushion project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "perfectcushion.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.4.1 2 | certifi==2021.5.30 3 | charset-normalizer==2.0.6 4 | Django==3.2.7 5 | django-crispy-forms==1.13.0 6 | idna==3.2 7 | Pillow==8.3.2 8 | pytz==2021.3 9 | requests==2.26.0 10 | sqlparse==0.4.2 11 | stripe==2.60.0 12 | urllib3==1.26.7 13 | -------------------------------------------------------------------------------- /screenshots/Capture.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/screenshots/Capture.PNG -------------------------------------------------------------------------------- /screenshots/Capture1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/screenshots/Capture1.PNG -------------------------------------------------------------------------------- /screenshots/Capture2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/screenshots/Capture2.PNG -------------------------------------------------------------------------------- /screenshots/Capture3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/screenshots/Capture3.PNG -------------------------------------------------------------------------------- /screenshots/add to cart.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/screenshots/add to cart.PNG -------------------------------------------------------------------------------- /search_app/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/search_app/.DS_Store -------------------------------------------------------------------------------- /search_app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/search_app/__init__.py -------------------------------------------------------------------------------- /search_app/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /search_app/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class SearchAppConfig(AppConfig): 5 | name = 'search_app' 6 | -------------------------------------------------------------------------------- /search_app/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /search_app/templates/search.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block metadescription %} 4 | We have a variety of stunning and comfy cushions. Look for the one that suits your needs. 5 | {% endblock %} 6 | {% block title %} 7 | Search - Perfect Cushion Store 8 | {% endblock %} 9 | {% block content %} 10 |
11 |

You have searched for: "{{ query }}"

12 |
13 |
14 |
15 | {% for product in products %} 16 |
17 |
18 | {{product.name}} 19 |
20 |

{{product.name}}

21 |

£{{product.price}}

22 |
23 |
24 |
25 | {% empty %} 26 |
27 |

0 results found.

28 |
29 | {% endfor %} 30 |
31 |
32 | {% endblock %} -------------------------------------------------------------------------------- /search_app/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /search_app/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name='search_app' 5 | 6 | urlpatterns = [ 7 | path('', views.searchResult, name='searchResult'), 8 | ] -------------------------------------------------------------------------------- /search_app/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from shop.models import Product 3 | from django.db.models import Q 4 | 5 | def searchResult(request): 6 | products = None 7 | query = None 8 | if 'q' in request.GET: 9 | query = request.GET.get('q') 10 | products = Product.objects.all().filter(Q(name__contains=query) | Q(description__contains=query)) 11 | return render(request, 'search.html', {'query':query, 'products':products}) -------------------------------------------------------------------------------- /shop/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/shop/.DS_Store -------------------------------------------------------------------------------- /shop/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/shop/__init__.py -------------------------------------------------------------------------------- /shop/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Category,Product 3 | 4 | class CategoryAdmin(admin.ModelAdmin): 5 | list_display = ['name','slug'] 6 | prepopulated_fields = {'slug':('name',)} 7 | admin.site.register(Category,CategoryAdmin) 8 | 9 | class ProductAdmin(admin.ModelAdmin): 10 | list_display = ['name','price','stock','available','created','updated'] 11 | list_editable = ['price','stock','available'] 12 | prepopulated_fields = {'slug':('name',)} 13 | list_per_page = 20 14 | admin.site.register(Product,ProductAdmin) 15 | -------------------------------------------------------------------------------- /shop/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ShopConfig(AppConfig): 5 | name = 'shop' 6 | -------------------------------------------------------------------------------- /shop/context_processors.py: -------------------------------------------------------------------------------- 1 | from .models import Category 2 | def menu_links(request): 3 | links = Category.objects.all() 4 | return dict(links=links) -------------------------------------------------------------------------------- /shop/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth.forms import UserCreationForm 3 | from django.contrib.auth.models import User 4 | 5 | class SignUpForm(UserCreationForm): 6 | first_name = forms.CharField(max_length=100, required=True) 7 | last_name = forms.CharField(max_length=100, required=True) 8 | email = forms.EmailField(max_length=254, help_text='eg. youremail@anyemail.com') 9 | 10 | class Meta: 11 | model = User 12 | fields = ('first_name','last_name','email','username','password1','password2') 13 | -------------------------------------------------------------------------------- /shop/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.urls import reverse 3 | 4 | class Category(models.Model): 5 | name = models.CharField(max_length=250, unique=True) 6 | slug = models.SlugField(max_length=250, unique=True) 7 | description = models.TextField(blank=True) 8 | image = models.ImageField(upload_to='category', blank=True) 9 | 10 | class Meta: 11 | ordering = ('name',) 12 | verbose_name = 'category' 13 | verbose_name_plural = 'categories' 14 | 15 | def get_url(self): 16 | return reverse('shop:products_by_category', args=[self.slug]) 17 | 18 | def __str__(self): 19 | return '{}'.format(self.name) 20 | 21 | class Product(models.Model): 22 | name = models.CharField(max_length=250, unique=True) 23 | slug = models.SlugField(max_length=250, unique=True) 24 | description = models.TextField(blank=True) 25 | category = models.ForeignKey(Category, on_delete=models.CASCADE) 26 | price = models.DecimalField(max_digits=10, decimal_places=2) 27 | image = models.ImageField(upload_to='product', blank=True) 28 | stock = models.IntegerField() 29 | available = models.BooleanField(default=True) 30 | created = models.DateTimeField(auto_now_add=True) 31 | updated = models.DateTimeField(auto_now=True) 32 | 33 | class Meta: 34 | ordering = ('name',) 35 | verbose_name = 'product' 36 | verbose_name_plural = 'products' 37 | 38 | def get_url(self): 39 | return reverse('shop:ProdCatDetail', args=[self.category.slug, self.slug]) 40 | 41 | def __str__(self): 42 | return '{}'.format(self.name) -------------------------------------------------------------------------------- /shop/templates/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/shop/templates/.DS_Store -------------------------------------------------------------------------------- /shop/templates/accounts/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/shop/templates/accounts/.DS_Store -------------------------------------------------------------------------------- /shop/templates/accounts/reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% load crispy_forms_tags %} 4 | {% block metadescription %} 5 | Reset your password and enjoy the variety of stunning and comfy cushions. 6 | {% endblock %} 7 | {% block title %} 8 | Reset Password - Perfect Cushion Store 9 | {% endblock %} 10 | {% block content %} 11 |
12 |
13 |

Password successfully changed

14 |
15 |
16 |
17 |
18 |

Your password has been set. You may go ahead and sign in now.

19 |
20 |
21 |
22 |
23 |
24 |
25 | {% endblock %} -------------------------------------------------------------------------------- /shop/templates/accounts/reset_password.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% load crispy_forms_tags %} 4 | {% block metadescription %} 5 | Reset your password and enjoy the variety of stunning and comfy cushions. 6 | {% endblock %} 7 | {% block title %} 8 | Reset Password - Perfect Cushion Store 9 | {% endblock %} 10 | {% block content %} 11 |
12 |
13 |

Reset password

14 |
15 |
16 |
17 |
18 |
19 |

If you have forgotten your password, please type your email address so we can send you a reset link.

20 |
21 | {% csrf_token %} 22 |

{{ form | crispy }}

23 | 24 |
25 |
26 |
27 | 28 |
29 |
30 |
31 |
32 |
33 | {% endblock %} -------------------------------------------------------------------------------- /shop/templates/accounts/reset_password_confirm.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% load crispy_forms_tags %} 4 | {% block metadescription %} 5 | Reset your password and enjoy the variety of stunning and comfy cushions. 6 | {% endblock %} 7 | {% block title %} 8 | Reset Password Confirm - Perfect Cushion Store 9 | {% endblock %} 10 | {% block content %} 11 |
12 |
13 |

Enter new password

14 |
15 |
16 |
17 |
18 |
19 |

Please enter your new password twice so we can verify you typed it in correctly.

20 |
21 | {% csrf_token %} 22 |

{{ form | crispy }}

23 | 24 |
25 |
26 |
27 | 28 |
29 |
30 |
31 |
32 |
33 | {% endblock %} -------------------------------------------------------------------------------- /shop/templates/accounts/reset_password_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% load crispy_forms_tags %} 4 | {% block metadescription %} 5 | Reset your password and enjoy the variety of stunning and comfy cushions. 6 | {% endblock %} 7 | {% block title %} 8 | Reset Password - Perfect Cushion Store 9 | {% endblock %} 10 | {% block content %} 11 |
12 |
13 |

Password reset sent

14 |
15 |
16 |
17 |
18 |

We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly.

19 | 20 |

If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder.

21 |
22 |
23 |
24 |
25 |
26 |
27 | {% endblock %} -------------------------------------------------------------------------------- /shop/templates/accounts/signin.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% load crispy_forms_tags %} 4 | {% block metadescription %} 5 | Sign in and enjoy the variety of stunning and comfy cushions. 6 | {% endblock %} 7 | {% block title %} 8 | Login - Perfect Cushion Store 9 | {% endblock %} 10 | {% block content %} 11 |
12 |
13 |

Login or Create a New Account

14 |
15 |
16 |
17 |
18 |

New Customer?

19 |
20 |

When you create an account with us, you can see your orders history.

21 |
22 | Create New Account 23 |
24 |
25 |
26 |
27 |

Registered Customers Only

28 |
29 | {% csrf_token %} 30 |

{{ form | crispy }}

31 | 32 |
33 |
34 |
35 | 36 |
37 |
38 |
39 |
40 |
41 | {% endblock %} -------------------------------------------------------------------------------- /shop/templates/accounts/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% load crispy_forms_tags %} 4 | {% block metadescription %} 5 | Sign up to get a new account with us. The perfect cushion store has a variety of stunning and comfy cushions. 6 | {% endblock %} 7 | {% block title %} 8 | Create a New Account - Perfect Cushion Store 9 | {% endblock %} 10 | {% block content %} 11 |
12 | {% if not form.is_valid %} 13 |
14 |
15 |

Create a new account

16 |
17 |
18 |
19 |

Enter the following information to create a new account.

20 |
21 | {% csrf_token %} 22 |

{{ form | crispy }}

23 | 24 |
25 |
26 |
27 |
28 | {% else %} 29 |
30 |
31 |

Your account has been successfully created

32 |
33 |
34 |

35 | Dear Customer, 36 |
37 |
38 | Your account has been created and it is ready to use. 39 |
40 | Continue shopping and enjoy the variety of cushions that we have at the perfect cushion store. 41 |

42 |
43 |
44 | 45 | {% endif %} 46 |
47 |
48 | {% endblock %} -------------------------------------------------------------------------------- /shop/templates/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {% block title %}{% endblock %} 13 | 14 | 15 |
16 | 19 | {% include 'header.html' %} 20 | {% include 'navbar.html' %} 21 | {% block content %} 22 | {% endblock %} 23 |
24 | {% include 'footer.html' %} 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /shop/templates/footer.html: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /shop/templates/header.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 |
3 |
4 | Perfect Cushion Store 5 |
6 |
-------------------------------------------------------------------------------- /shop/templates/navbar.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /shop/templates/shop/category.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block metadescription %} 4 | {% if category %} 5 | {{ category.description|truncatewords:155 }} 6 | {% else %} 7 | Welcome to the cushion store where you can buy comfy and awesome cushions. 8 | {% endif %} 9 | {% endblock %} 10 | {% block title %} 11 | {% if category %} 12 | {{ category.name }} - Perfect Cushion Store 13 | {% else %} 14 | See Our Cushion Collection - Perfect Cushion Store 15 | {% endif %} 16 | {% endblock %} 17 | {% block content %} 18 | 19 | {% if category %} 20 |
21 |
22 |

Our Product Collection | {{category.name}}

23 |
24 |
25 | {% endif %} 26 |
27 | {% if category %} 28 | {{category.name}} 29 |
30 |
31 |
32 |

{{category.name}}

33 |

{{category.description}}

34 |
35 | {% else %} 36 | Our Products Collection 37 | 38 |
39 |
40 |

Our Products Collection

41 |

Finding the perfect cushion for your room can instantly add to the levels of comfort and sense of style throughout your home. They can transform the blandest of decors instantly by adding colour, softness and an air of cosiness. As well as being comfy and looking great our range of cushions will certainly embolden your décor with personalised charm.

42 |
43 | {% endif %} 44 |
45 |
46 | {% for product in products.object_list %} 47 |
48 |
49 | {{product.name}} 50 |
51 |

{{product.name}}

52 |

£{{product.price}}

53 |
54 |
55 |
56 | {% endfor %} 57 |
58 |
59 | {% if products.paginator.num_pages > 1 %} 60 |
61 |
62 | {% for pg in products.paginator.page_range %} 63 | {{pg}} 64 | {% endfor %} 65 |
66 | {% endif %} 67 |
68 |
69 |
70 | {% endblock %} -------------------------------------------------------------------------------- /shop/templates/shop/product.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block metadescription %} 4 | {{ product.description|truncatewords:155 }} 5 | {% endblock %} 6 | {% block title %} 7 | {{ product.name }} - Perfect Cushion Store 8 | {% endblock %} 9 | {% block content %} 10 |
11 |
12 |

Home | {{product.category}} | {{product.name}}

13 |
14 |
15 |
16 |
17 |
18 |
19 | {{product.name}} 20 |
21 |
22 |
23 |
24 |

{{product.name}}

25 |

£{{product.price}}

26 |

Product Description

27 |

{{product.description}}

28 | {% if product.stock <= 0%} 29 |

Out of Stock

30 | {% else %} 31 | Add to Cart 32 | {% endif %} 33 |
34 |
35 |
36 |
37 |
38 | {% endblock %} -------------------------------------------------------------------------------- /shop/templates/top-navbar.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 23 | 24 |
25 |
-------------------------------------------------------------------------------- /shop/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /shop/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name='shop' 5 | 6 | urlpatterns = [ 7 | path('', views.allProdCat, name='allProdCat'), 8 | path('/', views.allProdCat, name='products_by_category'), 9 | path('//', views.ProdCatDetail, name='ProdCatDetail'), 10 | ] -------------------------------------------------------------------------------- /shop/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, get_object_or_404, redirect 2 | from django.http import HttpResponse 3 | from .models import Category,Product 4 | from django.core.paginator import Paginator, EmptyPage, InvalidPage 5 | from django.contrib.auth.models import Group, User 6 | from .forms import SignUpForm 7 | from django.contrib.auth.forms import AuthenticationForm 8 | from django.contrib.auth import login, authenticate, logout 9 | 10 | 11 | def index(request): 12 | text_var = 'This is a shopping cart.' 13 | return HttpResponse(text_var) 14 | 15 | #Category view 16 | 17 | def allProdCat(request, c_slug=None): 18 | c_page = None 19 | products_list = None 20 | if c_slug!=None: 21 | c_page = get_object_or_404(Category,slug=c_slug) 22 | products_list = Product.objects.filter(category=c_page,available=True) 23 | else: 24 | products_list = Product.objects.all().filter(available=True) 25 | '''Pagination code''' 26 | paginator = Paginator(products_list, 6) 27 | try: 28 | page = int(request.GET.get('page','1')) 29 | except: 30 | page = 1 31 | try: 32 | products = paginator.page(page) 33 | except (EmptyPage,InvalidPage): 34 | products = paginator.page(paginator.num_pages) 35 | return render(request,'shop/category.html',{'category':c_page,'products':products}) 36 | 37 | def ProdCatDetail(request,c_slug,product_slug): 38 | try: 39 | product = Product.objects.get(category__slug=c_slug,slug=product_slug) 40 | except Exception as e: 41 | raise e 42 | return render(request,'shop/product.html', {'product':product}) 43 | 44 | def signupView(request): 45 | if request.method == 'POST': 46 | form = SignUpForm(request.POST) 47 | if form.is_valid(): 48 | form.save() 49 | username = form.cleaned_data.get('username') 50 | signup_user = User.objects.get(username=username) 51 | customer_group = Group.objects.get(name='Customer') 52 | customer_group.user_set.add(signup_user) 53 | else: 54 | form = SignUpForm() 55 | return render(request, 'accounts/signup.html', {'form':form}) 56 | 57 | def signinView(request): 58 | if request.method == 'POST': 59 | form = AuthenticationForm(data=request.POST) 60 | if form.is_valid(): 61 | username = request.POST['username'] 62 | password = request.POST['password'] 63 | user = authenticate(username=username, password=password) 64 | if user is not None: 65 | login(request, user) 66 | return redirect('shop:allProdCat') 67 | else: 68 | return redirect('signup') 69 | else: 70 | form = AuthenticationForm() 71 | return render(request,'accounts/signin.html', {'form':form }) 72 | 73 | def signoutView(request): 74 | logout(request) 75 | return redirect('signin') 76 | -------------------------------------------------------------------------------- /static/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/.DS_Store -------------------------------------------------------------------------------- /static/css/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/css/.DS_Store -------------------------------------------------------------------------------- /static/css/custom.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Roboto', sans-serif; 3 | } 4 | /****Navbar****/ 5 | .nav-item { 6 | letter-spacing: .2em; 7 | font-size: 14px; 8 | text-transform: uppercase; 9 | } 10 | .dropdown-item { 11 | font-size: 14px; 12 | letter-spacing: .2em; 13 | text-transform: uppercase; 14 | } 15 | /****Footer****/ 16 | .my_footer { 17 | background-color: #f8f9fa; 18 | height: 60px; 19 | } 20 | .my_footer p { 21 | padding-top: 20px; 22 | font-size: 14px; 23 | } 24 | /****Category page****/ 25 | .my_row_class { 26 | padding-top: 15px; 27 | } 28 | .my_row_class .mx-auto p { 29 | color: #000; 30 | font-size: 12px; 31 | } 32 | .my_row_class .mx-auto p a { 33 | color: #000; 34 | font-size: 12px; 35 | text-decoration: none; 36 | } 37 | .my_image { 38 | width: 100%; 39 | height: auto; 40 | } 41 | .my_title { 42 | font-size: 16px; 43 | text-transform: uppercase; 44 | letter-spacing: .2em; 45 | } 46 | .my_image_padding { 47 | padding-top: 5px; 48 | } 49 | .my_bottom_margin { 50 | margin-bottom: 10px; 51 | } 52 | .card-body h4 { 53 | font-size: 14px; 54 | text-transform: uppercase; 55 | letter-spacing: .2em; 56 | } 57 | /****Product Page****/ 58 | .my_prod_row_class { 59 | padding-top: 15px; 60 | padding-bottom: 20px; 61 | } 62 | .my_prod_row_class .mx-auto p { 63 | color: #000; 64 | font-size: 12px; 65 | } 66 | .my_prod_row_class .mx-auto p a { 67 | color: #000; 68 | font-size: 12px; 69 | text-decoration: none; 70 | } 71 | .my_prod_title { 72 | font-size: 16px; 73 | text-transform: uppercase; 74 | letter-spacing: .2em; 75 | padding-top: 15px; 76 | padding-bottom: 10px; 77 | } 78 | .my_prod_text { 79 | padding-right: 20px; 80 | } 81 | .my_search_text { 82 | padding-top: 20px; 83 | } 84 | /****Cart Page****/ 85 | .my_custom_table { 86 | min-width: 400px; 87 | font-size: 14px; 88 | } 89 | .my_custom_thead { 90 | font-weight: normal; 91 | text-transform: uppercase; 92 | letter-spacing: .2em; 93 | background-color: #f8f9fa!important; 94 | } 95 | .custom_image { 96 | width: 100px; 97 | height: 100px; 98 | } 99 | .custom_a { 100 | text-decoration: none; 101 | } 102 | .custom_icon { 103 | text-decoration: none; 104 | color: #868e96 !important; 105 | } 106 | .my_custom_button { 107 | margin-top: 5px; 108 | } 109 | /***Stripe Button***/ 110 | .stripe-button-el { 111 | width: 100% !important; 112 | display: block !important; 113 | background-color: #868e96 !important; 114 | border: 0px !important; 115 | background-image: none !important; 116 | } 117 | .stripe-button-el span { 118 | display: : block; 119 | position: relative; 120 | padding: 0px 12px; 121 | height: 36px !important; 122 | line-height: 36px !important; 123 | font-family: 'Roboto', sans-serif !important; 124 | font-size: 16px !important; 125 | color: #fff !important; 126 | background-image: none !important; 127 | background: none !important; 128 | } 129 | .errorlist li { 130 | color: red; 131 | font-weight: bold; 132 | } 133 | .my_custom_div { 134 | margin-bottom: 20px !important; 135 | } 136 | .my_top_navbar_div { 137 | height: 60px; 138 | line-height: 50px; 139 | } 140 | .my_custom_menu { 141 | text-align: right !important; 142 | } 143 | .my_custom_menu ul li { 144 | list-style: none; 145 | color: #000; 146 | text-transform: uppercase; 147 | letter-spacing: .2em; 148 | font-size: 12px; 149 | padding-right: 20px; 150 | display: inline; 151 | } 152 | .my_custom_menu ul li a { 153 | text-decoration: none; 154 | color: #000; 155 | list-style: none; 156 | text-transform: uppercase; 157 | letter-spacing: .2em; 158 | font-size: 12px; 159 | } 160 | -------------------------------------------------------------------------------- /static/img/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/img/banner.jpg -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/img/logo.png -------------------------------------------------------------------------------- /static/media/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/.DS_Store -------------------------------------------------------------------------------- /static/media/category/cotton_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/category/cotton_banner.jpg -------------------------------------------------------------------------------- /static/media/category/polyester_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/category/polyester_banner.jpg -------------------------------------------------------------------------------- /static/media/product/Frida.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/Frida.jpg -------------------------------------------------------------------------------- /static/media/product/black_urban.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/black_urban.jpg -------------------------------------------------------------------------------- /static/media/product/despicable_me.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/despicable_me.jpg -------------------------------------------------------------------------------- /static/media/product/elephant.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/elephant.jpg -------------------------------------------------------------------------------- /static/media/product/floral.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/floral.jpg -------------------------------------------------------------------------------- /static/media/product/nautical.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/nautical.jpg -------------------------------------------------------------------------------- /static/media/product/paw_patrol.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/paw_patrol.jpg -------------------------------------------------------------------------------- /static/media/product/pug_dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/pug_dog.jpg -------------------------------------------------------------------------------- /static/media/product/red_decorative.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/red_decorative.jpg -------------------------------------------------------------------------------- /static/media/product/red_stripe_square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/red_stripe_square.jpg -------------------------------------------------------------------------------- /static/media/product/woodland.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/media/product/woodland.jpg -------------------------------------------------------------------------------- /static/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /static/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /static/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /static/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /static/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /static/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /static/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /static/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/static/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /staticfiles/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 | -o-text-overflow: ellipsis; 27 | } 28 | -------------------------------------------------------------------------------- /staticfiles/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 | -------------------------------------------------------------------------------- /staticfiles/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | body.login { 4 | background: #f8f8f8; 5 | } 6 | 7 | .login #header { 8 | height: auto; 9 | padding: 5px 16px; 10 | } 11 | 12 | .login #header h1 { 13 | font-size: 18px; 14 | } 15 | 16 | .login #header h1 a { 17 | color: #fff; 18 | } 19 | 20 | .login #content { 21 | padding: 20px 20px 0; 22 | } 23 | 24 | .login #container { 25 | background: #fff; 26 | border: 1px solid #eaeaea; 27 | border-radius: 4px; 28 | overflow: hidden; 29 | width: 28em; 30 | min-width: 300px; 31 | margin: 100px auto; 32 | } 33 | 34 | .login #content-main { 35 | width: 100%; 36 | } 37 | 38 | .login .form-row { 39 | padding: 4px 0; 40 | float: left; 41 | width: 100%; 42 | border-bottom: none; 43 | } 44 | 45 | .login .form-row label { 46 | padding-right: 0.5em; 47 | line-height: 2em; 48 | font-size: 1em; 49 | clear: both; 50 | color: #333; 51 | } 52 | 53 | .login .form-row #id_username, .login .form-row #id_password { 54 | clear: both; 55 | padding: 8px; 56 | width: 100%; 57 | -webkit-box-sizing: border-box; 58 | -moz-box-sizing: border-box; 59 | box-sizing: border-box; 60 | } 61 | 62 | .login span.help { 63 | font-size: 10px; 64 | display: block; 65 | } 66 | 67 | .login .submit-row { 68 | clear: both; 69 | padding: 1em 0 0 9.4em; 70 | margin: 0; 71 | border: none; 72 | background: none; 73 | text-align: left; 74 | } 75 | 76 | .login .password-reset-link { 77 | text-align: center; 78 | } 79 | -------------------------------------------------------------------------------- /staticfiles/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 | margin-right: 0; 28 | margin-left: 230px; 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"] .change-list .filtered .results, 67 | [dir="rtl"] .change-list .filtered .paginator, 68 | [dir="rtl"] .filtered #toolbar, 69 | [dir="rtl"] .filtered div.xfull, 70 | [dir="rtl"] .filtered .actions { 71 | margin-left: 0; 72 | } 73 | 74 | [dir="rtl"] .aligned .add-another, 75 | [dir="rtl"] .aligned .related-lookup, 76 | [dir="rtl"] .aligned .datetimeshortcuts { 77 | margin-left: 0; 78 | margin-right: 15px; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /staticfiles/admin/css/rtl.css: -------------------------------------------------------------------------------- 1 | body { 2 | direction: rtl; 3 | } 4 | 5 | /* LOGIN */ 6 | 7 | .login .form-row { 8 | float: right; 9 | } 10 | 11 | .login .form-row label { 12 | float: right; 13 | padding-left: 0.5em; 14 | padding-right: 0; 15 | text-align: left; 16 | } 17 | 18 | .login .submit-row { 19 | clear: both; 20 | padding: 1em 9.4em 0 0; 21 | } 22 | 23 | /* GLOBAL */ 24 | 25 | th { 26 | text-align: right; 27 | } 28 | 29 | .module h2, .module caption { 30 | text-align: right; 31 | } 32 | 33 | .module ul, .module ol { 34 | margin-left: 0; 35 | margin-right: 1.5em; 36 | } 37 | 38 | .addlink, .changelink { 39 | padding-left: 0; 40 | padding-right: 16px; 41 | background-position: 100% 1px; 42 | } 43 | 44 | .deletelink { 45 | padding-left: 0; 46 | padding-right: 16px; 47 | background-position: 100% 1px; 48 | } 49 | 50 | .object-tools { 51 | float: left; 52 | } 53 | 54 | thead th:first-child, 55 | tfoot td:first-child { 56 | border-left: none; 57 | } 58 | 59 | /* LAYOUT */ 60 | 61 | #user-tools { 62 | right: auto; 63 | left: 0; 64 | text-align: left; 65 | } 66 | 67 | div.breadcrumbs { 68 | text-align: right; 69 | } 70 | 71 | #content-main { 72 | float: right; 73 | } 74 | 75 | #content-related { 76 | float: left; 77 | margin-left: -300px; 78 | margin-right: auto; 79 | } 80 | 81 | .colMS { 82 | margin-left: 300px; 83 | margin-right: 0; 84 | } 85 | 86 | /* SORTABLE TABLES */ 87 | 88 | table thead th.sorted .sortoptions { 89 | float: left; 90 | } 91 | 92 | thead th.sorted .text { 93 | padding-right: 0; 94 | padding-left: 42px; 95 | } 96 | 97 | /* dashboard styles */ 98 | 99 | .dashboard .module table td a { 100 | padding-left: .6em; 101 | padding-right: 16px; 102 | } 103 | 104 | /* changelists styles */ 105 | 106 | .change-list .filtered table { 107 | border-left: none; 108 | border-right: 0px none; 109 | } 110 | 111 | #changelist-filter { 112 | right: auto; 113 | left: 0; 114 | border-left: none; 115 | border-right: none; 116 | } 117 | 118 | .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { 119 | margin-right: 0; 120 | margin-left: 280px; 121 | } 122 | 123 | #changelist-filter li.selected { 124 | border-left: none; 125 | padding-left: 10px; 126 | margin-left: 0; 127 | border-right: 5px solid #eaeaea; 128 | padding-right: 10px; 129 | margin-right: -15px; 130 | } 131 | 132 | .filtered .actions { 133 | margin-left: 280px; 134 | margin-right: 0; 135 | } 136 | 137 | #changelist table tbody td:first-child, #changelist table tbody th:first-child { 138 | border-right: none; 139 | border-left: none; 140 | } 141 | 142 | /* FORMS */ 143 | 144 | .aligned label { 145 | padding: 0 0 3px 1em; 146 | float: right; 147 | } 148 | 149 | .submit-row { 150 | text-align: left 151 | } 152 | 153 | .submit-row p.deletelink-box { 154 | float: right; 155 | } 156 | 157 | .submit-row input.default { 158 | margin-left: 0; 159 | } 160 | 161 | .vDateField, .vTimeField { 162 | margin-left: 2px; 163 | } 164 | 165 | .aligned .form-row input { 166 | margin-left: 5px; 167 | } 168 | 169 | form .aligned p.help, form .aligned div.help { 170 | clear: right; 171 | } 172 | 173 | form ul.inline li { 174 | float: right; 175 | padding-right: 0; 176 | padding-left: 7px; 177 | } 178 | 179 | input[type=submit].default, .submit-row input.default { 180 | float: left; 181 | } 182 | 183 | fieldset .field-box { 184 | float: right; 185 | margin-left: 20px; 186 | margin-right: 0; 187 | } 188 | 189 | .errorlist li { 190 | background-position: 100% 12px; 191 | padding: 0; 192 | } 193 | 194 | .errornote { 195 | background-position: 100% 12px; 196 | padding: 10px 12px; 197 | } 198 | 199 | /* WIDGETS */ 200 | 201 | .calendarnav-previous { 202 | top: 0; 203 | left: auto; 204 | right: 10px; 205 | } 206 | 207 | .calendarnav-next { 208 | top: 0; 209 | right: auto; 210 | left: 10px; 211 | } 212 | 213 | .calendar caption, .calendarbox h2 { 214 | text-align: center; 215 | } 216 | 217 | .selector { 218 | float: right; 219 | } 220 | 221 | .selector .selector-filter { 222 | text-align: right; 223 | } 224 | 225 | .inline-deletelink { 226 | float: left; 227 | } 228 | 229 | form .form-row p.datetime { 230 | overflow: hidden; 231 | } 232 | 233 | .related-widget-wrapper { 234 | float: right; 235 | } 236 | 237 | /* MISC */ 238 | 239 | .inline-related h2, .inline-group h2 { 240 | text-align: right 241 | } 242 | 243 | .inline-related h3 span.delete { 244 | padding-right: 20px; 245 | padding-left: inherit; 246 | left: 10px; 247 | right: inherit; 248 | float:left; 249 | } 250 | 251 | .inline-related h3 span.delete label { 252 | margin-left: inherit; 253 | margin-right: 2px; 254 | } 255 | 256 | /* IE7 specific bug fixes */ 257 | 258 | div.colM { 259 | position: relative; 260 | } 261 | 262 | .submit-row input { 263 | float: left; 264 | } 265 | -------------------------------------------------------------------------------- /staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2015 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 | -------------------------------------------------------------------------------- /staticfiles/admin/fonts/README.txt: -------------------------------------------------------------------------------- 1 | Roboto webfont source: https://www.google.com/fonts/specimen/Roboto 2 | Weights used in this project: Light (300), Regular (400), Bold (700) 3 | -------------------------------------------------------------------------------- /staticfiles/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /staticfiles/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /staticfiles/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /staticfiles/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 | -------------------------------------------------------------------------------- /staticfiles/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 | - http://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 | -------------------------------------------------------------------------------- /staticfiles/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /staticfiles/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /staticfiles/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/selector-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /staticfiles/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 | -------------------------------------------------------------------------------- /staticfiles/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/js/SelectBox.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | var SelectBox = { 4 | cache: {}, 5 | init: function(id) { 6 | var box = document.getElementById(id); 7 | var node; 8 | SelectBox.cache[id] = []; 9 | var cache = SelectBox.cache[id]; 10 | var boxOptions = box.options; 11 | var boxOptionsLength = boxOptions.length; 12 | for (var i = 0, j = boxOptionsLength; i < j; i++) { 13 | node = boxOptions[i]; 14 | cache.push({value: node.value, text: node.text, displayed: 1}); 15 | } 16 | }, 17 | redisplay: function(id) { 18 | // Repopulate HTML select box from cache 19 | var box = document.getElementById(id); 20 | var node; 21 | $(box).empty(); // clear all options 22 | var new_options = box.outerHTML.slice(0, -9); // grab just the opening tag 23 | var cache = SelectBox.cache[id]; 24 | for (var i = 0, j = cache.length; i < j; i++) { 25 | node = cache[i]; 26 | if (node.displayed) { 27 | var new_option = new Option(node.text, node.value, false, false); 28 | // Shows a tooltip when hovering over the option 29 | new_option.setAttribute("title", node.text); 30 | new_options += new_option.outerHTML; 31 | } 32 | } 33 | new_options += ''; 34 | box.outerHTML = new_options; 35 | }, 36 | filter: function(id, text) { 37 | // Redisplay the HTML select box, displaying only the choices containing ALL 38 | // the words in text. (It's an AND search.) 39 | var tokens = text.toLowerCase().split(/\s+/); 40 | var node, token; 41 | var cache = SelectBox.cache[id]; 42 | for (var i = 0, j = cache.length; i < j; i++) { 43 | node = cache[i]; 44 | node.displayed = 1; 45 | var node_text = node.text.toLowerCase(); 46 | var numTokens = tokens.length; 47 | for (var k = 0; k < numTokens; k++) { 48 | token = tokens[k]; 49 | if (node_text.indexOf(token) === -1) { 50 | node.displayed = 0; 51 | break; // Once the first token isn't found we're done 52 | } 53 | } 54 | } 55 | SelectBox.redisplay(id); 56 | }, 57 | delete_from_cache: function(id, value) { 58 | var node, delete_index = null; 59 | var cache = SelectBox.cache[id]; 60 | for (var i = 0, j = cache.length; i < j; i++) { 61 | node = cache[i]; 62 | if (node.value === value) { 63 | delete_index = i; 64 | break; 65 | } 66 | } 67 | cache.splice(delete_index, 1); 68 | }, 69 | add_to_cache: function(id, option) { 70 | SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); 71 | }, 72 | cache_contains: function(id, value) { 73 | // Check if an item is contained in the cache 74 | var node; 75 | var cache = SelectBox.cache[id]; 76 | for (var i = 0, j = cache.length; i < j; i++) { 77 | node = cache[i]; 78 | if (node.value === value) { 79 | return true; 80 | } 81 | } 82 | return false; 83 | }, 84 | move: function(from, to) { 85 | var from_box = document.getElementById(from); 86 | var option; 87 | var boxOptions = from_box.options; 88 | var boxOptionsLength = boxOptions.length; 89 | for (var i = 0, j = boxOptionsLength; i < j; i++) { 90 | option = boxOptions[i]; 91 | var option_value = option.value; 92 | if (option.selected && SelectBox.cache_contains(from, option_value)) { 93 | SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); 94 | SelectBox.delete_from_cache(from, option_value); 95 | } 96 | } 97 | SelectBox.redisplay(from); 98 | SelectBox.redisplay(to); 99 | }, 100 | move_all: function(from, to) { 101 | var from_box = document.getElementById(from); 102 | var option; 103 | var boxOptions = from_box.options; 104 | var boxOptionsLength = boxOptions.length; 105 | for (var i = 0, j = boxOptionsLength; i < j; i++) { 106 | option = boxOptions[i]; 107 | var option_value = option.value; 108 | if (SelectBox.cache_contains(from, option_value)) { 109 | SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); 110 | SelectBox.delete_from_cache(from, option_value); 111 | } 112 | } 113 | SelectBox.redisplay(from); 114 | SelectBox.redisplay(to); 115 | }, 116 | sort: function(id) { 117 | SelectBox.cache[id].sort(function(a, b) { 118 | a = a.text.toLowerCase(); 119 | b = b.text.toLowerCase(); 120 | try { 121 | if (a > b) { 122 | return 1; 123 | } 124 | if (a < b) { 125 | return -1; 126 | } 127 | } 128 | catch (e) { 129 | // silently fail on IE 'unknown' exception 130 | } 131 | return 0; 132 | } ); 133 | }, 134 | select_all: function(id) { 135 | var box = document.getElementById(id); 136 | var boxOptions = box.options; 137 | var boxOptionsLength = boxOptions.length; 138 | for (var i = 0; i < boxOptionsLength; i++) { 139 | boxOptions[i].selected = 'selected'; 140 | } 141 | } 142 | }; 143 | window.SelectBox = SelectBox; 144 | })(django.jQuery); 145 | -------------------------------------------------------------------------------- /staticfiles/admin/js/actions.js: -------------------------------------------------------------------------------- 1 | /*global gettext, interpolate, ngettext*/ 2 | (function($) { 3 | 'use strict'; 4 | var lastChecked; 5 | 6 | $.fn.actions = function(opts) { 7 | var options = $.extend({}, $.fn.actions.defaults, opts); 8 | var actionCheckboxes = $(this); 9 | var list_editable_changed = false; 10 | var showQuestion = function() { 11 | $(options.acrossClears).hide(); 12 | $(options.acrossQuestions).show(); 13 | $(options.allContainer).hide(); 14 | }, 15 | showClear = function() { 16 | $(options.acrossClears).show(); 17 | $(options.acrossQuestions).hide(); 18 | $(options.actionContainer).toggleClass(options.selectedClass); 19 | $(options.allContainer).show(); 20 | $(options.counterContainer).hide(); 21 | }, 22 | reset = function() { 23 | $(options.acrossClears).hide(); 24 | $(options.acrossQuestions).hide(); 25 | $(options.allContainer).hide(); 26 | $(options.counterContainer).show(); 27 | }, 28 | clearAcross = function() { 29 | reset(); 30 | $(options.acrossInput).val(0); 31 | $(options.actionContainer).removeClass(options.selectedClass); 32 | }, 33 | checker = function(checked) { 34 | if (checked) { 35 | showQuestion(); 36 | } else { 37 | reset(); 38 | } 39 | $(actionCheckboxes).prop("checked", checked) 40 | .parent().parent().toggleClass(options.selectedClass, checked); 41 | }, 42 | updateCounter = function() { 43 | var sel = $(actionCheckboxes).filter(":checked").length; 44 | // data-actions-icnt is defined in the generated HTML 45 | // and contains the total amount of objects in the queryset 46 | var actions_icnt = $('.action-counter').data('actionsIcnt'); 47 | $(options.counterContainer).html(interpolate( 48 | ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { 49 | sel: sel, 50 | cnt: actions_icnt 51 | }, true)); 52 | $(options.allToggle).prop("checked", function() { 53 | var value; 54 | if (sel === actionCheckboxes.length) { 55 | value = true; 56 | showQuestion(); 57 | } else { 58 | value = false; 59 | clearAcross(); 60 | } 61 | return value; 62 | }); 63 | }; 64 | // Show counter by default 65 | $(options.counterContainer).show(); 66 | // Check state of checkboxes and reinit state if needed 67 | $(this).filter(":checked").each(function(i) { 68 | $(this).parent().parent().toggleClass(options.selectedClass); 69 | updateCounter(); 70 | if ($(options.acrossInput).val() === 1) { 71 | showClear(); 72 | } 73 | }); 74 | $(options.allToggle).show().click(function() { 75 | checker($(this).prop("checked")); 76 | updateCounter(); 77 | }); 78 | $("a", options.acrossQuestions).click(function(event) { 79 | event.preventDefault(); 80 | $(options.acrossInput).val(1); 81 | showClear(); 82 | }); 83 | $("a", options.acrossClears).click(function(event) { 84 | event.preventDefault(); 85 | $(options.allToggle).prop("checked", false); 86 | clearAcross(); 87 | checker(0); 88 | updateCounter(); 89 | }); 90 | lastChecked = null; 91 | $(actionCheckboxes).click(function(event) { 92 | if (!event) { event = window.event; } 93 | var target = event.target ? event.target : event.srcElement; 94 | if (lastChecked && $.data(lastChecked) !== $.data(target) && event.shiftKey === true) { 95 | var inrange = false; 96 | $(lastChecked).prop("checked", target.checked) 97 | .parent().parent().toggleClass(options.selectedClass, target.checked); 98 | $(actionCheckboxes).each(function() { 99 | if ($.data(this) === $.data(lastChecked) || $.data(this) === $.data(target)) { 100 | inrange = (inrange) ? false : true; 101 | } 102 | if (inrange) { 103 | $(this).prop("checked", target.checked) 104 | .parent().parent().toggleClass(options.selectedClass, target.checked); 105 | } 106 | }); 107 | } 108 | $(target).parent().parent().toggleClass(options.selectedClass, target.checked); 109 | lastChecked = target; 110 | updateCounter(); 111 | }); 112 | $('form#changelist-form table#result_list tr').on('change', 'td:gt(0) :input', function() { 113 | list_editable_changed = true; 114 | }); 115 | $('form#changelist-form button[name="index"]').click(function(event) { 116 | if (list_editable_changed) { 117 | return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); 118 | } 119 | }); 120 | $('form#changelist-form input[name="_save"]').click(function(event) { 121 | var action_changed = false; 122 | $('select option:selected', options.actionContainer).each(function() { 123 | if ($(this).val()) { 124 | action_changed = true; 125 | } 126 | }); 127 | if (action_changed) { 128 | if (list_editable_changed) { 129 | return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")); 130 | } else { 131 | return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button.")); 132 | } 133 | } 134 | }); 135 | }; 136 | /* Setup plugin defaults */ 137 | $.fn.actions.defaults = { 138 | actionContainer: "div.actions", 139 | counterContainer: "span.action-counter", 140 | allContainer: "div.actions span.all", 141 | acrossInput: "div.actions input.select-across", 142 | acrossQuestions: "div.actions span.question", 143 | acrossClears: "div.actions span.clear", 144 | allToggle: "#action-toggle", 145 | selectedClass: "selected" 146 | }; 147 | $(document).ready(function() { 148 | var $actionsEls = $('tr input.action-select'); 149 | if ($actionsEls.length > 0) { 150 | $actionsEls.actions(); 151 | } 152 | }); 153 | })(django.jQuery); 154 | -------------------------------------------------------------------------------- /staticfiles/admin/js/actions.min.js: -------------------------------------------------------------------------------- 1 | (function(a){var f;a.fn.actions=function(e){var b=a.extend({},a.fn.actions.defaults,e),g=a(this),k=!1,l=function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},n=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},p=function(){n(); 2 | a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)},q=function(c){c?l():n();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length,d=a(".action-counter").data("actionsIcnt");a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:d},!0));a(b.allToggle).prop("checked",function(){var a;c===g.length?(a=!0,l()):(a=!1,p());return a})};a(b.counterContainer).show(); 3 | a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass);h();1===a(b.acrossInput).val()&&m()});a(b.allToggle).show().click(function(){q(a(this).prop("checked"));h()});a("a",b.acrossQuestions).click(function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("a",b.acrossClears).click(function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);p();q(0);h()});f=null;a(g).click(function(c){c||(c=window.event);var d=c.target?c.target:c.srcElement;if(f&& 4 | a.data(f)!==a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(g).each(function(){if(a.data(this)===a.data(f)||a.data(this)===a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").on("change","td:gt(0) :input",function(){k=!0});a('form#changelist-form button[name="index"]').click(function(a){if(k)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))}); 5 | a('form#changelist-form input[name="_save"]').click(function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return k?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")):confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})}; 6 | a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"};a(document).ready(function(){var e=a("tr input.action-select");0' + gettext("Show") + 11 | ')'); 12 | } 13 | }); 14 | // Add toggle to anchor tag 15 | $("fieldset.collapse a.collapse-toggle").click(function(ev) { 16 | if ($(this).closest("fieldset").hasClass("collapsed")) { 17 | // Show 18 | $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]); 19 | } else { 20 | // Hide 21 | $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]); 22 | } 23 | return false; 24 | }); 25 | }); 26 | })(django.jQuery); 27 | -------------------------------------------------------------------------------- /staticfiles/admin/js/collapse.min.js: -------------------------------------------------------------------------------- 1 | var $jscomp={scope:{},findInternal:function(a,c,b){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e'+gettext("Show")+")")});a("fieldset.collapse a.collapse-toggle").click(function(c){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", 5 | [a(this).attr("id")]);return!1})})})(django.jQuery); 6 | -------------------------------------------------------------------------------- /staticfiles/admin/js/inlines.min.js: -------------------------------------------------------------------------------- 1 | var $jscomp={scope:{},findInternal:function(b,c,a){b instanceof String&&(b=String(b));for(var d=b.length,e=0;e'+a.addText+""),k=c.find("tr:last a")):(d.filter(":last").after('"),k=d.filter(":last").next().find("a")));k.click(function(c){c.preventDefault();c=b("#"+a.prefix+"-empty"); 6 | var d=c.clone(!0);d.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+l);d.is("tr")?d.children(":last").append('"):d.is("ul")||d.is("ol")?d.append('
  • '+a.deleteText+"
  • "):d.children(":first").append(''+a.deleteText+"");d.find("*").each(function(){e(this,a.prefix,f.val())});d.insertBefore(b(c)); 7 | b(f).val(parseInt(f.val(),10)+1);l+=1;""!==h.val()&&0>=h.val()-f.val()&&k.parent().hide();d.find("a."+a.deleteCssClass).click(function(c){c.preventDefault();d.remove();--l;a.removed&&a.removed(d);b(document).trigger("formset:removed",[d,a.prefix]);c=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(c.length);(""===h.val()||0 tr").tabularFormset(a.options)}})})})(django.jQuery); 14 | -------------------------------------------------------------------------------- /staticfiles/admin/js/jquery.init.js: -------------------------------------------------------------------------------- 1 | /*global django:true, jQuery:false*/ 2 | /* Puts the included jQuery into our own namespace using noConflict and passing 3 | * it 'true'. This ensures that the included jQuery doesn't pollute the global 4 | * namespace (i.e. this preserves pre-existing values for both window.$ and 5 | * window.jQuery). 6 | */ 7 | var django = django || {}; 8 | django.jQuery = jQuery.noConflict(true); 9 | -------------------------------------------------------------------------------- /staticfiles/admin/js/popup_response.js: -------------------------------------------------------------------------------- 1 | /*global opener */ 2 | (function() { 3 | 'use strict'; 4 | var 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 | -------------------------------------------------------------------------------- /staticfiles/admin/js/prepopulate.js: -------------------------------------------------------------------------------- 1 | /*global URLify*/ 2 | (function($) { 3 | 'use strict'; 4 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { 5 | /* 6 | Depends on urlify.js 7 | Populates a selected field with the values of the dependent fields, 8 | URLifies and shortens the string. 9 | dependencies - array of dependent fields ids 10 | maxLength - maximum length of the URLify'd string 11 | allowUnicode - Unicode support of the URLify'd string 12 | */ 13 | return this.each(function() { 14 | var prepopulatedField = $(this); 15 | 16 | var populate = function() { 17 | // Bail if the field's value has been changed by the user 18 | if (prepopulatedField.data('_changed')) { 19 | return; 20 | } 21 | 22 | var values = []; 23 | $.each(dependencies, function(i, field) { 24 | field = $(field); 25 | if (field.val().length > 0) { 26 | values.push(field.val()); 27 | } 28 | }); 29 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); 30 | }; 31 | 32 | prepopulatedField.data('_changed', false); 33 | prepopulatedField.change(function() { 34 | prepopulatedField.data('_changed', true); 35 | }); 36 | 37 | if (!prepopulatedField.val()) { 38 | $(dependencies.join(',')).keyup(populate).change(populate).focus(populate); 39 | } 40 | }); 41 | }; 42 | })(django.jQuery); 43 | -------------------------------------------------------------------------------- /staticfiles/admin/js/prepopulate.min.js: -------------------------------------------------------------------------------- 1 | (function(c){c.fn.prepopulate=function(e,f,g){return this.each(function(){var a=c(this),b=function(){if(!a.data("_changed")){var b=[];c.each(e,function(a,d){d=c(d);01&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/ca.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/cs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"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(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/da.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/de.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/el.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/en.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/es.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/et.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/eu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/fa.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/fi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/fr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/gl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/he.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/hi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/hr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/hu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" 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…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/id.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/is.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/it.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/ja.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/km.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/ko.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/lt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/lv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/mk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/ms.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/nb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},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…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/nl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/pl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/pt-BR.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/pt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/ro.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return 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 t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},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",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/ru.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/sk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/sr-Cyrl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/sr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/sv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/th.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/tr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/uk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/vi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/zh-CN.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/select2/i18n/zh-TW.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | 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;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /staticfiles/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2007-2012 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 | -------------------------------------------------------------------------------- /staticfiles/css/custom.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Roboto', sans-serif; 3 | } 4 | /****Navbar****/ 5 | .nav-item { 6 | letter-spacing: .2em; 7 | font-size: 14px; 8 | text-transform: uppercase; 9 | } 10 | .dropdown-item { 11 | font-size: 14px; 12 | letter-spacing: .2em; 13 | text-transform: uppercase; 14 | } 15 | /****Footer****/ 16 | .my_footer { 17 | background-color: #f8f9fa; 18 | height: 60px; 19 | } 20 | .my_footer p { 21 | padding-top: 20px; 22 | font-size: 14px; 23 | } 24 | /****Category page****/ 25 | .my_row_class { 26 | padding-top: 15px; 27 | } 28 | .my_row_class .mx-auto p { 29 | color: #000; 30 | font-size: 12px; 31 | } 32 | .my_row_class .mx-auto p a { 33 | color: #000; 34 | font-size: 12px; 35 | text-decoration: none; 36 | } 37 | .my_image { 38 | width: 100%; 39 | height: auto; 40 | } 41 | .my_title { 42 | font-size: 16px; 43 | text-transform: uppercase; 44 | letter-spacing: .2em; 45 | } 46 | .my_image_padding { 47 | padding-top: 5px; 48 | } 49 | .my_bottom_margin { 50 | margin-bottom: 10px; 51 | } 52 | .card-body h4 { 53 | font-size: 14px; 54 | text-transform: uppercase; 55 | letter-spacing: .2em; 56 | } 57 | /****Product Page****/ 58 | .my_prod_row_class { 59 | padding-top: 15px; 60 | padding-bottom: 20px; 61 | } 62 | .my_prod_row_class .mx-auto p { 63 | color: #000; 64 | font-size: 12px; 65 | } 66 | .my_prod_row_class .mx-auto p a { 67 | color: #000; 68 | font-size: 12px; 69 | text-decoration: none; 70 | } 71 | .my_prod_title { 72 | font-size: 16px; 73 | text-transform: uppercase; 74 | letter-spacing: .2em; 75 | padding-top: 15px; 76 | padding-bottom: 10px; 77 | } 78 | .my_prod_text { 79 | padding-right: 20px; 80 | } 81 | -------------------------------------------------------------------------------- /staticfiles/img/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/img/banner.jpg -------------------------------------------------------------------------------- /staticfiles/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/img/logo.png -------------------------------------------------------------------------------- /staticfiles/media/category/cotton_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/category/cotton_banner.jpg -------------------------------------------------------------------------------- /staticfiles/media/category/polyester_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/category/polyester_banner.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/Frida.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/Frida.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/black_urban.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/black_urban.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/despicable_me.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/despicable_me.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/elephant.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/elephant.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/floral.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/floral.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/nautical.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/nautical.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/paw_patrol.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/paw_patrol.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/pug_dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/pug_dog.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/red_decorative.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/red_decorative.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/red_stripe_square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/red_stripe_square.jpg -------------------------------------------------------------------------------- /staticfiles/media/product/woodland.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/media/product/woodland.jpg -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /staticfiles/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/Shopping-Cart/929225d7f5cecf1f58029f6c2c1676767166dc4a/staticfiles/webfonts/fa-solid-900.woff2 --------------------------------------------------------------------------------