├── .dockerignore ├── .flake8 ├── .gitignore ├── .isort.cfg ├── .python-version ├── Dockerfile ├── LICENCE ├── Procfile ├── Project ├── __init__.py ├── asgi.py ├── celery.py ├── settings.py ├── urls.py └── wsgi.py ├── README.md ├── blog ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── templates │ └── blog │ │ ├── blog.html │ │ └── blog_detail.html ├── test │ ├── __init__.py │ └── test_blog_model.py ├── urls.py └── views.py ├── cart ├── __init__.py ├── apps.py ├── cart.py ├── context_processors.py ├── migrations │ └── __init__.py ├── templates │ └── cart │ │ └── cart.html ├── urls.py └── views.py ├── core ├── __init__.py ├── admin.py ├── apps.py ├── decorators.py ├── management │ └── commands │ │ └── makesuperuser.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── templates │ └── core │ │ ├── _base.html │ │ ├── about.html │ │ ├── contact.html │ │ ├── footer.html │ │ ├── home.html │ │ └── search.html ├── tests.py ├── urls.py └── views.py ├── customers ├── __init__.py ├── admin.py ├── apps.py ├── decorators.py ├── forms.py ├── manager.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_customer_options.py │ ├── 0003_alter_customer_user.py │ ├── 0004_alter_customer_full_name.py │ ├── 0005_customer_image.py │ └── __init__.py ├── models.py ├── templates │ └── customer │ │ ├── customer_profile.html │ │ ├── customer_profile_edit.html │ │ ├── logout.html │ │ ├── mail │ │ └── welcome_email.html │ │ ├── password_change.html │ │ ├── sign_in.html │ │ ├── sign_up.html │ │ └── wishlist_and_followed_store.html ├── test │ ├── __init__.py │ ├── test_customer_form.py │ ├── test_customer_model.py │ └── test_customer_url.py ├── urls.py ├── utils │ ├── __init__.py │ └── service.py └── views.py ├── db.sqlite3 ├── docs ├── _config.yml ├── additional-resources.md ├── application-overview.md ├── deployment.md ├── error-handling.md ├── project-configuration.md ├── security.md ├── style-guide.md └── testing.md ├── img └── drawSQL.png ├── manage.py ├── model └── common_fields.py ├── newsletter ├── __init__.py ├── admin.py ├── apps.py ├── fixtures │ └── subscriber.json ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── tasks.py ├── templates │ ├── newsletter │ │ └── mail │ │ │ ├── newsletter.html │ │ │ └── static │ │ │ └── images │ │ │ ├── 004-twitter-logo.png │ │ │ ├── 005-facebook.png │ │ │ ├── 006-instagram-logo.png │ │ │ ├── product-1.jpg │ │ │ ├── product-2.jpg │ │ │ ├── product-3.jpg │ │ │ ├── product-4.jpg │ │ │ ├── product-5.jpg │ │ │ └── product-6.jpg │ └── unsubscribe.html ├── test │ ├── __init__.py │ └── test_newsletter_model.py ├── urls.py └── views.py ├── order ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20210917_0147.py │ ├── 0003_auto_20211013_2140.py │ ├── 0004_auto_20211016_1847.py │ ├── 0005_auto_20211016_1920.py │ ├── 0006_auto_20211016_1928.py │ ├── 0007_orderitem_vendor.py │ ├── 0008_auto_20211029_0044.py │ ├── 0009_auto_20211103_1610.py │ └── __init__.py ├── models.py ├── tasks.py ├── templates │ └── order │ │ ├── cancellation.html │ │ ├── checkout.html │ │ ├── confirmation.html │ │ ├── mail │ │ └── CartEmail.html │ │ ├── order_details.html │ │ ├── order_history.html │ │ └── return.html ├── test │ ├── __init__.py │ └── test_order_urls.py ├── urls.py ├── utilities.py └── views.py ├── product ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20210901_1503.py │ ├── 0003_product_discount.py │ ├── 0004_alter_product_wishlist.py │ ├── 0005_auto_20210930_0108.py │ ├── 0006_product_is_review.py │ ├── 0007_product_customer.py │ └── __init__.py ├── models.py ├── templates │ └── product │ │ ├── product_list.html │ │ └── single_product.html ├── test │ ├── __init__.py │ └── test_product_model.py ├── urls.py └── views.py ├── requirements.txt ├── review ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_review_options.py │ ├── 0003_remove_review_product.py │ ├── 0004_auto_20211014_1426.py │ ├── 0005_alter_review_reviewimage.py │ └── __init__.py ├── models.py ├── templates │ └── review │ │ ├── review.html │ │ ├── unreview.html │ │ └── write_review.html ├── tests │ ├── __init__.py │ ├── test_review_model.py │ └── test_review_urls.py ├── urls.py └── views.py ├── runtime.txt ├── static └── assets │ ├── css │ ├── all.css │ ├── animate.min.css │ ├── aos.css │ ├── bootstrap.min.css │ ├── flaticon.css │ ├── fontawesome-all.min.css │ ├── lightslider.min.css │ ├── magnific-popup.css │ ├── nice-select.css │ ├── order_details.css │ ├── owl.carousel.min.css │ ├── price_rangs.css │ ├── slick.css │ ├── slick.min.css │ ├── slicknav.css │ ├── style.css │ ├── style.map │ ├── swiper.min.css │ └── themify-icons.css │ ├── fonts │ ├── Flaticon.eot │ ├── Flaticon.svg │ ├── Flaticon.ttf │ ├── Flaticon.woff │ ├── Flaticon.woff2 │ ├── 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 │ ├── flaticon.html │ ├── themify.eot │ ├── themify.svg │ ├── themify.ttf │ └── themify.woff │ ├── img │ ├── about │ │ ├── about_lft.png │ │ ├── about_right.png │ │ └── pet_care.png │ ├── about_img_1.png │ ├── about_img_2.png │ ├── about_us_video.png │ ├── adapt_icon │ │ ├── 1.png │ │ ├── 1.svg │ │ ├── 2.png │ │ └── 3.png │ ├── arrivel │ │ ├── arrivel_1.png │ │ ├── arrivel_2.png │ │ ├── arrivel_3.png │ │ ├── arrivel_4.png │ │ ├── arrivel_5.png │ │ └── arrivel_6.png │ ├── banner │ │ ├── banner.png │ │ ├── contact_bg.png │ │ ├── dog.png │ │ └── img.png │ ├── banner_pattern.png │ ├── banner_shape.png │ ├── categori │ │ ├── card-man.png │ │ ├── card-shape.png │ │ ├── card.png │ │ ├── cat1.jpg │ │ ├── cat2.jpg │ │ ├── cat3.jpg │ │ ├── category_1.png │ │ ├── category_10.png │ │ ├── category_11.png │ │ ├── category_12.png │ │ ├── category_2.png │ │ ├── category_3.png │ │ ├── category_4.png │ │ ├── category_5.png │ │ ├── category_6.png │ │ ├── category_7.png │ │ ├── category_8.png │ │ ├── category_9.png │ │ ├── product1.png │ │ ├── product2.png │ │ ├── product3.png │ │ ├── product4.png │ │ ├── product5.png │ │ └── product6.png │ ├── client.png │ ├── client_1.png │ ├── client_2.png │ ├── collection │ │ ├── collection1.png │ │ ├── collection2.png │ │ ├── collection3.png │ │ ├── collection4.png │ │ ├── collection5.png │ │ ├── latest-man.png │ │ └── latest-offer.png │ ├── comment │ │ ├── comment_1.png │ │ ├── comment_2.png │ │ └── comment_3.png │ ├── elements │ │ ├── _DS_Store │ │ ├── a.jpg │ │ ├── a2.jpg │ │ ├── d.jpg │ │ ├── disabled-check.png │ │ ├── disabled-radio.png │ │ ├── f1.jpg │ │ ├── f2.jpg │ │ ├── f3.jpg │ │ ├── f4.jpg │ │ ├── f5.jpg │ │ ├── f6.jpg │ │ ├── f7.jpg │ │ ├── f8.jpg │ │ ├── g1.jpg │ │ ├── g2.jpg │ │ ├── g3.jpg │ │ ├── g4.jpg │ │ ├── g5.jpg │ │ ├── g6.jpg │ │ ├── g7.jpg │ │ ├── g8.jpg │ │ ├── primary-check.png │ │ ├── primary-radio.png │ │ ├── success-check.png │ │ ├── success-radio.png │ │ ├── user1.png │ │ └── user2.png │ ├── favicon.ico │ ├── favicon.png │ ├── gallery │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── gallery1.jpg │ │ ├── gallery2.jpg │ │ ├── gallery3.jpg │ │ ├── gallery4.jpg │ │ └── gallery5.jpg │ ├── hero │ │ ├── Industries_hero.jpg │ │ ├── about_hero.jpg │ │ ├── category.jpg │ │ ├── contact_hero.jpg │ │ ├── gallery_hero.jpg │ │ ├── h1_hero.jpg │ │ ├── hero_man.png │ │ └── services_hero.jpg │ ├── icon │ │ ├── arrow-left.png │ │ ├── arrow-right.png │ │ ├── color_star.svg │ │ ├── feature_icon_1.png │ │ ├── feature_icon_1.svg │ │ ├── feature_icon_2.png │ │ ├── feature_icon_2.svg │ │ ├── feature_icon_3.png │ │ ├── feature_icon_3.svg │ │ ├── feature_icon_4.svg │ │ ├── header_icon.png │ │ ├── icon_1.png │ │ ├── icon_2.png │ │ ├── icon_3.png │ │ ├── icon_4.png │ │ ├── left-white.png │ │ ├── left.svg │ │ ├── play.svg │ │ ├── quate.svg │ │ ├── right-arrow.svg │ │ ├── right-white.png │ │ ├── right.svg │ │ └── star.svg │ ├── login.jpg │ ├── logo.png │ ├── logo │ │ ├── date-picker-icon.png │ │ ├── form-iocn.jpg │ │ ├── logo.png │ │ ├── logo2_footer.png │ │ ├── select-items-icon.jpg │ │ └── testimonial.png │ ├── offers │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png │ ├── our_blog │ │ └── blog-img1.jpg │ ├── post │ │ ├── next.png │ │ ├── post_1.png │ │ ├── post_10.png │ │ ├── post_2.png │ │ ├── post_3.png │ │ ├── post_4.png │ │ ├── post_5.png │ │ ├── post_6.png │ │ ├── post_7.png │ │ ├── post_8.png │ │ ├── post_9.png │ │ └── preview.png │ ├── prising │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png │ ├── product │ │ ├── product_list_1.png │ │ ├── product_list_10.png │ │ ├── product_list_2.png │ │ ├── product_list_3.png │ │ ├── product_list_4.png │ │ ├── product_list_5.png │ │ ├── product_list_6.png │ │ ├── product_list_7.png │ │ ├── product_list_8.png │ │ ├── product_list_9.png │ │ └── single_product.png │ ├── product_overlay.png │ ├── service │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── service_icon_1.png │ │ ├── service_icon_2.png │ │ ├── service_icon_3.png │ │ └── service_icon_bg_1.png │ ├── team │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png │ ├── testmonial │ │ ├── 1.png │ │ └── Homepage_testi.png │ ├── time_line_1.png │ └── tranding_item │ │ ├── tranding_item_1.png │ │ ├── tranding_item_2.png │ │ ├── tranding_item_3.png │ │ ├── tranding_item_4.png │ │ ├── tranding_item_5.png │ │ └── tranding_item_6.png │ ├── js │ ├── animated.headline.js │ ├── aos.js │ ├── bootstrap.min.js │ ├── cells-by-column.js │ ├── contact.js │ ├── gmaps.min.js │ ├── jquery-1.12.1.min.js │ ├── jquery.ajaxchimp.min.js │ ├── jquery.counterup.min.js │ ├── jquery.downCount.js │ ├── jquery.easing.min.js │ ├── jquery.form.js │ ├── jquery.magnific-popup.js │ ├── jquery.nice-select.min.js │ ├── jquery.paroller.min.js │ ├── jquery.scrollUp.min.js │ ├── jquery.slicknav.min.js │ ├── jquery.sticky.js │ ├── jquery.validate.min.js │ ├── lightslider.min.js │ ├── mail-script.js │ ├── main.js │ ├── mixitup.min.js │ ├── one-page-nav-min.js │ ├── owl.carousel.min.js │ ├── plugins.js │ ├── popper.min.js │ ├── price_rangs.js │ ├── slick.min.js │ ├── stellar.js │ ├── swiper.jquery.js │ ├── swiper.min.js │ ├── swiper_custom.js │ ├── theme.js │ ├── vendor │ │ ├── jquery-1.12.4.min.js │ │ └── modernizr-3.5.0.min.js │ ├── waypoints.min.js │ └── wow.min.js │ ├── scss │ ├── _about_us.scss │ ├── _banner.scss │ ├── _best-product.scss │ ├── _best_seller.scss │ ├── _blog.scss │ ├── _blog_page.scss │ ├── _blog_part.scss │ ├── _bradcam.scss │ ├── _breadcrumb.scss │ ├── _button.scss │ ├── _category.scss │ ├── _client_logo.scss │ ├── _client_review.scss │ ├── _color.scss │ ├── _common.scss │ ├── _confirmation_part.scss │ ├── _contact.scss │ ├── _copyright_part.scss │ ├── _cource_details.scss │ ├── _cta_part.scss │ ├── _elements.scss │ ├── _extend.scss │ ├── _feature_part.scss │ ├── _footer.scss │ ├── _h1-hero.scss │ ├── _headerMenu.scss │ ├── _instagram_photo.scss │ ├── _latest_products.scss │ ├── _mixins.scss │ ├── _new_arrival.scss │ ├── _our_offer.scss │ ├── _overlay.scss │ ├── _product.scss │ ├── _product_list.scss │ ├── _recent.scss │ ├── _review.scss │ ├── _services.scss │ ├── _shipping_details.scss │ ├── _single_blog.scss │ ├── _single_product.scss │ ├── _special_cource.scss │ ├── _subscribe_part.scss │ ├── _team.scss │ ├── _testimonial.scss │ ├── _trending_items.scss │ ├── _variables.scss │ └── style.scss │ └── webfonts │ ├── fa-brands-400.eot │ ├── fa-brands-400.svg │ ├── fa-brands-400.ttf │ ├── fa-brands-400.woff │ ├── fa-brands-400.woff2 │ ├── fa-regular-400.eot │ ├── fa-regular-400.svg │ ├── fa-regular-400.ttf │ ├── fa-regular-400.woff │ ├── fa-regular-400.woff2 │ ├── fa-solid-900.eot │ ├── fa-solid-900.svg │ ├── fa-solid-900.ttf │ ├── fa-solid-900.woff │ └── fa-solid-900.woff2 ├── vendor ├── __init__.py ├── admin.py ├── apps.py ├── decorators.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20210904_1157.py │ └── __init__.py ├── models.py ├── templates │ └── vendor │ │ ├── _base.html │ │ ├── add_product_form.html │ │ ├── edit_product_form.html │ │ ├── home.html │ │ ├── mail │ │ └── welcome_email.html │ │ ├── sign_in.html │ │ ├── sign_out.html │ │ └── sign_up.html ├── test │ ├── __init__.py │ └── test_vendor_model.py ├── urls.py ├── utils │ ├── __init__.py │ └── service.py └── views │ ├── __init__.py │ ├── home_views.py │ ├── product_views.py │ ├── sign_in_views.py │ └── sign_up_views.py └── wishlist ├── __init__.py ├── apps.py ├── migrations └── __init__.py ├── templates └── wishlist │ └── product_wishlist.html ├── urls.py └── views.py /.dockerignore: -------------------------------------------------------------------------------- 1 | # project build medadata that can't be used in docker 2 | env 3 | .github 4 | img 5 | vscode 6 | Dockerfile 7 | .dockerignore 8 | .git* 9 | 10 | # documentation not needed 11 | CHANGELOG.md 12 | LICENSE 13 | Procfile 14 | README.md 15 | runtime.txt 16 | docs 17 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 133 3 | exclude = __init__.py, *venv, *migrations, *review, *order, *core, *vendor 4 | ignore = E501,F841 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Python ### 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | 5 | # Distribution / packaging 6 | .Python 7 | build/ 8 | develop-eggs/ 9 | dist/ 10 | downloads/ 11 | eggs/ 12 | .eggs/ 13 | lib/ 14 | lib64/ 15 | parts/ 16 | sdist/ 17 | var/ 18 | wheels/ 19 | pip-wheel-metadata/ 20 | share/python-wheels/ 21 | *.egg-info/ 22 | .installed.cfg 23 | *.egg 24 | MANIFEST 25 | 26 | # Unit test / coverage reports 27 | htmlcov/ 28 | .tox/ 29 | .nox/ 30 | .coverage 31 | .coverage.* 32 | .cache 33 | nosetests.xml 34 | coverage.xml 35 | *.cover 36 | *.py,cover 37 | .hypothesis/ 38 | .pytest_cache/ 39 | pytestdebug.log 40 | 41 | 42 | # Django stuff: 43 | # *.log 44 | # db.sqlite3 45 | # *db.sqlite3 46 | # db.sqlite3-journal 47 | 48 | cart/__pycache__/ 49 | core/__pycache__/ 50 | order/__pycache__/ 51 | product/__pycache__/ 52 | vendor/__pycache__/ 53 | Project/__pycache__/ 54 | __pypackages__/ 55 | *ping.py 56 | 57 | # Celery stuff 58 | celerybeat-schedule 59 | celerybeat.pid 60 | 61 | # Environments 62 | /fast/ 63 | .env 64 | .venv 65 | env/ 66 | venv/ 67 | ENV/ 68 | env.bak/ 69 | venv.bak/ 70 | 71 | # VS code path settings 72 | /.vscode/ 73 | 74 | # File stytem caches 75 | cache/ 76 | 77 | # other stuff 78 | TODO.feature 79 | Requirement Engineering.md 80 | note.md 81 | TestCase.feature 82 | TestCase.md 83 | TODO.md 84 | core/management/commands/_private.py 85 | config/nginx.conf 86 | Project/secret_settings.py 87 | vendor/test/test_vendor_urls.py 88 | chromedriver.exe 89 | tests.py 90 | docker-compose.yml 91 | db.sqlite3 92 | -------------------------------------------------------------------------------- /.isort.cfg: -------------------------------------------------------------------------------- 1 | [isort] 2 | combine_as_imports = true 3 | default_section = THIRDPARTY 4 | include_trailing_comma = true 5 | known_first_party = django 6 | line_length = 79 7 | multi_line_output = 5 -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | 3.9.7 -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # pull official base image 2 | FROM python:3.9-alpine3.14 3 | 4 | # set work directory 5 | WORKDIR /app 6 | 7 | # set environment variables 8 | ENV PYTHONDONTWRITEBYTECODE 1 9 | ENV PYTHONUNBUFFERED 1 10 | 11 | # install dependencies 12 | RUN pip install --upgrade pip 13 | COPY requirements.txt /app/ 14 | RUN pip install -r requirements.txt 15 | 16 | # copy project 17 | COPY . /app/ 18 | EXPOSE 8000 19 | 20 | # run django server 21 | CMD python manage.py runserver 0.0.0.0:8000 -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Hossain Chisty 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 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, 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 THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn Project.wsgi -------------------------------------------------------------------------------- /Project/__init__.py: -------------------------------------------------------------------------------- 1 | # This will make sure the app is always imported when 2 | # Django starts so that shared_task will use this app. 3 | from .celery import app as celery_app 4 | 5 | __all__ = ('celery_app',) 6 | -------------------------------------------------------------------------------- /Project/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for Project project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Project.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /Project/celery.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, unicode_literals 2 | 3 | import os 4 | 5 | from celery import Celery 6 | 7 | 8 | # Set the default Django settings module for the 'celery' program. 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Project.settings') 10 | 11 | app = Celery('Project') 12 | app.conf.enable_utc = False 13 | app.conf.update(timezone='Asia/Dhaka') 14 | 15 | app.config_from_object('django.conf:settings', namespace='CELERY') 16 | 17 | # Load task modules from all registered Django apps. 18 | app.autodiscover_tasks() 19 | 20 | 21 | @app.task(bind=True) 22 | def debug_task(self): 23 | print(f'Request: {self.request!r}') 24 | -------------------------------------------------------------------------------- /Project/urls.py: -------------------------------------------------------------------------------- 1 | import debug_toolbar 2 | 3 | from django.contrib import admin 4 | from django.urls import include, path 5 | 6 | urlpatterns = [ 7 | path('secret/', admin.site.urls), 8 | path('', include('core.urls')), 9 | path('blog/', include('blog.urls')), 10 | path('vendor/', include('vendor.urls')), 11 | path('customer/', include('customers.urls')), 12 | path('product/', include('product.urls')), 13 | path('cart/', include('cart.urls')), 14 | path('wishlist/', include('wishlist.urls')), 15 | path('order/', include('order.urls')), 16 | path('review/', include('review.urls')), 17 | path('newsletter/', include('newsletter.urls')), 18 | path('__debug__/', include(debug_toolbar.urls)), 19 | ] 20 | -------------------------------------------------------------------------------- /Project/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for Project project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/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', 'Project.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /blog/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/blog/__init__.py -------------------------------------------------------------------------------- /blog/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Post, Category, Comment 3 | 4 | admin.site.register(Post) 5 | admin.site.register(Category) 6 | admin.site.register(Comment) 7 | -------------------------------------------------------------------------------- /blog/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BlogConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'blog' 7 | -------------------------------------------------------------------------------- /blog/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from blog.models import Comment 3 | 4 | 5 | class CommentForm(forms.ModelForm): 6 | class Meta: 7 | model = Comment 8 | fields = ('body',) 9 | -------------------------------------------------------------------------------- /blog/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/blog/migrations/__init__.py -------------------------------------------------------------------------------- /blog/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/blog/test/__init__.py -------------------------------------------------------------------------------- /blog/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . views import blog_post_view, blog_details_view, create_comment_view, blog_search_view 3 | 4 | app_name = 'blog' 5 | 6 | urlpatterns = [ 7 | path('', blog_post_view, name='blog_view'), 8 | path('', blog_details_view, name='blog_detail'), 9 | path('/', create_comment_view, name='create_comment'), 10 | path('search/', blog_search_view, name='search'), 11 | # path('//delete', comment_delete_view, name='comment_delete'), 12 | ] 13 | -------------------------------------------------------------------------------- /cart/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/cart/__init__.py -------------------------------------------------------------------------------- /cart/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CartConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'cart' 7 | -------------------------------------------------------------------------------- /cart/cart.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from product.models import Product 3 | 4 | 5 | class Cart(object): 6 | def __init__(self, request): 7 | self.session = request.session 8 | cart = self.session.get(settings.CART_SESSION_ID) 9 | 10 | if not cart: 11 | cart = self.session[settings.CART_SESSION_ID] = {} 12 | 13 | self.cart = cart 14 | 15 | def __iter__(self): 16 | for p in self.cart.keys(): 17 | self.cart[str(p)]['product'] = Product.objects.get(pk=p) 18 | 19 | for item in self.cart.values(): 20 | item['total_price'] = item['product'].price * item['quantity'] 21 | 22 | yield item 23 | 24 | def __len__(self): 25 | return sum(item['quantity'] for item in self.cart.values()) 26 | 27 | def add(self, product_id, quantity=1, update_quantity=False): 28 | product_id = str(product_id) 29 | 30 | if product_id not in self.cart: 31 | self.cart[product_id] = {'quantity': 1, 'id': product_id} 32 | 33 | if update_quantity: 34 | self.cart[product_id]['quantity'] += int(quantity) 35 | 36 | if self.cart[product_id]['quantity'] == 0: 37 | self.remove(product_id) 38 | 39 | self.save() 40 | 41 | def remove(self, product_id): 42 | if product_id in self.cart: 43 | del self.cart[product_id] 44 | self.save() 45 | 46 | def save(self): 47 | self.session[settings.CART_SESSION_ID] = self.cart 48 | self.session.modified = True 49 | 50 | def clear(self): 51 | del self.session[settings.CART_SESSION_ID] 52 | self.session.modified = True 53 | 54 | def get_total_price(self): 55 | for p in self.cart.keys(): 56 | self.cart[str(p)]['product'] = Product.objects.get(pk=p) 57 | 58 | return sum(item['quantity'] * item['product'].price for item in self.cart.values()) 59 | -------------------------------------------------------------------------------- /cart/context_processors.py: -------------------------------------------------------------------------------- 1 | from .cart import Cart 2 | 3 | 4 | def cart(request): 5 | return {'cart': Cart(request)} 6 | -------------------------------------------------------------------------------- /cart/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/cart/migrations/__init__.py -------------------------------------------------------------------------------- /cart/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name = 'cart' 5 | 6 | urlpatterns = [ 7 | path('', views.cart_list, name='cart_list'), 8 | ] 9 | -------------------------------------------------------------------------------- /cart/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import redirect, render 2 | 3 | from .cart import Cart 4 | 5 | 6 | def cart_list(request): 7 | cart = Cart(request) 8 | 9 | remove_from_cart = request.GET.get('remove_from_cart') 10 | change_quantity = request.GET.get('change_quantity') 11 | quantity = request.GET.get('quantity', 0) 12 | 13 | if remove_from_cart: 14 | cart.remove(remove_from_cart) 15 | return redirect('cart:cart_list') 16 | 17 | if change_quantity: 18 | cart.add(change_quantity, quantity, True) 19 | return redirect('cart:cart_list') 20 | 21 | return render(request, 'cart/cart.html') 22 | -------------------------------------------------------------------------------- /core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/core/__init__.py -------------------------------------------------------------------------------- /core/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Contact 4 | 5 | 6 | @admin.register(Contact) 7 | class ContactAdmin(admin.ModelAdmin): 8 | list_display = ('name', 'email', 'subject', 'message', 'created_at') 9 | list_filter = ('created_at',) 10 | search_fields = ('name', 'email', 'subject', 'message') 11 | list_per_page = 100 12 | list_max_show_all = 200 13 | 14 | def has_delete_permission(self, request, obj=None): 15 | ''' 16 | Remove the delete button from the admin panel 17 | ''' 18 | return False 19 | 20 | def has_add_permission(self, request): 21 | ''' 22 | Remove the add button from the admin panel 23 | ''' 24 | return False 25 | 26 | def has_edit_permission(self, request, obj=None): 27 | ''' 28 | Remove the edit button from the admin panel 29 | ''' 30 | return False 31 | 32 | def has_change_permission(self, request, obj=None): 33 | ''' 34 | Remove the change button from the admin panel 35 | ''' 36 | return False 37 | 38 | # def has_view_permission(self, request, obj=None): 39 | # ''' 40 | # Remove the view button from the admin panel 41 | # ''' 42 | # return False 43 | 44 | # def has_view_or_change_permission(self, request, obj=None): 45 | # ''' 46 | # Remove the view and change button from the admin panel 47 | # ''' 48 | # return False 49 | 50 | def get_ordering(self, request): 51 | """ 52 | Hook for specifying field ordering. 53 | """ 54 | return self.ordering or () # otherwise we might try to *None, which is bad ;) 55 | -------------------------------------------------------------------------------- /core/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoreConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'core' 7 | -------------------------------------------------------------------------------- /core/decorators.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import REDIRECT_FIELD_NAME 2 | from django.contrib.auth.decorators import user_passes_test 3 | from django.shortcuts import redirect 4 | 5 | 6 | def customer_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='customer_sign_in'): 7 | '''Decorator for views that checks that the logged in user is a customer.''' 8 | actual_decorator = user_passes_test( 9 | lambda u: u.is_active and u.is_customer, 10 | login_url=login_url, 11 | redirect_field_name=redirect_field_name 12 | ) 13 | if function: 14 | return actual_decorator(function) 15 | return actual_decorator 16 | 17 | 18 | def vendor_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='login'): 19 | '''Decorator for views that checks that the logged in user is a vendor.''' 20 | actual_decorator = user_passes_test( 21 | lambda u: u.is_active and u.is_vendor, 22 | login_url=login_url, 23 | redirect_field_name=redirect_field_name 24 | ) 25 | if function: 26 | return actual_decorator(function) 27 | return actual_decorator 28 | 29 | 30 | def unauthenticated_user(view_func): 31 | '''Decorator for views that checks that the user is authenticated.''' 32 | def wrapper_func(request, *args, **kwargs): 33 | if request.user.is_authenticated: 34 | return redirect('home') 35 | else: 36 | return view_func(request, *args, **kwargs) 37 | 38 | return wrapper_func 39 | -------------------------------------------------------------------------------- /core/management/commands/makesuperuser.py: -------------------------------------------------------------------------------- 1 | from django.core.management.base import BaseCommand 2 | from django.contrib.auth import get_user_model 3 | 4 | 5 | class Command(BaseCommand): 6 | help = 'Create a superuser' 7 | 8 | def handle(self, *args, **options): 9 | User = get_user_model() 10 | if not User.objects.filter(email="admin2@domain.com").exists(): 11 | User.objects.create_superuser("admin2@domain.com", "admin") 12 | self.stdout.write(self.style.SUCCESS('Successfully created superuser!')) 13 | else: 14 | self.stdout.write(self.style.NOTICE('Superuser already exists.')) 15 | -------------------------------------------------------------------------------- /core/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-23 20:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Contact', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('message', models.TextField()), 19 | ('name', models.CharField(max_length=255)), 20 | ('subject', models.CharField(max_length=255)), 21 | ('email', models.EmailField(max_length=255)), 22 | ('created_at', models.DateTimeField(auto_now_add=True)), 23 | ], 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /core/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/core/migrations/__init__.py -------------------------------------------------------------------------------- /core/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Contact(models.Model): 5 | message = models.TextField() 6 | name = models.CharField(max_length=255) 7 | subject = models.CharField(max_length=255) 8 | email = models.EmailField(max_length=255) 9 | created_at = models.DateTimeField(auto_now_add=True) 10 | 11 | def __str__(self): 12 | return f'{self.name.capitalize()}, wents to contact with you!' 13 | -------------------------------------------------------------------------------- /core/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase, override_settings 2 | from django.urls import reverse 3 | 4 | 5 | class HomeTestsUrls(TestCase): 6 | @override_settings(STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage') 7 | def test_home_url(self): 8 | url = reverse('home') 9 | response = self.client.get(url) 10 | self.assertEquals(response.status_code, 200) 11 | 12 | @override_settings(STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage') 13 | def test_about_url(self): 14 | url = reverse('about') 15 | response = self.client.get(url) 16 | self.assertEquals(response.status_code, 200) 17 | 18 | @override_settings(STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage') 19 | def test_contact_url(self): 20 | url = reverse('contact') 21 | response = self.client.get(url) 22 | self.assertEquals(response.status_code, 200) 23 | -------------------------------------------------------------------------------- /core/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('', views.home, name='home'), 6 | path('about', views.about, name='about'), 7 | path('contact', views.contact, name='contact'), 8 | path('search', views.search_api, name='search'), 9 | path('product', views.search, name='search'), 10 | 11 | ] 12 | -------------------------------------------------------------------------------- /customers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/customers/__init__.py -------------------------------------------------------------------------------- /customers/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Customer, User 3 | 4 | admin.site.register(Customer) 5 | admin.site.register(User) 6 | -------------------------------------------------------------------------------- /customers/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CustomersConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'customers' 7 | -------------------------------------------------------------------------------- /customers/decorators.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import REDIRECT_FIELD_NAME 2 | from django.contrib.auth.decorators import user_passes_test 3 | 4 | 5 | def customer_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='customer_sign_in'): 6 | ''' 7 | Decorator for views that checks that the logged in user is a customer, 8 | redirects to the log-in page if necessary. 9 | ''' 10 | actual_decorator = user_passes_test( 11 | lambda u: u.is_active and u.is_customer, 12 | login_url=login_url, 13 | redirect_field_name=redirect_field_name 14 | ) 15 | if function: 16 | return actual_decorator(function) 17 | return actual_decorator 18 | -------------------------------------------------------------------------------- /customers/forms.py: -------------------------------------------------------------------------------- 1 | from captcha.fields import ReCaptchaField 2 | from captcha.widgets import ReCaptchaV2Checkbox 3 | from django_countries.fields import CountryField 4 | 5 | from django import forms 6 | from django.contrib.auth.forms import UserCreationForm 7 | from django.db import transaction 8 | from django.forms import ModelForm 9 | 10 | from .models import Customer, User 11 | 12 | 13 | class CustomerSignUpForm(UserCreationForm): 14 | country = CountryField( 15 | blank_label='(Select country)',).formfield(null=True) 16 | address = forms.CharField(widget=forms.Textarea) 17 | full_name = forms.CharField(max_length=255) 18 | phone_number = forms.CharField(max_length=17) 19 | captcha = ReCaptchaField(widget=ReCaptchaV2Checkbox) 20 | 21 | def __init__(self, *args, **kwargs): 22 | super(CustomerSignUpForm, self).__init__(*args, **kwargs) 23 | 24 | for fieldname in ["password1", "password2"]: 25 | self.fields[fieldname].help_text = None 26 | 27 | class Meta(UserCreationForm.Meta): 28 | model = User 29 | fields = ('full_name', 30 | 'email', 'phone_number', 'country', 'address', 'password1', 'password2') 31 | 32 | @transaction.atomic 33 | def save(self): 34 | user = super().save(commit=False) 35 | user.is_customer = True 36 | user.save() 37 | customer = Customer.objects.create(user=user) 38 | customer.email = self.cleaned_data.get('email') 39 | customer.country = self.cleaned_data.get('country') 40 | customer.address = self.cleaned_data.get('address') 41 | customer.full_name = self.cleaned_data.get('full_name') 42 | customer.phone_number = self.cleaned_data.get('phone_number') 43 | customer.save() 44 | 45 | return customer 46 | 47 | 48 | class CustomerUpdateForm(ModelForm): 49 | class Meta: 50 | model = Customer 51 | fields = ('full_name', 'email', 'image', 'phone_number', 'country', 'address') 52 | -------------------------------------------------------------------------------- /customers/manager.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import UserManager as BaseUserManager 2 | 3 | 4 | class UserManager(BaseUserManager): 5 | use_in_migrations = True 6 | 7 | def _create_user(self, email, password, **extra_fields): 8 | """ 9 | Creates and saves a User with the given email and password. 10 | """ 11 | if not email: 12 | raise ValueError("The given email must be set") 13 | email = self.normalize_email(email) 14 | user = self.model(email=email, **extra_fields) 15 | user.set_password(password) 16 | user.save(using=self._db) 17 | return user 18 | 19 | def create_user(self, email, password=None, **extra_fields): 20 | extra_fields.setdefault("is_superuser", False) 21 | return self._create_user(email, password, **extra_fields) 22 | 23 | def create_superuser(self, email, password, **extra_fields): 24 | extra_fields.setdefault("is_superuser", True) 25 | extra_fields.setdefault("is_staff", True) 26 | 27 | if extra_fields.get("is_superuser") is not True: 28 | raise ValueError("Superuser must have is_superuser=True.") 29 | 30 | return self._create_user(email, password, **extra_fields) 31 | -------------------------------------------------------------------------------- /customers/migrations/0002_alter_customer_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-01 09:03 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('customers', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='customer', 15 | options={'verbose_name_plural': 'Customer'}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /customers/migrations/0003_alter_customer_user.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-03 15:16 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('customers', '0002_alter_customer_options'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='customer', 17 | name='user', 18 | field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='customer', to=settings.AUTH_USER_MODEL), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /customers/migrations/0004_alter_customer_full_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-16 19:47 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('customers', '0003_alter_customer_user'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='customer', 15 | name='full_name', 16 | field=models.CharField(max_length=255), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /customers/migrations/0005_customer_image.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-10 16:07 2 | 3 | import cloudinary.models 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('customers', '0004_alter_customer_full_name'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='customer', 16 | name='image', 17 | field=cloudinary.models.CloudinaryField(blank=True, max_length=255, null=True, verbose_name='avatar'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /customers/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/customers/migrations/__init__.py -------------------------------------------------------------------------------- /customers/models.py: -------------------------------------------------------------------------------- 1 | from cloudinary.models import CloudinaryField 2 | from django_countries.fields import CountryField 3 | 4 | from django.contrib.auth.models import AbstractUser 5 | from django.core.validators import RegexValidator 6 | from django.db import models 7 | from model.common_fields import BaseModel 8 | 9 | from .manager import UserManager 10 | 11 | 12 | class User(AbstractUser): 13 | """ Custome User model""" 14 | 15 | username = None 16 | email = models.EmailField(unique=True) 17 | 18 | USERNAME_FIELD = 'email' 19 | REQUIRED_FIELDS = [] 20 | is_customer = models.BooleanField(default=False) 21 | is_vendor = models.BooleanField(default=False) 22 | 23 | objects = UserManager() 24 | 25 | 26 | class Customer(BaseModel): 27 | """Customer model for storing customer information""" 28 | 29 | user = models.OneToOneField( 30 | User, related_name='customer', on_delete=models.CASCADE) 31 | full_name = models.CharField(max_length=255) 32 | image = CloudinaryField('avatar', null=True, blank=True) 33 | email = models.EmailField() 34 | phone_regex = RegexValidator( 35 | regex=r'^\+?880?\d{9,11}$', message="Phone number must be entered in the format: '+8801234233566'. Up to 11 digits allowed.") 36 | phone_number = models.CharField( 37 | validators=[phone_regex], max_length=17, blank=True) 38 | address = models.CharField(max_length=255) 39 | country = CountryField() 40 | 41 | def __str__(self): 42 | return self.full_name 43 | 44 | @property 45 | def get_user_full_name(self): 46 | """Returns the first_name plus the last_name, with a space in between.""" 47 | full_name = f"{self.full_name}" 48 | return full_name.strip() 49 | 50 | class Meta: 51 | verbose_name_plural = "Customer" 52 | -------------------------------------------------------------------------------- /customers/templates/customer/customer_profile_edit.html: -------------------------------------------------------------------------------- 1 | {% extends 'core/_base.html' %} 2 | {% block title %}Manage My Account {% endblock %} 3 | {% load static %} 4 | {% load crispy_forms_tags %} 5 | {% block body %} 6 | 10 | 14 | 15 |
16 |
17 | 34 | 40 | {% if messages %} 41 | {% for message in messages %} 42 | 43 |
{{ message }}
44 | {% endfor %} 45 | {% endif %} 46 |
47 |
48 | {% csrf_token %} 49 | {{ form|crispy }} 50 | 51 | Change Password 52 |
53 |
54 |
55 |
56 | {% endblock body %} 57 | -------------------------------------------------------------------------------- /customers/templates/customer/logout.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 | Thanks for spending some quality time with Photo Album.
5 |
6 | Login back in here

7 |
8 |
-------------------------------------------------------------------------------- /customers/templates/customer/mail/welcome_email.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 36 | 37 | 38 |
19 |

Hi {{user.full_name}},

20 | Thank you for registering with the Lomofy. We appreciate your interest in Lomofy!

21 |

22 |

23 | 24 | Continue Shopping 25 |

26 |

We can control our finances, you will know how much you spend, you have more control over money and a smaller saving problem.

27 |

28 | Thank you, 29 |
The Lomofy Team 30 |
31 |
32 | {{ request.headers.user_agent }} 33 |

**This is an automated message**

34 |

35 |
39 |
40 | 41 | -------------------------------------------------------------------------------- /customers/templates/customer/password_change.html: -------------------------------------------------------------------------------- 1 | {% extends 'core/_base.html' %} 2 | {% block title %}Change Password {% endblock %} 3 | {% load static %} 4 | {% load crispy_forms_tags %} 5 | {% block body %} 6 | 10 | 14 | 15 |
16 |
17 | 23 | {% if messages %} 24 | {% for message in messages %} 25 | 26 |
{{ message }}
27 | {% endfor %} 28 | {% endif %} 29 |
30 |
31 | {% csrf_token %} 32 | {{ form|crispy }} 33 | 34 |
35 |
36 |
37 |
38 | {% endblock body %} -------------------------------------------------------------------------------- /customers/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/customers/test/__init__.py -------------------------------------------------------------------------------- /customers/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | from django.contrib.auth import views as auth_views 4 | 5 | urlpatterns = [ 6 | path('new', views.CustomerSignUpView, name='customer_sign_up'), 7 | path('sign-in', views.SignInView.as_view(), name='customer_sign_in'), 8 | path( 9 | "sign-out/", 10 | auth_views.LogoutView.as_view(template_name="customer/logout.html"), 11 | name="customer_sign_out", 12 | ), 13 | path('profile/', views.CustomerProfile, name='customer_profile'), 14 | path('change/password/', views.change_password_view, name='change_password'), 15 | path('profile/update/', views.CustomerProfileUpdate, name='customer_profile_update'), 16 | 17 | 18 | path('wishlist/followed/store/', views.customerWishlistAndFollowedStore, name='customer_wishlist_and_followed_store'), 19 | 20 | ] 21 | -------------------------------------------------------------------------------- /customers/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/customers/utils/__init__.py -------------------------------------------------------------------------------- /customers/utils/service.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import threading 3 | 4 | from django.conf import settings 5 | from django.contrib.sites.shortcuts import get_current_site 6 | from django.core.mail import EmailMessage 7 | from django.template.loader import render_to_string 8 | 9 | # Get an instance of a logger 10 | logger = logging.getLogger(__name__) 11 | 12 | 13 | class EmailThread(threading.Thread): 14 | ''' Thread to send email in background. ''' 15 | 16 | def __init__(self, mail): 17 | self.mail = mail 18 | threading.Thread.__init__(self) 19 | 20 | def run(self): 21 | try: 22 | self.mail.send() 23 | except Exception as e: 24 | logger.warning(f"Somthing went wrong while sending mail to thread {e}") 25 | 26 | 27 | def send_welcome_mail(request, user): 28 | """ Send welcome mail to customer. """ 29 | current_site = get_current_site(request) 30 | 31 | body = render_to_string("customer/mail/welcome_email.html", 32 | {'current_site': request.META['HTTP_USER_AGENT'], 'domain': current_site.domain, 'user': request.user.customer}) 33 | 34 | mail = EmailMessage( 35 | subject="Welcome to Lomofy!", 36 | body=body, 37 | from_email=settings.EMAIL_HOST_USER, 38 | to=[request.user.customer.email], 39 | ) 40 | mail.content_subtype = "HTML" 41 | EmailThread(mail).start() 42 | return None 43 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/db.sqlite3 -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /docs/additional-resources.md: -------------------------------------------------------------------------------- 1 | # 📚 Additional Resources 2 | 3 | ## Django 4 | 5 | - [Official Documentation](https://docs.djangoproject.com/en/3.2/) 6 | 7 | ## Python 8 | 9 | - [Official Documentation](https://docs.python.org/3.9/) 10 | 11 | ## Celery 12 | 13 | - [Official Documentation](https://docs.celeryproject.org/en/stable/) 14 | 15 | ## Django Redis 16 | - [Official Documentation](https://django-redis-cache.readthedocs.io/en/latest/) 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/deployment.md: -------------------------------------------------------------------------------- 1 | # 🌐 Deployment 2 | 3 | Deploy and serve your applications and assets over a CDN for best delivery and performance. Good options for that are: 4 | 5 | - [Heroku](https://dashboard.heroku.com/) 6 | - [Cloudinary](https://cloudinary.com/) 7 | -------------------------------------------------------------------------------- /docs/error-handling.md: -------------------------------------------------------------------------------- 1 | # ⚠️ Error Handling 2 | 3 | ### Error Tracking 4 | 5 | You should track any errors that occur in production. Although it's possible to implement your own solution, it is a better idea to use tools like [Sentry](https://sentry.io/). It will report any issue that breaks the app. You will also be able to see on which platform, browser, etc. did it occur. Make sure to upload source maps to sentry to see where in your source code did the error happen. 6 | -------------------------------------------------------------------------------- /docs/security.md: -------------------------------------------------------------------------------- 1 | # 🔐 Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | 23 | ### Authorization 24 | 25 | Authorization is a process of determining if the user is allowed to access a resource. 26 | 27 | #### RBAC (Role based access control) 28 | 29 | The most common method. Define allowed roles for a resource and then check if a user has the allowed role in order to access a resource. Good example is `USER` and `ADMIN` roles. You want to restrict some things for users and let admins access it. 30 | 31 | #### PBAC (Permission based access control) 32 | 33 | Sometimes RBAC is not enough. Some of the operations should be allowed only by the owner of the resource. For example user's comment - only the author of the comment should be able to delete it. That's why you might want to use PBAC, as it is more flexible. 34 | 35 | For RBAC protection you can use the `RBAC` component by passing allowed roles to it. On the other hand if you need more strict protection, you can pass policies check to it. 36 | -------------------------------------------------------------------------------- /docs/style-guide.md: -------------------------------------------------------------------------------- 1 | # 👁️ Style Guide 2 | 3 | When you work with large projects, it's important that you remain consistent throughout the codebase and follow the best practices. To guarantee the quality of your codebase, you need to analyze different levels of the applications code. 4 | 5 | ## Clean Code 6 | 7 | This is the most abstract level of code standardization. It's related to the implementations independent of the programming language. It will help the readability of your code. 8 | 9 | [Clean Code Python](https://github.com/zedr/clean-code-python) 10 | 11 | ### Naming 12 | 13 | One of the most important points of the Clean Code is how you name your functions, variables, components, etc. Use this amazing guide to understand how to write better variable names. 14 | 15 | [Naming Cheatsheet](https://realpython.com/python-pep8/) 16 | -------------------------------------------------------------------------------- /docs/testing.md: -------------------------------------------------------------------------------- 1 | # 🧪 Testing 2 | 3 | This [tweet](https://twitter.com/rauchg/status/807626710350839808) explains in a concise way how to think about testing. You will get the most benefit from having integration and e2e tests. Unit tests are fine, but they will not give you as much confidence that your application is working as integration tests do. 4 | 5 | ## Types of tests: 6 | 7 | ### Unit Tests 8 | 9 | Unit testing, as the naming already reveals is a type of testing where units of an application are being tested in isolation. 10 | You should write unit tests for shared components and functions that are used throughout the entire application as they might be used in different scenarios which might be difficult to reproduce in integration tests. 11 | 12 | 13 | ### Integration Tests 14 | 15 | Integration testing is a method of testing multiple parts of an application at once. 16 | Most of your tests should be integration tests, as these will give you the most benefits and confidence for your invested effort. Unit tests on their own don't guarantee that your app will work even if those tests pass, because the relationship between the units might be wrong. You should test different features with integration tests. 17 | 18 | 19 | -------------------------------------------------------------------------------- /img/drawSQL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/img/drawSQL.png -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Project.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /model/common_fields.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils.timezone import now 3 | 4 | 5 | class BaseModel(models.Model): 6 | """ Abstract base classe some common information """ 7 | created_at = models.DateTimeField(default=now, editable=False) 8 | updated_at = models.DateTimeField(default=now, editable=False) 9 | 10 | class Meta: 11 | ordering = ['-created'] 12 | abstract = True 13 | -------------------------------------------------------------------------------- /newsletter/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/__init__.py -------------------------------------------------------------------------------- /newsletter/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Subscriber 4 | 5 | 6 | @admin.register(Subscriber) 7 | class SubscriberAdmin(admin.ModelAdmin): 8 | list_display = ('email', 'confirmed', 'created_at') 9 | list_filter = ('created_at',) 10 | search_fields = ('email', 'confirmed') 11 | date_hierarchy = 'created_at' 12 | ordering = ('-created_at',) 13 | fields = ('email', 'created_at') 14 | readonly_fields = ('created_at',) 15 | list_per_page = 100 16 | list_max_show_all = 200 17 | 18 | def has_delete_permission(self, request, obj=None): 19 | ''' 20 | Remove the delete button from the admin panel 21 | ''' 22 | return False 23 | 24 | def has_add_permission(self, request): 25 | ''' 26 | Remove the add button from the admin panel 27 | ''' 28 | return False 29 | 30 | def has_edit_permission(self, request, obj=None): 31 | ''' 32 | Remove the edit button from the admin panel 33 | ''' 34 | return False 35 | 36 | def has_change_permission(self, request, obj=None): 37 | ''' 38 | Remove the change button from the admin panel 39 | ''' 40 | return False 41 | -------------------------------------------------------------------------------- /newsletter/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class NewsletterConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'newsletter' 7 | -------------------------------------------------------------------------------- /newsletter/fixtures/subscriber.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "model": "newsletter.subscriber", 4 | "pk": 1, 5 | "fields": { 6 | "email": "test1@gmail.com", 7 | "confirmed": true 8 | } 9 | }, 10 | { 11 | "model": "newsletter.subscriber", 12 | "pk": 2, 13 | "fields": { 14 | "email": "test2@gmail.com", 15 | "confirmed": true 16 | } 17 | }, 18 | { 19 | "model": "newsletter.subscriber", 20 | "pk": 3, 21 | "fields": { 22 | "email": "test3@gmail.com", 23 | "confirmed": true 24 | } 25 | } 26 | ] -------------------------------------------------------------------------------- /newsletter/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-23 18:46 2 | 3 | from django.db import migrations, models 4 | import django.utils.timezone 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Subscriber', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)), 20 | ('updated_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)), 21 | ('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')), 22 | ('confirmed', models.BooleanField(default=False)), 23 | ], 24 | options={ 25 | 'verbose_name': 'Subscriber', 26 | 'verbose_name_plural': 'Subscribers', 27 | }, 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /newsletter/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/migrations/__init__.py -------------------------------------------------------------------------------- /newsletter/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from model.common_fields import BaseModel 3 | 4 | 5 | class Subscriber(BaseModel): 6 | email = models.EmailField(unique=True, verbose_name='Email') 7 | confirmed = models.BooleanField(default=False) 8 | 9 | class Meta: 10 | verbose_name = 'Subscriber' 11 | verbose_name_plural = 'Subscribers' 12 | 13 | def __str__(self): 14 | return self.email + " (" + ("not " if not self.confirmed else "") + "confirmed)" 15 | -------------------------------------------------------------------------------- /newsletter/tasks.py: -------------------------------------------------------------------------------- 1 | from celery import shared_task 2 | 3 | from django.conf import settings 4 | from django.core.mail import EmailMessage 5 | from django.template.loader import render_to_string 6 | 7 | from .models import Subscriber 8 | 9 | 10 | @shared_task 11 | def async_send_newsletter(): 12 | ''' 13 | Asynchronously send newsletter to all subscribers. 14 | Time period: 15 | - Time zone: Asia/Dhaka, Bangladesh. 16 | - Every weeks at 00:00 ⏰ 17 | ''' 18 | confirme_subscribers = Subscriber.objects.filter(confirmed=True) 19 | for subscriber in confirme_subscribers: 20 | body = render_to_string("newsletter/mail/newsletter.html") 21 | mail = EmailMessage( 22 | subject="Newsletter🎉", 23 | body=body, 24 | from_email=settings.EMAIL_HOST_USER, 25 | to=[subscriber.email], 26 | ) 27 | mail.content_subtype = "HTML" 28 | mail.send() 29 | return "Newsletter sent to {}".format(subscriber.email) 30 | -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/004-twitter-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/004-twitter-logo.png -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/005-facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/005-facebook.png -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/006-instagram-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/006-instagram-logo.png -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/product-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/product-1.jpg -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/product-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/product-2.jpg -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/product-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/product-3.jpg -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/product-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/product-4.jpg -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/product-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/product-5.jpg -------------------------------------------------------------------------------- /newsletter/templates/newsletter/mail/static/images/product-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/templates/newsletter/mail/static/images/product-6.jpg -------------------------------------------------------------------------------- /newsletter/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/newsletter/test/__init__.py -------------------------------------------------------------------------------- /newsletter/test/test_newsletter_model.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from newsletter.models import Subscriber 3 | 4 | 5 | class NewsletterModelTest(TestCase): 6 | """ Test suite for customer model """ 7 | 8 | def setUp(self): 9 | """ Set up test database """ 10 | Subscriber.objects.create(email='test@gmail.com', confirmed=True) 11 | Subscriber.objects.create(email='test2@gmail.com', confirmed=False) 12 | 13 | def tearDown(self): 14 | """ Clean up test database """ 15 | Subscriber.objects.all().delete() 16 | 17 | def test_string_representation(self): 18 | """ Test string representation of model """ 19 | email = Subscriber.objects.get(email='test@gmail.com') 20 | self.assertEqual(str(email), 'test@gmail.com (confirmed)') 21 | 22 | def test_unconfirmed_string_representation(self): 23 | """ Test string representation of unconfirmed model """ 24 | email = Subscriber.objects.get(email='test2@gmail.com') 25 | self.assertEqual(str(email), 'test2@gmail.com (not confirmed)') 26 | 27 | def test_subscriber_confirmed(self): 28 | """ Test confirmed field """ 29 | confirmed = Subscriber.objects.filter(email='test@gmail.com', confirmed=True) 30 | self.assertEqual(confirmed.count(), 1) 31 | 32 | def test_subscriber_unconfirmed(self): 33 | """ Test unconfirmed field """ 34 | unconfirmed = Subscriber.objects.filter(email='test@gmail.com', confirmed=False) 35 | self.assertEqual(unconfirmed.count(), 0) 36 | 37 | def test_subscriber_verbose_name(self): 38 | """ Test verbose name of model """ 39 | self.assertEqual(str(Subscriber._meta.verbose_name), 'Subscriber') 40 | 41 | def test_subscriber_verbose_name_plural(self): 42 | """ Test verbose name of model """ 43 | self.assertEqual(str(Subscriber._meta.verbose_name_plural), 'Subscribers') 44 | -------------------------------------------------------------------------------- /newsletter/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | urlpatterns = [ 6 | path('', views.subscribe, name='subscribe'), 7 | path('unsubscribe/', views.unsubscribe, name='unsubscribe'), 8 | 9 | ] 10 | -------------------------------------------------------------------------------- /newsletter/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib import messages 2 | from django.db import IntegrityError 3 | from django.shortcuts import redirect 4 | 5 | from .models import Subscriber 6 | from .tasks import async_send_newsletter 7 | 8 | 9 | def subscribe(request): 10 | if request.method == 'POST': 11 | email = request.POST.get('email') 12 | subscriber = Subscriber(email=email, confirmed=True) 13 | if subscriber == Subscriber.objects.filter(email=subscriber.email): 14 | messages.error(request, 'You are already subscribed to our newsletter!') 15 | return redirect('home') 16 | else: 17 | try: 18 | subscriber.save() 19 | async_send_newsletter.delay() 20 | messages.success(request, 'You have been subscribed to our newsletter!') 21 | return redirect('home') 22 | except IntegrityError as e: 23 | messages.error(request, 'You are already subscribed to our newsletter!') 24 | return redirect('home') 25 | else: 26 | return redirect('home') 27 | 28 | 29 | def unsubscribe(request): 30 | confirme_subscribers = Subscriber.objects.get(email=request.GET['email']) 31 | for subscriber in confirme_subscribers: 32 | subscriber.delete() 33 | messages.success(request, 'You have successfully unsubscribed from our newsletter!') 34 | return redirect('home') 35 | -------------------------------------------------------------------------------- /order/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/order/__init__.py -------------------------------------------------------------------------------- /order/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Order, OrderItem 3 | 4 | admin.site.register(Order) 5 | admin.site.register(OrderItem) 6 | -------------------------------------------------------------------------------- /order/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class OrderConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'order' 7 | -------------------------------------------------------------------------------- /order/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | 4 | class CheckoutForm(forms.Form): 5 | first_name = forms.CharField(max_length=50) 6 | last_name = forms.CharField(max_length=50) 7 | email = forms.EmailField() 8 | phone = forms.CharField(max_length=20) 9 | address = forms.CharField(max_length=250) 10 | zipcode = forms.CharField(max_length=10) 11 | place = forms.CharField(max_length=100) 12 | stripe_token = forms.CharField(max_length=100) 13 | -------------------------------------------------------------------------------- /order/migrations/0002_auto_20210917_0147.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-16 19:47 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('product', '0004_alter_product_wishlist'), 11 | ('customers', '0004_alter_customer_full_name'), 12 | ('order', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='order', 18 | name='customer', 19 | field=models.ManyToManyField(to='customers.Customer'), 20 | ), 21 | migrations.AddField( 22 | model_name='orderitem', 23 | name='product', 24 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='product.product'), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /order/migrations/0003_auto_20211013_2140.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-13 15:40 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('customers', '0005_customer_image'), 11 | ('order', '0002_auto_20210917_0147'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='order', 17 | name='customer', 18 | ), 19 | migrations.AddField( 20 | model_name='order', 21 | name='customer', 22 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='customers.customer'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /order/migrations/0006_auto_20211016_1928.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-16 13:28 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('customers', '0005_customer_image'), 10 | ('order', '0005_auto_20211016_1920'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='order', 16 | name='customer', 17 | ), 18 | migrations.AddField( 19 | model_name='order', 20 | name='customer', 21 | field=models.ManyToManyField(to='customers.Customer'), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /order/migrations/0007_orderitem_vendor.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-19 13:28 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | import django.utils.timezone 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('vendor', '0002_auto_20210904_1157'), 12 | ('order', '0006_auto_20211016_1928'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='orderitem', 18 | name='vendor', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vendor.vendor'), 20 | preserve_default=False, 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /order/migrations/0008_auto_20211029_0044.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-28 18:44 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('order', '0007_orderitem_vendor'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='order', 15 | name='delivered_date', 16 | field=models.DateTimeField(auto_now_add=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='order', 20 | name='paid_date', 21 | field=models.DateTimeField(auto_now_add=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /order/migrations/0009_auto_20211103_1610.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-11-03 10:10 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('order', '0008_auto_20211029_0044'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='order', 15 | name='delivered_date', 16 | field=models.DateTimeField(), 17 | ), 18 | migrations.AlterField( 19 | model_name='order', 20 | name='paid_date', 21 | field=models.DateTimeField(), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /order/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/order/migrations/__init__.py -------------------------------------------------------------------------------- /order/tasks.py: -------------------------------------------------------------------------------- 1 | from celery import shared_task 2 | 3 | from django.conf import settings 4 | from django.core.mail import EmailMessage 5 | from django.template.loader import render_to_string 6 | 7 | from .models import OrderItem 8 | 9 | 10 | @shared_task 11 | def send_order_confirmation_mail(order_id): 12 | ''' Asynchronously send email after order has been complete. ''' 13 | orders = OrderItem.objects.filter(id=order_id, order__isPaid=True) 14 | for order in orders: 15 | body = render_to_string("mail/CartEmail.html", {"order": order}) 16 | mail = EmailMessage( 17 | subject="your order has been confirmed", 18 | body=body, 19 | from_email=settings.EMAIL_HOST_USER, 20 | to=[order.customer.email], 21 | ) 22 | mail.content_subtype = "HTML" 23 | mail.send() 24 | return "Confirmation mail sent to {}".format(order.email) 25 | -------------------------------------------------------------------------------- /order/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/order/test/__init__.py -------------------------------------------------------------------------------- /order/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = 'order' 6 | 7 | urlpatterns = [ 8 | path('checkout', views.checkout, name='checkout'), 9 | path('confirmation', views.order_complete, name='order_complete'), 10 | path('returns', views.customerReturns, name='customer_returns'), 11 | path('cancellation', views.customerCancellations, name='customer_cancellation'), 12 | path('history', views.customerOrderHistory, name='customer_order_history'), 13 | path('view/', views.order_details, name='order_details'), 14 | ] 15 | -------------------------------------------------------------------------------- /order/utilities.py: -------------------------------------------------------------------------------- 1 | from cart.cart import Cart 2 | from order.models import Order, OrderItem 3 | 4 | 5 | def order_checkout(request, first_name, last_name, email, address, zipcode, place, phone, paid_amount): 6 | """ 7 | This function is used to check out an order. 8 | """ 9 | order = Order.objects.create( 10 | first_name=first_name, 11 | last_name=last_name, 12 | email=email, 13 | address=address, 14 | zipcode=zipcode, 15 | place=place, 16 | phone=phone, 17 | paid_amount=paid_amount, 18 | total_price=Cart(request).get_total_price() 19 | ) 20 | 21 | for item in Cart(request): 22 | OrderItem.objects.create( 23 | order=order, product=item['product'], customer=item['product'].customer, price=item['product'].price, quantity=item['quantity']) 24 | 25 | order.customer.add(item['product'].customer) 26 | 27 | return order 28 | -------------------------------------------------------------------------------- /product/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/product/__init__.py -------------------------------------------------------------------------------- /product/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Product, Category 3 | 4 | admin.site.register(Category) 5 | admin.site.register(Product) 6 | -------------------------------------------------------------------------------- /product/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ProductConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'product' 7 | -------------------------------------------------------------------------------- /product/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | 4 | class AddToCartForm(forms.Form): 5 | quantity = forms.IntegerField() 6 | -------------------------------------------------------------------------------- /product/migrations/0002_auto_20210901_1503.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-01 09:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('customers', '0002_alter_customer_options'), 10 | ('product', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='product', 16 | name='is_new', 17 | field=models.BooleanField(default=False), 18 | ), 19 | migrations.AlterField( 20 | model_name='product', 21 | name='wishlist', 22 | field=models.ManyToManyField(blank=True, null=True, to='customers.Customer'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /product/migrations/0003_product_discount.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-01 09:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('product', '0002_auto_20210901_1503'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='product', 15 | name='discount', 16 | field=models.DecimalField(decimal_places=2, default=0, max_digits=10), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /product/migrations/0004_alter_product_wishlist.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-16 19:47 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('customers', '0004_alter_customer_full_name'), 10 | ('product', '0003_product_discount'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='product', 16 | name='wishlist', 17 | field=models.ManyToManyField(to='customers.Customer'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /product/migrations/0005_auto_20210930_0108.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-29 19:08 2 | 3 | import cloudinary.models 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('product', '0004_alter_product_wishlist'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='product', 16 | name='url', 17 | field=models.URLField(blank=True, null=True), 18 | ), 19 | migrations.AlterField( 20 | model_name='product', 21 | name='image', 22 | field=cloudinary.models.CloudinaryField(blank=True, max_length=255, null=True, verbose_name='image'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /product/migrations/0006_product_is_review.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-14 08:28 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('product', '0005_auto_20210930_0108'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='product', 15 | name='is_review', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /product/migrations/0007_product_customer.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-19 13:29 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('customers', '0005_customer_image'), 11 | ('product', '0006_product_is_review'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='product', 17 | name='customer', 18 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customer', to='customers.customer'), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /product/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/product/migrations/__init__.py -------------------------------------------------------------------------------- /product/templates/product/product_list.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 6 | {% if messages %} 7 | {% for message in messages %} 8 |
{{ message }}
9 | {% endfor %} 10 | {% endif %} 11 |
12 |
13 |
14 | {% if product.image %} 15 | {{product.title}} 16 | {% else %} 17 | {{product.title}} 18 | {% endif %} 19 |
20 | {% if product.is_new %} 21 | New 22 | {% endif %} 23 |
24 |
25 |
26 |

27 | {{product.title|title}}

28 |
29 |
    30 |
  • ${{product.price}}
  • 31 | {% if product.discount %} 32 |
  • ${{product.discount}}
  • 33 | {% endif %} 34 |
35 |
36 |
37 | See details 38 | {% if product.wishlist_exist %} 39 | Remove from wishlist 40 | {% else %} 41 | Add to wishlist 42 | {% endif %} 43 |
44 |
45 |
46 | -------------------------------------------------------------------------------- /product/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/product/test/__init__.py -------------------------------------------------------------------------------- /product/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import product_detail 4 | 5 | urlpatterns = [ 6 | path('///', product_detail, name='product_detail'), 7 | 8 | ] 9 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | amqp==5.0.6 2 | asgiref==3.4.1 3 | async-generator==1.10 4 | attrs==21.2.0 5 | autopep8==1.5.7 6 | billiard==3.6.4.0 7 | celery==5.1.2 8 | certifi==2021.5.30 9 | cffi==1.15.0 10 | charset-normalizer==2.0.7 11 | click==7.1.2 12 | click-didyoumean==0.0.3 13 | click-plugins==1.1.1 14 | click-repl==0.2.0 15 | cloudinary==1.26.0 16 | colorama==0.4.4 17 | coverage==5.5 18 | crispy-tailwind==0.5.0 19 | cryptography==35.0.0 20 | dj-database-url==0.5.0 21 | Django==3.2.20 22 | django-autoslug==1.9.8 23 | django-celery-results==2.2.0 24 | django-countries==7.2.1 25 | django-crispy-forms==1.12.0 26 | django-debug-toolbar==3.2.2 27 | django-heroku==0.3.1 28 | django-recaptcha==2.0.6 29 | django-taggit==1.5.1 30 | flake8==3.9.2 31 | gunicorn==20.1.0 32 | h11==0.12.0 33 | idna==3.3 34 | isort==5.9.3 35 | kombu==5.1.0 36 | mccabe==0.6.1 37 | outcome==1.1.0 38 | prompt-toolkit==3.0.20 39 | psycopg2==2.9.1 40 | pycodestyle==2.7.0 41 | pycparser==2.21 42 | pyflakes==2.3.1 43 | pyOpenSSL==21.0.0 44 | python-dotenv==0.19.2 45 | pytz==2021.1 46 | redis==3.5.3 47 | requests==2.26.0 48 | selenium==4.0.0 49 | sentry-sdk==1.4.3 50 | six==1.16.0 51 | sniffio==1.2.0 52 | sortedcontainers==2.4.0 53 | sqlparse==0.4.1 54 | stripe==2.61.0 55 | toml==0.10.2 56 | trio==0.19.0 57 | trio-websocket==0.9.2 58 | urllib3==1.26.6 59 | uvicorn==0.15.0 60 | vine==5.0.0 61 | wcwidth==0.2.5 62 | whitenoise==5.3.0 63 | wsproto==1.0.0 64 | -------------------------------------------------------------------------------- /review/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/review/__init__.py -------------------------------------------------------------------------------- /review/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Review 3 | 4 | admin.site.register(Review) 5 | -------------------------------------------------------------------------------- /review/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ReviewConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'review' 7 | -------------------------------------------------------------------------------- /review/forms.py: -------------------------------------------------------------------------------- 1 | from django.forms import ModelForm 2 | 3 | from .models import Review 4 | 5 | 6 | class ReviewForm(ModelForm): 7 | class Meta: 8 | model = Review 9 | fields = ('star', 'reviewImage') 10 | -------------------------------------------------------------------------------- /review/migrations/0002_alter_review_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-03 15:16 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('review', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='review', 15 | options={'ordering': ('-star',), 'verbose_name_plural': 'Customer feedback'}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /review/migrations/0003_remove_review_product.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-13 16:00 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('review', '0002_alter_review_options'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='review', 15 | name='product', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /review/migrations/0004_auto_20211014_1426.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-14 08:26 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('customers', '0005_customer_image'), 11 | ('product', '0005_auto_20210930_0108'), 12 | ('review', '0003_remove_review_product'), 13 | ] 14 | 15 | operations = [ 16 | migrations.RemoveField( 17 | model_name='review', 18 | name='order_product', 19 | ), 20 | migrations.AddField( 21 | model_name='review', 22 | name='product', 23 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='product.product'), 24 | ), 25 | migrations.AlterField( 26 | model_name='review', 27 | name='customer', 28 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='customers.customer'), 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /review/migrations/0005_alter_review_reviewimage.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-11-03 10:24 2 | 3 | import cloudinary.models 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('review', '0004_auto_20211014_1426'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='review', 16 | name='reviewImage', 17 | field=cloudinary.models.CloudinaryField(blank=True, max_length=255, null=True, verbose_name='image'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /review/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/review/migrations/__init__.py -------------------------------------------------------------------------------- /review/models.py: -------------------------------------------------------------------------------- 1 | from cloudinary.models import CloudinaryField 2 | 3 | from customers.models import Customer 4 | from django.db import models 5 | from django.utils.translation import gettext as _ 6 | from model.common_fields import BaseModel 7 | from product.models import Product 8 | 9 | 10 | class Review(BaseModel): 11 | """ Review model for products """ 12 | customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True) 13 | product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True) 14 | 15 | class Star(models.IntegerChoices): 16 | VS = 5, _('Very satisfied') 17 | ST = 4, _('Satisfied') 18 | NT = 3, _('Neutral') 19 | US = 2, _('Unsatisfied') 20 | VN = 1, _('Very unsatisfied') 21 | 22 | star = models.PositiveSmallIntegerField( 23 | _("stars"), choices=Star.choices, default=5) 24 | 25 | reviewImage = CloudinaryField('image', null=True, blank=True) 26 | 27 | feedback = models.TextField( 28 | help_text="Please share your feedback about the product was the product as described? What is the quality like?", 29 | ) 30 | riderReview = models.TextField( 31 | help_text="How was your overall experience with our rider?", 32 | null=True, 33 | blank=True, 34 | ) 35 | 36 | def __str__(self): 37 | return f"Customer: {self.customer} - Product: {self.product} Rating: - {self.star}" 38 | 39 | class Meta: 40 | ordering = ('-star',) 41 | verbose_name_plural = _("Customer feedback") 42 | -------------------------------------------------------------------------------- /review/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/review/tests/__init__.py -------------------------------------------------------------------------------- /review/tests/test_review_model.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from review.models import Review 3 | 4 | 5 | class TestReviewModel(TestCase): 6 | ''' 7 | Test suite for review modules. 8 | ''' 9 | 10 | def setUp(self): 11 | ''' 12 | Set up test data for the review model. 13 | ''' 14 | Review.objects.create( 15 | feedback='Test review', 16 | riderReview='Test review content', 17 | ) 18 | 19 | def tearDown(self): 20 | ''' 21 | Clean up test data for the review model. 22 | ''' 23 | Review.objects.all().delete() 24 | 25 | def test_review_feedback(self): 26 | ''' 27 | Test review model for feedback. 28 | ''' 29 | review = Review.objects.get(feedback='Test review') 30 | self.assertEqual(review.feedback, 'Test review') 31 | 32 | def test_review_rider_review(self): 33 | ''' 34 | Test review model for rider review. 35 | ''' 36 | review = Review.objects.get(riderReview='Test review content') 37 | self.assertEqual(review.riderReview, 'Test review content') 38 | 39 | def test_review_verbose_name_plural(self): 40 | ''' 41 | Test review model for verbose name plural. 42 | ''' 43 | self.assertEqual(str(Review._meta.verbose_name_plural), 'Customer feedback') 44 | -------------------------------------------------------------------------------- /review/tests/test_review_urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import reverse 2 | from django.test import TestCase, override_settings 3 | 4 | 5 | class TestReviewUrls(TestCase): 6 | ''' 7 | Test suite for review modules. 8 | ''' 9 | 10 | @override_settings(STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage') 11 | def test_review_list_url(self): 12 | ''' 13 | Test case for review history url. 14 | ''' 15 | url = reverse('customer_review_history') 16 | self.assertEqual(url, '/review/') 17 | response = self.client.get(reverse('customer_review_history')) 18 | self.assertRedirects(response, reverse('customer_sign_in') + '?next=/review/') 19 | self.assertEqual(response.status_code, 302) 20 | 21 | @override_settings(STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage') 22 | def test_unreview_list_url(self): 23 | ''' 24 | Test case for unreview history url. 25 | ''' 26 | url = reverse('customer_to_be_reviewed') 27 | self.assertEqual(url, '/review/pending/') 28 | response = self.client.get(reverse('customer_to_be_reviewed')) 29 | self.assertRedirects(response, reverse('customer_sign_in') + '?next=/review/pending/') 30 | self.assertEqual(response.status_code, 302) 31 | -------------------------------------------------------------------------------- /review/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | urlpatterns = [ 6 | path('', views.customerReviewHistory, name='customer_review_history'), 7 | path('pending/', views.toBeReviewed, name='customer_to_be_reviewed'), 8 | path('write-review/', views.writeReview, name='customer_product_review'), 9 | ] 10 | -------------------------------------------------------------------------------- /runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.9.5 -------------------------------------------------------------------------------- /static/assets/css/flaticon.css: -------------------------------------------------------------------------------- 1 | /* 2 | Flaticon icon font: Flaticon 3 | Creation date: 30/12/2019 07:11 4 | */ 5 | 6 | @font-face { 7 | font-family: "Flaticon"; 8 | src: url("../fonts/Flaticon.eot"); 9 | src: url("../fonts/Flaticon.eot?#iefix") format("embedded-opentype"), 10 | url("../fonts/Flaticon.woff2") format("woff2"), 11 | url("../fonts/Flaticon.woff") format("woff"), 12 | url("../fonts/Flaticon.ttf") format("truetype"), 13 | url("../fonts/Flaticon.svg#Flaticon") format("svg"); 14 | font-weight: normal; 15 | font-style: normal; 16 | } 17 | 18 | @media screen and (-webkit-min-device-pixel-ratio:0) { 19 | @font-face { 20 | font-family: "Flaticon"; 21 | src: url("../fonts/Flaticon.svg#Flaticon") format("svg"); 22 | } 23 | } 24 | 25 | [class^="flaticon-"]:before, [class*=" flaticon-"]:before, 26 | [class^="flaticon-"]:after, [class*=" flaticon-"]:after { 27 | font-family: Flaticon; 28 | font-style: normal; 29 | } 30 | 31 | .flaticon-quote:before { content: "\f100"; } 32 | .flaticon-shopping-cart-black-shape:before { content: "\f101"; } -------------------------------------------------------------------------------- /static/assets/fonts/Flaticon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/Flaticon.eot -------------------------------------------------------------------------------- /static/assets/fonts/Flaticon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/Flaticon.ttf -------------------------------------------------------------------------------- /static/assets/fonts/Flaticon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/Flaticon.woff -------------------------------------------------------------------------------- /static/assets/fonts/Flaticon.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/Flaticon.woff2 -------------------------------------------------------------------------------- /static/assets/fonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-brands-400.eot -------------------------------------------------------------------------------- /static/assets/fonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /static/assets/fonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-brands-400.woff -------------------------------------------------------------------------------- /static/assets/fonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /static/assets/fonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-regular-400.eot -------------------------------------------------------------------------------- /static/assets/fonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /static/assets/fonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-regular-400.woff -------------------------------------------------------------------------------- /static/assets/fonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /static/assets/fonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-solid-900.eot -------------------------------------------------------------------------------- /static/assets/fonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /static/assets/fonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-solid-900.woff -------------------------------------------------------------------------------- /static/assets/fonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /static/assets/fonts/themify.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/themify.eot -------------------------------------------------------------------------------- /static/assets/fonts/themify.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/themify.ttf -------------------------------------------------------------------------------- /static/assets/fonts/themify.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/fonts/themify.woff -------------------------------------------------------------------------------- /static/assets/img/about/about_lft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/about/about_lft.png -------------------------------------------------------------------------------- /static/assets/img/about/about_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/about/about_right.png -------------------------------------------------------------------------------- /static/assets/img/about/pet_care.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/about/pet_care.png -------------------------------------------------------------------------------- /static/assets/img/about_img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/about_img_1.png -------------------------------------------------------------------------------- /static/assets/img/about_img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/about_img_2.png -------------------------------------------------------------------------------- /static/assets/img/about_us_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/about_us_video.png -------------------------------------------------------------------------------- /static/assets/img/adapt_icon/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/adapt_icon/1.png -------------------------------------------------------------------------------- /static/assets/img/adapt_icon/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/adapt_icon/2.png -------------------------------------------------------------------------------- /static/assets/img/adapt_icon/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/adapt_icon/3.png -------------------------------------------------------------------------------- /static/assets/img/arrivel/arrivel_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/arrivel/arrivel_1.png -------------------------------------------------------------------------------- /static/assets/img/arrivel/arrivel_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/arrivel/arrivel_2.png -------------------------------------------------------------------------------- /static/assets/img/arrivel/arrivel_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/arrivel/arrivel_3.png -------------------------------------------------------------------------------- /static/assets/img/arrivel/arrivel_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/arrivel/arrivel_4.png -------------------------------------------------------------------------------- /static/assets/img/arrivel/arrivel_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/arrivel/arrivel_5.png -------------------------------------------------------------------------------- /static/assets/img/arrivel/arrivel_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/arrivel/arrivel_6.png -------------------------------------------------------------------------------- /static/assets/img/banner/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/banner/banner.png -------------------------------------------------------------------------------- /static/assets/img/banner/contact_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/banner/contact_bg.png -------------------------------------------------------------------------------- /static/assets/img/banner/dog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/banner/dog.png -------------------------------------------------------------------------------- /static/assets/img/banner/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/banner/img.png -------------------------------------------------------------------------------- /static/assets/img/banner_pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/banner_pattern.png -------------------------------------------------------------------------------- /static/assets/img/banner_shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/banner_shape.png -------------------------------------------------------------------------------- /static/assets/img/categori/card-man.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/card-man.png -------------------------------------------------------------------------------- /static/assets/img/categori/card-shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/card-shape.png -------------------------------------------------------------------------------- /static/assets/img/categori/card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/card.png -------------------------------------------------------------------------------- /static/assets/img/categori/cat1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/cat1.jpg -------------------------------------------------------------------------------- /static/assets/img/categori/cat2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/cat2.jpg -------------------------------------------------------------------------------- /static/assets/img/categori/cat3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/cat3.jpg -------------------------------------------------------------------------------- /static/assets/img/categori/category_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_1.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_10.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_11.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_12.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_2.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_3.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_4.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_5.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_6.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_7.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_8.png -------------------------------------------------------------------------------- /static/assets/img/categori/category_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/category_9.png -------------------------------------------------------------------------------- /static/assets/img/categori/product1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/product1.png -------------------------------------------------------------------------------- /static/assets/img/categori/product2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/product2.png -------------------------------------------------------------------------------- /static/assets/img/categori/product3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/product3.png -------------------------------------------------------------------------------- /static/assets/img/categori/product4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/product4.png -------------------------------------------------------------------------------- /static/assets/img/categori/product5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/product5.png -------------------------------------------------------------------------------- /static/assets/img/categori/product6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/categori/product6.png -------------------------------------------------------------------------------- /static/assets/img/client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/client.png -------------------------------------------------------------------------------- /static/assets/img/client_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/client_1.png -------------------------------------------------------------------------------- /static/assets/img/client_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/client_2.png -------------------------------------------------------------------------------- /static/assets/img/collection/collection1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/collection/collection1.png -------------------------------------------------------------------------------- /static/assets/img/collection/collection2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/collection/collection2.png -------------------------------------------------------------------------------- /static/assets/img/collection/collection3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/collection/collection3.png -------------------------------------------------------------------------------- /static/assets/img/collection/collection4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/collection/collection4.png -------------------------------------------------------------------------------- /static/assets/img/collection/collection5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/collection/collection5.png -------------------------------------------------------------------------------- /static/assets/img/collection/latest-man.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/collection/latest-man.png -------------------------------------------------------------------------------- /static/assets/img/collection/latest-offer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/collection/latest-offer.png -------------------------------------------------------------------------------- /static/assets/img/comment/comment_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/comment/comment_1.png -------------------------------------------------------------------------------- /static/assets/img/comment/comment_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/comment/comment_2.png -------------------------------------------------------------------------------- /static/assets/img/comment/comment_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/comment/comment_3.png -------------------------------------------------------------------------------- /static/assets/img/elements/_DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/_DS_Store -------------------------------------------------------------------------------- /static/assets/img/elements/a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/a.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/a2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/a2.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/d.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/disabled-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/disabled-check.png -------------------------------------------------------------------------------- /static/assets/img/elements/disabled-radio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/disabled-radio.png -------------------------------------------------------------------------------- /static/assets/img/elements/f1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/f1.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/f2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/f2.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/f3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/f3.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/f4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/f4.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/f5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/f5.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/f6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/f6.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/f7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/f7.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/f8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/f8.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/g1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/g1.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/g2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/g2.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/g3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/g3.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/g4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/g4.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/g5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/g5.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/g6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/g6.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/g7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/g7.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/g8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/g8.jpg -------------------------------------------------------------------------------- /static/assets/img/elements/primary-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/primary-check.png -------------------------------------------------------------------------------- /static/assets/img/elements/primary-radio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/primary-radio.png -------------------------------------------------------------------------------- /static/assets/img/elements/success-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/success-check.png -------------------------------------------------------------------------------- /static/assets/img/elements/success-radio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/success-radio.png -------------------------------------------------------------------------------- /static/assets/img/elements/user1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/user1.png -------------------------------------------------------------------------------- /static/assets/img/elements/user2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/elements/user2.png -------------------------------------------------------------------------------- /static/assets/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/favicon.ico -------------------------------------------------------------------------------- /static/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/favicon.png -------------------------------------------------------------------------------- /static/assets/img/gallery/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/gallery/1.png -------------------------------------------------------------------------------- /static/assets/img/gallery/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/gallery/2.png -------------------------------------------------------------------------------- /static/assets/img/gallery/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/gallery/3.png -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/gallery/gallery1.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/gallery/gallery2.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/gallery/gallery3.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/gallery/gallery4.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/gallery/gallery5.jpg -------------------------------------------------------------------------------- /static/assets/img/hero/Industries_hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/hero/Industries_hero.jpg -------------------------------------------------------------------------------- /static/assets/img/hero/about_hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/hero/about_hero.jpg -------------------------------------------------------------------------------- /static/assets/img/hero/category.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/hero/category.jpg -------------------------------------------------------------------------------- /static/assets/img/hero/contact_hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/hero/contact_hero.jpg -------------------------------------------------------------------------------- /static/assets/img/hero/gallery_hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/hero/gallery_hero.jpg -------------------------------------------------------------------------------- /static/assets/img/hero/h1_hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/hero/h1_hero.jpg -------------------------------------------------------------------------------- /static/assets/img/hero/hero_man.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/hero/hero_man.png -------------------------------------------------------------------------------- /static/assets/img/hero/services_hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/hero/services_hero.jpg -------------------------------------------------------------------------------- /static/assets/img/icon/arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/arrow-left.png -------------------------------------------------------------------------------- /static/assets/img/icon/arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/arrow-right.png -------------------------------------------------------------------------------- /static/assets/img/icon/color_star.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /static/assets/img/icon/feature_icon_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/feature_icon_1.png -------------------------------------------------------------------------------- /static/assets/img/icon/feature_icon_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/feature_icon_2.png -------------------------------------------------------------------------------- /static/assets/img/icon/feature_icon_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/feature_icon_3.png -------------------------------------------------------------------------------- /static/assets/img/icon/feature_icon_4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /static/assets/img/icon/header_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/header_icon.png -------------------------------------------------------------------------------- /static/assets/img/icon/icon_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/icon_1.png -------------------------------------------------------------------------------- /static/assets/img/icon/icon_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/icon_2.png -------------------------------------------------------------------------------- /static/assets/img/icon/icon_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/icon_3.png -------------------------------------------------------------------------------- /static/assets/img/icon/icon_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/icon_4.png -------------------------------------------------------------------------------- /static/assets/img/icon/left-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/left-white.png -------------------------------------------------------------------------------- /static/assets/img/icon/left.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /static/assets/img/icon/play.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /static/assets/img/icon/quate.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /static/assets/img/icon/right-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 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 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /static/assets/img/icon/right-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/icon/right-white.png -------------------------------------------------------------------------------- /static/assets/img/icon/right.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /static/assets/img/icon/star.svg: -------------------------------------------------------------------------------- 1 | 5 | 7 | -------------------------------------------------------------------------------- /static/assets/img/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/login.jpg -------------------------------------------------------------------------------- /static/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/logo.png -------------------------------------------------------------------------------- /static/assets/img/logo/date-picker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/logo/date-picker-icon.png -------------------------------------------------------------------------------- /static/assets/img/logo/form-iocn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/logo/form-iocn.jpg -------------------------------------------------------------------------------- /static/assets/img/logo/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/logo/logo.png -------------------------------------------------------------------------------- /static/assets/img/logo/logo2_footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/logo/logo2_footer.png -------------------------------------------------------------------------------- /static/assets/img/logo/select-items-icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/logo/select-items-icon.jpg -------------------------------------------------------------------------------- /static/assets/img/logo/testimonial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/logo/testimonial.png -------------------------------------------------------------------------------- /static/assets/img/offers/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/offers/1.png -------------------------------------------------------------------------------- /static/assets/img/offers/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/offers/2.png -------------------------------------------------------------------------------- /static/assets/img/offers/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/offers/3.png -------------------------------------------------------------------------------- /static/assets/img/our_blog/blog-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/our_blog/blog-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/post/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/next.png -------------------------------------------------------------------------------- /static/assets/img/post/post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_1.png -------------------------------------------------------------------------------- /static/assets/img/post/post_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_10.png -------------------------------------------------------------------------------- /static/assets/img/post/post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_2.png -------------------------------------------------------------------------------- /static/assets/img/post/post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_3.png -------------------------------------------------------------------------------- /static/assets/img/post/post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_4.png -------------------------------------------------------------------------------- /static/assets/img/post/post_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_5.png -------------------------------------------------------------------------------- /static/assets/img/post/post_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_6.png -------------------------------------------------------------------------------- /static/assets/img/post/post_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_7.png -------------------------------------------------------------------------------- /static/assets/img/post/post_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_8.png -------------------------------------------------------------------------------- /static/assets/img/post/post_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/post_9.png -------------------------------------------------------------------------------- /static/assets/img/post/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/post/preview.png -------------------------------------------------------------------------------- /static/assets/img/prising/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/1.png -------------------------------------------------------------------------------- /static/assets/img/prising/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/10.png -------------------------------------------------------------------------------- /static/assets/img/prising/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/2.png -------------------------------------------------------------------------------- /static/assets/img/prising/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/3.png -------------------------------------------------------------------------------- /static/assets/img/prising/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/4.png -------------------------------------------------------------------------------- /static/assets/img/prising/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/5.png -------------------------------------------------------------------------------- /static/assets/img/prising/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/6.png -------------------------------------------------------------------------------- /static/assets/img/prising/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/7.png -------------------------------------------------------------------------------- /static/assets/img/prising/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/8.png -------------------------------------------------------------------------------- /static/assets/img/prising/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/prising/9.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_1.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_10.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_2.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_3.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_4.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_5.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_6.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_7.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_8.png -------------------------------------------------------------------------------- /static/assets/img/product/product_list_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/product_list_9.png -------------------------------------------------------------------------------- /static/assets/img/product/single_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product/single_product.png -------------------------------------------------------------------------------- /static/assets/img/product_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/product_overlay.png -------------------------------------------------------------------------------- /static/assets/img/service/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/service/1.png -------------------------------------------------------------------------------- /static/assets/img/service/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/service/2.png -------------------------------------------------------------------------------- /static/assets/img/service/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/service/3.png -------------------------------------------------------------------------------- /static/assets/img/service/service_icon_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/service/service_icon_1.png -------------------------------------------------------------------------------- /static/assets/img/service/service_icon_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/service/service_icon_2.png -------------------------------------------------------------------------------- /static/assets/img/service/service_icon_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/service/service_icon_3.png -------------------------------------------------------------------------------- /static/assets/img/service/service_icon_bg_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/service/service_icon_bg_1.png -------------------------------------------------------------------------------- /static/assets/img/team/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/team/1.png -------------------------------------------------------------------------------- /static/assets/img/team/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/team/2.png -------------------------------------------------------------------------------- /static/assets/img/team/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/team/3.png -------------------------------------------------------------------------------- /static/assets/img/testmonial/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/testmonial/1.png -------------------------------------------------------------------------------- /static/assets/img/testmonial/Homepage_testi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/testmonial/Homepage_testi.png -------------------------------------------------------------------------------- /static/assets/img/time_line_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/time_line_1.png -------------------------------------------------------------------------------- /static/assets/img/tranding_item/tranding_item_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/tranding_item/tranding_item_1.png -------------------------------------------------------------------------------- /static/assets/img/tranding_item/tranding_item_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/tranding_item/tranding_item_2.png -------------------------------------------------------------------------------- /static/assets/img/tranding_item/tranding_item_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/tranding_item/tranding_item_3.png -------------------------------------------------------------------------------- /static/assets/img/tranding_item/tranding_item_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/tranding_item/tranding_item_4.png -------------------------------------------------------------------------------- /static/assets/img/tranding_item/tranding_item_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/tranding_item/tranding_item_5.png -------------------------------------------------------------------------------- /static/assets/img/tranding_item/tranding_item_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/img/tranding_item/tranding_item_6.png -------------------------------------------------------------------------------- /static/assets/js/jquery.counterup.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jquery.counterup.min.js 1.0 3 | * 4 | * Copyright 2013, Benjamin Intal http://gambit.ph @bfintal 5 | * Released under the GPL v2 License 6 | * 7 | * Date: Nov 26, 2013 8 | */(function(e){"use strict";e.fn.counterUp=function(t){var n=e.extend({time:400,delay:10},t);return this.each(function(){var t=e(this),r=n,i=function(){var e=[],n=r.time/r.delay,i=t.text(),s=/[0-9]+,[0-9]+/.test(i);i=i.replace(/,/g,"");var o=/^[0-9]+$/.test(i),u=/^[0-9]+\.[0-9]+$/.test(i),a=u?(i.split(".")[1]||[]).length:0;for(var f=n;f>=1;f--){var l=parseInt(i/n*f);u&&(l=parseFloat(i/n*f).toFixed(a));if(s)while(/(\d+)(\d{3})/.test(l.toString()))l=l.toString().replace(/(\d+)(\d{3})/,"$1,$2");e.unshift(l)}t.data("counterup-nums",e);t.text("0");var c=function(){t.text(t.data("counterup-nums").shift());if(t.data("counterup-nums").length)setTimeout(t.data("counterup-func"),r.delay);else{delete t.data("counterup-nums");t.data("counterup-nums",null);t.data("counterup-func",null)}};t.data("counterup-func",c);setTimeout(t.data("counterup-func"),r.delay)};t.waypoint(i,{offset:"100%",triggerOnce:!0})})}})(jQuery); -------------------------------------------------------------------------------- /static/assets/js/jquery.scrollUp.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * scrollup v2.4.1 3 | * Url: http://markgoodyear.com/labs/scrollup/ 4 | * Copyright (c) Mark Goodyear — @markgdyr — http://markgoodyear.com 5 | * License: MIT 6 | */ 7 | !function(l,o,e){"use strict";l.fn.scrollUp=function(o){l.data(e.body,"scrollUp")||(l.data(e.body,"scrollUp",!0),l.fn.scrollUp.init(o))},l.fn.scrollUp.init=function(r){var s,t,c,i,n,a,d,p=l.fn.scrollUp.settings=l.extend({},l.fn.scrollUp.defaults,r),f=!1;switch(d=p.scrollTrigger?l(p.scrollTrigger):l("",{id:p.scrollName,href:"#top"}),p.scrollTitle&&d.attr("title",p.scrollTitle),d.appendTo("body"),p.scrollImg||p.scrollTrigger||d.html(p.scrollText),d.css({display:"none",position:"fixed",zIndex:p.zIndex}),p.activeOverlay&&l("
",{id:p.scrollName+"-active"}).css({position:"absolute",top:p.scrollDistance+"px",width:"100%",borderTop:"1px dotted"+p.activeOverlay,zIndex:p.zIndex}).appendTo("body"),p.animation){case"fade":s="fadeIn",t="fadeOut",c=p.animationSpeed;break;case"slide":s="slideDown",t="slideUp",c=p.animationSpeed;break;default:s="show",t="hide",c=0}i="top"===p.scrollFrom?p.scrollDistance:l(e).height()-l(o).height()-p.scrollDistance,n=l(o).scroll(function(){l(o).scrollTop()>i?f||(d[s](c),f=!0):f&&(d[t](c),f=!1)}),p.scrollTarget?"number"==typeof p.scrollTarget?a=p.scrollTarget:"string"==typeof p.scrollTarget&&(a=Math.floor(l(p.scrollTarget).offset().top)):a=0,d.click(function(o){o.preventDefault(),l("html, body").animate({scrollTop:a},p.scrollSpeed,p.easingType)})},l.fn.scrollUp.defaults={scrollName:"scrollUp",scrollDistance:300,scrollFrom:"top",scrollSpeed:300,easingType:"linear",animation:"fade",animationSpeed:200,scrollTrigger:!1,scrollTarget:!1,scrollText:"Scroll to top",scrollTitle:!1,scrollImg:!1,activeOverlay:!1,zIndex:2147483647},l.fn.scrollUp.destroy=function(r){l.removeData(e.body,"scrollUp"),l("#"+l.fn.scrollUp.settings.scrollName).remove(),l("#"+l.fn.scrollUp.settings.scrollName+"-active").remove(),l.fn.jquery.split(".")[1]>=7?l(o).off("scroll",r):l(o).unbind("scroll",r)},l.scrollUp=l.fn.scrollUp}(jQuery,window,document); -------------------------------------------------------------------------------- /static/assets/js/mail-script.js: -------------------------------------------------------------------------------- 1 | // ------- Mail Send ajax 2 | 3 | $(document).ready(function() { 4 | var form = $('#myForm'); // contact form 5 | var submit = $('.submit-btn'); // submit button 6 | var alert = $('.alert-msg'); // alert div for show alert message 7 | 8 | // form submit event 9 | form.on('submit', function(e) { 10 | e.preventDefault(); // prevent default form submit 11 | 12 | $.ajax({ 13 | url: 'mail.php', // form action url 14 | type: 'POST', // form submit method get/post 15 | dataType: 'html', // request type html/json/xml 16 | data: form.serialize(), // serialize form data 17 | beforeSend: function() { 18 | alert.fadeOut(); 19 | submit.html('Sending....'); // change submit button text 20 | }, 21 | success: function(data) { 22 | alert.html(data).fadeIn(); // fade in response data 23 | form.trigger('reset'); // reset form 24 | submit.attr("style", "display: none !important");; // reset submit button text 25 | }, 26 | error: function(e) { 27 | console.log(e) 28 | } 29 | }); 30 | }); 31 | }); -------------------------------------------------------------------------------- /static/assets/js/plugins.js: -------------------------------------------------------------------------------- 1 | // Avoid `console` errors in browsers that lack a console. 2 | (function() { 3 | var method; 4 | var noop = function () {}; 5 | var methods = [ 6 | 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', 7 | 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 8 | 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', 9 | 'timeline', 'timelineEnd', 'timeStamp', 'trace', 'warn' 10 | ]; 11 | var length = methods.length; 12 | var console = (window.console = window.console || {}); 13 | 14 | while (length--) { 15 | method = methods[length]; 16 | 17 | // Only stub undefined methods. 18 | if (!console[method]) { 19 | console[method] = noop; 20 | } 21 | } 22 | }()); 23 | 24 | // Place any jQuery/helper plugins in here. 25 | -------------------------------------------------------------------------------- /static/assets/js/swiper_custom.js: -------------------------------------------------------------------------------- 1 | // swiper js code start 2 | var galleryTop = new Swiper('.gallery-top', { 3 | spaceBetween: 0, 4 | 5 | navigation: { 6 | nextEl: '.navigationHide', 7 | prevEl: '.navigationHide', 8 | }, 9 | // autoplay: true, 10 | loop: true, 11 | loopedSlides: 4 12 | }); 13 | var galleryThumbs = new Swiper('.gallery-thumbs', { 14 | spaceBetween: 0, 15 | centeredSlides: true, 16 | slidesPerView: 4, 17 | touchRatio: 0.2, 18 | slideToClickedSlide: true, 19 | loop: true, 20 | loopedSlides: 4 21 | }); 22 | galleryTop.controller.control = galleryThumbs; 23 | galleryThumbs.controller.control = galleryTop; 24 | // swiper js code end -------------------------------------------------------------------------------- /static/assets/js/theme.js: -------------------------------------------------------------------------------- 1 | ; (function ($) { 2 | "use strict" 3 | 4 | 5 | })(jQuery) -------------------------------------------------------------------------------- /static/assets/scss/_about_us.scss: -------------------------------------------------------------------------------- 1 | /************ about_us css start ***************/ 2 | .about_us{ 3 | .about_us_video{ 4 | position: relative; 5 | } 6 | .about_us_content{ 7 | h5{ 8 | font-size: 20px; 9 | color: $btn_bg; 10 | font-weight: 400; 11 | @media #{$small_mobile}{ 12 | font-size: 18px; 13 | } 14 | } 15 | h3{ 16 | font-size: 24px; 17 | line-height: 1.5; 18 | color: $heading_color; 19 | margin: 5px 0 60px; 20 | font-weight: 400; 21 | @media #{$tab}{ 22 | margin: 5px 0 30px; 23 | font-size: 20px; 24 | } 25 | } 26 | } 27 | .about_video_icon{ 28 | height: 84px; 29 | width: 84px; 30 | line-height: 84px; 31 | border-radius: 50%; 32 | background-color: #795376; 33 | display: inline-block; 34 | position: absolute; 35 | left: 0; 36 | right: 0; 37 | margin: 0 auto; 38 | top: 41%; 39 | @media #{$small_mobile}{ 40 | height: 50px; 41 | width: 50px; 42 | line-height: 50px; 43 | } 44 | &:after{ 45 | position: absolute; 46 | content: ""; 47 | width: 14px; 48 | height: 18px; 49 | background-color: $white; 50 | left: 0; 51 | right: 0; 52 | margin: 0 auto; 53 | top: 41%; 54 | clip-path: polygon(100% 50%, 0 0, 0 100%); 55 | @media #{$small_mobile}{ 56 | top: 32%; 57 | } 58 | } 59 | } 60 | } 61 | /************ about_us css end ***************/ 62 | -------------------------------------------------------------------------------- /static/assets/scss/_best_seller.scss: -------------------------------------------------------------------------------- 1 | /***************** product list css *******************/ 2 | .best_seller{ 3 | .single_product_item{ 4 | border-radius: 5px; 5 | margin-bottom: 20px; 6 | @include transform_time(0.5s); 7 | .single_product_text{ 8 | padding: 35px 0 0; 9 | background-color: $white_color; 10 | @include transform_time(0.5s); 11 | h4{ 12 | font-weight: 700; 13 | font-size: 18px; 14 | margin-bottom: 14px; 15 | } 16 | h3{ 17 | font-weight: 300; 18 | font-size: 18px; 19 | } 20 | a{ 21 | color: $primary_color; 22 | text-transform: uppercase; 23 | font-size: 18px; 24 | font-weight: 500; 25 | display: block; 26 | margin-top: 10px; 27 | opacity: 0; 28 | visibility: hidden; 29 | @include transform_time(0.5s); 30 | i{ 31 | float: right; 32 | font-size: 18px; 33 | line-height: 26px; 34 | color: $black_color; 35 | } 36 | } 37 | } 38 | &:hover{ 39 | box-shadow: none; 40 | .single_product_text{ 41 | padding: 32px 0 0; 42 | } 43 | 44 | a{ 45 | opacity: 1; 46 | visibility: visible; 47 | } 48 | } 49 | } 50 | 51 | } -------------------------------------------------------------------------------- /static/assets/scss/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | 2 | .breadcrumb_part { 3 | height: 350px; 4 | display: flex; 5 | align-items: center; 6 | justify-content: center; 7 | background-color: #B08EAD; 8 | .breadcrumb_iner { 9 | text-align: center; 10 | h2 { 11 | font-size: 50px; 12 | line-height: 1.2; 13 | color: $white; 14 | font-weight: 500; 15 | text-transform: capitalize; 16 | @media #{$tab}{ 17 | font-size: 30px; 18 | } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /static/assets/scss/_client_logo.scss: -------------------------------------------------------------------------------- 1 | /******************* client_logo *****************/ 2 | .client_logo{ 3 | .single_client_logo{ 4 | height: 125px; 5 | text-align: center; 6 | display: flex; 7 | align-items: center; 8 | justify-content: center; 9 | border-left: 1px solid $border_color; 10 | width: 20%; 11 | float: left; 12 | border-bottom: 1px solid $border_color; 13 | 14 | @media #{$small_mobile}{ 15 | height: 70px; 16 | width: 25%; 17 | padding: 6px; 18 | border-bottom: 0px solid transparent; 19 | border-left: 0px solid transparent; 20 | } 21 | @media #{$large_mobile}{ 22 | height: 100px; 23 | padding: 8px; 24 | } 25 | @media #{$tab_device}{ 26 | height: 100px; 27 | padding: 10px; 28 | } 29 | @media #{$medium_device}{ 30 | 31 | } 32 | 33 | &:nth-child(5n+1){ 34 | border-left: 0px solid transparent; 35 | } 36 | &:nth-child(n+6){ 37 | border-bottom: 0px solid transparent; 38 | } 39 | @media #{$small_mobile}{ 40 | 41 | } 42 | @media #{$large_mobile}{ 43 | 44 | } 45 | @media #{$tab_device}{ 46 | 47 | } 48 | @media #{$medium_device}{ 49 | 50 | } 51 | img{ 52 | filter: grayscale(1); 53 | @include transform_time(0.5s); 54 | &:hover{ 55 | filter: grayscale(0); 56 | } 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /static/assets/scss/_color.scss: -------------------------------------------------------------------------------- 1 | 2 | /*------------- Color variabel --------------*/ 3 | 4 | //Colors 5 | $white: #ffffff; 6 | $black: #16161a; 7 | $gray:#f7f7fd; 8 | 9 | // font-color 10 | $heading-color:#002d5b; 11 | 12 | //Theme color 13 | $theme-color: #ff003c; 14 | $theme-color2: #222222; 15 | $theme-color3: #f27420; 16 | $theme-color4: #ff3500; 17 | 18 | 19 | $body-text-color: #555; 20 | $hr-border-color:#eceff8; 21 | 22 | // btn and Section color 23 | 24 | $btn_bg: #2577fd; 25 | $btn_bg2: #161616; 26 | 27 | $btn_hover: #dca73a; 28 | $section_bg: #f7f7f7; 29 | $section_bg_1: #454545; 30 | $heading_color: #191d34; 31 | $heading_color2: #ff8b23; 32 | 33 | 34 | 35 | 36 | 37 | .white-bg{ 38 | background: #ffffff; 39 | } 40 | .gray-bg{ 41 | background: #f5f5f5; 42 | } 43 | 44 | $gray-color: #bebebe; 45 | $gray-color-2: #bdbdbd; 46 | 47 | 48 | 49 | $gray-color3:#5c5c5c; 50 | $white_color:#fff; 51 | 52 | 53 | // font color 54 | $font_color1: #506172; 55 | 56 | $border_color: #fdcb9e; 57 | $footer_bg: #303030; 58 | $sidebar_bg: #fbf9ff; 59 | 60 | 61 | 62 | 63 | // bg 64 | $brand-bg: #f1f4fa; 65 | $testimonial-bg:#f9fafc; 66 | 67 | 68 | // Soft color 69 | $black-soft:#7e7e7e; 70 | 71 | // Section Bg color 72 | $blue-bg1:#00163e; 73 | 74 | 75 | 76 | 77 | /*-------------Color include--------------*/ 78 | 79 | 80 | /*-- Background color---*/ 81 | 82 | .gray-bg { 83 | background: $gray; 84 | } 85 | .white-bg { 86 | background:$white; 87 | } 88 | .black-bg { 89 | background: $black; 90 | } 91 | .theme-bg { 92 | background:$theme-color; 93 | } 94 | .brand-bg{ 95 | background: $brand-bg; 96 | } 97 | .testimonial-bg{ 98 | background: $testimonial-bg; 99 | } 100 | 101 | 102 | /*--- color------*/ 103 | .white-color { 104 | color: $white; 105 | } 106 | .black-color { 107 | color: $black; 108 | } 109 | .theme-color { 110 | color: $theme-color; 111 | } -------------------------------------------------------------------------------- /static/assets/scss/_copyright_part.scss: -------------------------------------------------------------------------------- 1 | /**************** copyright part css start ****************/ 2 | .copyright_part{ 3 | background-color: $footer_bg; 4 | padding: 26px 0px; 5 | p{ 6 | color: #8a8a8a; 7 | font-family: 300; 8 | } 9 | a{ 10 | color: $btn_bg; 11 | } 12 | .footer-social{ 13 | @media #{$small_mobile}{ 14 | margin-top: 20px; 15 | } 16 | @media #{$large_mobile}{ 17 | 18 | } 19 | @media #{$tab_device}{ 20 | 21 | } 22 | @media #{$medium_device}{ 23 | 24 | } 25 | a{ 26 | width: 35px; 27 | height: 35px; 28 | display: inline-block; 29 | line-height: 35px; 30 | border: 1px solid #ff7e5f; 31 | text-align: center; 32 | margin-left: 10px; 33 | color: $white_color; 34 | 35 | &:hover{ 36 | background-color: #ff7e5f !important; 37 | color: $white_color !important; 38 | } 39 | i{ 40 | &:hover{ 41 | color: $white_color; 42 | } 43 | } 44 | } 45 | } 46 | @media #{$small_mobile}{ 47 | .footer-text{ 48 | text-align: center; 49 | } 50 | } 51 | @media #{$large_mobile}{ 52 | .footer-text{ 53 | text-align: center; 54 | margin-bottom: 25px !important; 55 | } 56 | } 57 | @media #{$tab_device}{ 58 | .footer-text{ 59 | text-align: center; 60 | margin-bottom: 25px !important; 61 | } 62 | } 63 | @media #{$medium_device}{ 64 | } 65 | span.ti-heart { 66 | font-size: 12px; 67 | margin: 0px 2px; 68 | } 69 | } -------------------------------------------------------------------------------- /static/assets/scss/_cta_part.scss: -------------------------------------------------------------------------------- 1 | /************** cta part css ****************/ 2 | .cta_part{ 3 | @include background("../img/cta_bg.png"); 4 | h2{ 5 | font-size: 45px; 6 | color: $white_color; 7 | margin-bottom: 30px; 8 | 9 | @media #{$tab}{ 10 | font-size: 30px; 11 | margin-bottom: 20px; 12 | } 13 | @media #{$small_mobile}{ 14 | font-size: 25px; 15 | margin-bottom: 15px; 16 | } 17 | @media #{$medium_device}{ 18 | font-size: 35px; 19 | margin-bottom: 15px; 20 | } 21 | } 22 | p{ 23 | color: $white_color; 24 | font-size: 18px; 25 | margin-bottom: 50px; 26 | @media #{$tab}{ 27 | margin-bottom: 20px; 28 | } 29 | @media #{$small_mobile}{ 30 | margin-bottom: 15px; 31 | } 32 | @media #{$medium_device}{ 33 | margin-bottom: 30px; 34 | } 35 | } 36 | .banner_btn_1{ 37 | color: $btn_bg; 38 | border: 0px solid transparent; 39 | margin-right: 28px; 40 | &:hover{ 41 | background-color: $btn_bg !important; 42 | color: $white_color; 43 | @extend %custom_btn_bg_2; 44 | } 45 | } 46 | .banner_btn_2{ 47 | color: $white_color; 48 | border: 1px solid $white_color; 49 | background-color: transparent; 50 | 51 | &:hover{ 52 | background-color: $btn_bg !important; 53 | color: $white_color; 54 | @extend %custom_btn_bg_2; 55 | border: 1px solid transparent; 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /static/assets/scss/_feature_part.scss: -------------------------------------------------------------------------------- 1 | /**************** service_part css start ****************/ 2 | .feature_part { 3 | .feature_part_tittle{ 4 | h3{ 5 | font-size: 40px; 6 | line-height: 1.5; 7 | font-weight: 500; 8 | @media #{$tab} { 9 | font-size: 25px; 10 | } 11 | @media #{$medium_device} { 12 | font-size: 30px; 13 | } 14 | } 15 | } 16 | .feature_part_content{ 17 | p{ 18 | color: #707070; 19 | } 20 | } 21 | .single_feature_part{ 22 | text-align: center; 23 | border: 1px solid $text-color; 24 | padding: 35px; 25 | margin-top: 100px; 26 | @media #{$tab} { 27 | margin-top: 30px; 28 | padding: 25px; 29 | } 30 | @media #{$medium_device} { 31 | padding: 25px 14px; 32 | } 33 | @media #{$medium_device} { 34 | margin-top: 30px; 35 | } 36 | img{ 37 | max-width: 42px; 38 | min-height: 40px; 39 | margin-bottom: 20px; 40 | } 41 | h4{ 42 | font-size: 18px; 43 | font-weight: 400; 44 | line-height: 1.5; 45 | margin-bottom: 0; 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /static/assets/scss/_overlay.scss: -------------------------------------------------------------------------------- 1 | /*-- 2 | - Overlay 3 | ------------------------------------------*/ 4 | [data-overlay] { 5 | position: relative; 6 | background-size: cover; 7 | background-repeat: no-repeat; 8 | background-position: center center; 9 | &::before { 10 | position: absolute; 11 | left: 0; 12 | top: 0; 13 | right: 0; 14 | bottom: 0; 15 | content: ""; 16 | } 17 | } 18 | 19 | 20 | /*-- Overlay Opacity --*/ 21 | [data-opacity="1"] { 22 | &::before { 23 | opacity: 0.1; 24 | } 25 | } 26 | [data-opacity="2"] { 27 | &::before { 28 | opacity: 0.2; 29 | } 30 | } 31 | [data-opacity="3"] { 32 | &::before { 33 | opacity: 0.3; 34 | } 35 | } 36 | [data-opacity="4"] { 37 | &::before { 38 | opacity: 0.4; 39 | } 40 | } 41 | [data-opacity="5"] { 42 | &::before { 43 | opacity: 0.5; 44 | } 45 | } 46 | [data-opacity="6"] { 47 | &::before { 48 | opacity: 0.6; 49 | } 50 | } 51 | [data-opacity="7"] { 52 | &::before { 53 | opacity: 0.7; 54 | } 55 | } 56 | [data-opacity="8"] { 57 | &::before { 58 | opacity: 0.8; 59 | } 60 | } 61 | [data-opacity="9"] { 62 | &::before { 63 | opacity: 0.9; 64 | } 65 | } 66 | 67 | 68 | -------------------------------------------------------------------------------- /static/assets/scss/_product_list.scss: -------------------------------------------------------------------------------- 1 | /***************** product list css *******************/ 2 | .product_sidebar{ 3 | .single_sedebar{ 4 | position: relative; 5 | margin-bottom: 20px; 6 | input{ 7 | background-color: #F4EDF2; 8 | border-radius: 50px; 9 | border: 1px solid #F4EDF2; 10 | padding: 13px 25px; 11 | width: 100%; 12 | line-height: 22px; 13 | } 14 | ::placeholder{ 15 | color: #795376; 16 | } 17 | i{ 18 | position: absolute; 19 | right: 30px; 20 | top: 17px; 21 | } 22 | } 23 | } 24 | .select_option{ 25 | .select_option_list{ 26 | background-color: #F4EDF2; 27 | border-radius: 50px; 28 | border: 1px solid #F4EDF2; 29 | padding: 13px 25px; 30 | width: 100%; 31 | line-height: 22px; 32 | color: #795376; 33 | } 34 | .select_option_dropdown{ 35 | background-color: #F4EDF2; 36 | border-radius: 10px; 37 | border: 1px solid #F4EDF2; 38 | padding: 13px 25px; 39 | width: 100%; 40 | margin-top: 10px; 41 | a{ 42 | color: #795376; 43 | 44 | } 45 | } 46 | } 47 | .product_list{ 48 | 49 | } -------------------------------------------------------------------------------- /static/assets/scss/_recent.scss: -------------------------------------------------------------------------------- 1 | .recent-area{ 2 | .single-recent-cap{ 3 | .recent-img{ 4 | overflow: hidden; 5 | & img{ 6 | width: 100%; 7 | transform: scale(1); 8 | @include transition(.5s); 9 | } 10 | } 11 | .recent-cap{ 12 | padding: 20px 30px 20px 30px; 13 | background: #fcfdff; 14 | & span{ 15 | color: $theme_color; 16 | font-size: 14px; 17 | margin-bottom: 20px; 18 | display: block; 19 | } 20 | & h4{ 21 | & a{ 22 | color: $heading-color; 23 | font-size: 20px; 24 | margin-bottom: 20px; 25 | font-weight: 500px; 26 | &:hover{ 27 | color: $theme_color; 28 | } 29 | } 30 | 31 | } 32 | p{ 33 | color: #aebccb; 34 | font-size: 14px; 35 | } 36 | } 37 | } 38 | } 39 | 40 | .single-recent-cap:hover .recent-img img{ 41 | transform: scale(1.1); 42 | } -------------------------------------------------------------------------------- /static/assets/scss/_services.scss: -------------------------------------------------------------------------------- 1 | // Hero 2 | .hero-caption{ 3 | & span{ 4 | color: #fff; 5 | font-size: 16px; 6 | display: block; 7 | margin-bottom: 24px; 8 | font-weight: 600; 9 | padding-left: 95px; 10 | position: relative; 11 | &::before{ 12 | position: absolute; 13 | content: ""; 14 | width: 75px; 15 | height: 3px; 16 | background:$theme-color; 17 | left: 0; 18 | top: 52%; 19 | transform: translateY(-50%); 20 | } 21 | } 22 | & h2{ 23 | color: #fff; 24 | font-size: 50px; 25 | font-weight: 700; 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /static/assets/scss/_shipping_details.scss: -------------------------------------------------------------------------------- 1 | /************ shipping details css here **************/ 2 | .shipping_details{ 3 | background-color: $white_color; 4 | .single_shopping_details{ 5 | @media #{$tab}{ 6 | margin-bottom: 30px; 7 | } 8 | i, span{ 9 | font-size: 45px; 10 | } 11 | img{ 12 | max-width: 48px; 13 | } 14 | h4{ 15 | font-size: 20px; 16 | font-weight: 700; 17 | margin: 34px 0 10px; 18 | @media #{$tab}{ 19 | margin: 15px 0 5px; 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /static/assets/scss/_single_blog.scss: -------------------------------------------------------------------------------- 1 | 2 | .single_blog_post{ 3 | .desc{ 4 | a{ 5 | font-size: 16px; 6 | color: #232b2b !important; 7 | } 8 | } 9 | .single_blog{ 10 | .single_appartment_content{ 11 | padding: 38px 38px 23px; 12 | border: 0px solid $border_color; 13 | box-shadow: 0px 10px 20px 0px rgba(221, 221, 221, 0.3); 14 | p{ 15 | font-size: 12px; 16 | text-transform: uppercase; 17 | margin-bottom: 20px; 18 | a{ 19 | color: $btn_bg; 20 | } 21 | } 22 | h4{ 23 | font-size: 24px; 24 | font-weight: 600; 25 | line-height: 1.481; 26 | margin-bottom: 16px; 27 | } 28 | h5{ 29 | font-size: 15px; 30 | color: $font_4; 31 | font-weight: 400; 32 | } 33 | .list-unstyled{ 34 | margin-top: 33px; 35 | li{ 36 | display: inline; 37 | margin-right: 17px; 38 | color: $font_5; 39 | a{ 40 | margin-right: 8px; 41 | color: $font_5; 42 | } 43 | } 44 | } 45 | } 46 | } 47 | } 48 | @media #{$small_mobile}{ 49 | 50 | } 51 | @media #{$large_mobile}{ 52 | 53 | } 54 | -------------------------------------------------------------------------------- /static/assets/scss/_subscribe_part.scss: -------------------------------------------------------------------------------- 1 | .subscribe_part{ 2 | background-color: $heading_color; 3 | .subscribe_part_content{ 4 | text-align: center; 5 | h2{ 6 | color: $white; 7 | @media #{$tab} { 8 | font-size: 25px; 9 | } 10 | @media #{$medium_device} { 11 | font-size: 30px; 12 | } 13 | } 14 | p{ 15 | color: $white; 16 | } 17 | } 18 | .subscribe_form{ 19 | margin: 0 auto; 20 | margin-top: 45px; 21 | position: relative; 22 | max-width: 558px; 23 | input{ 24 | border: 1px solid $white; 25 | width: 100%; 26 | background-color: transparent; 27 | color: $white; 28 | border-radius: 50px; 29 | padding: 19px 30px; 30 | line-height: 20px; 31 | } 32 | .btn_1{ 33 | padding: 15px 30px; 34 | line-height: 16px; 35 | border-radius: 50px; 36 | position: absolute; 37 | right: 5px; 38 | top: 5px; 39 | @media #{$tab} { 40 | padding: 15px 15px; 41 | } 42 | } 43 | ::placeholder{ 44 | color: #E4D3DF; 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /static/assets/scss/_trending_items.scss: -------------------------------------------------------------------------------- 1 | .trending_items{ 2 | background-color: #F4EDF2; 3 | padding: 200px 0 130px; 4 | @media #{$tab}{ 5 | padding: 70px 0 40px; 6 | } 7 | @media #{$medium_device}{ 8 | padding: 100px 0 70px; 9 | } 10 | 11 | } 12 | .single_product_item{ 13 | margin-bottom: 58px; 14 | @media #{$tab}{ 15 | margin-bottom: 30px; 16 | } 17 | @media #{$medium_device}{ 18 | margin-bottom: 30px; 19 | } 20 | .single_product_item_thumb{ 21 | background-color: $white; 22 | margin: 0 auto; 23 | text-align: center; 24 | } 25 | h3{ 26 | font-size: 24px; 27 | font-weight: 400; 28 | margin-top: 22px; 29 | line-height: 1.5; 30 | margin-bottom: 25px; 31 | font-family: $font_2; 32 | @media #{$tab}{ 33 | font-size: 18px; 34 | } 35 | @media #{$medium_device}{ 36 | font-size: 18px; 37 | } 38 | a{ 39 | color: $heading_color; 40 | &:hover{ 41 | color: $primary-color; 42 | } 43 | } 44 | } 45 | p{ 46 | font-size: 20px; 47 | @media #{$tab}{ 48 | font-size: 16px; 49 | } 50 | @media #{$medium_device}{ 51 | font-size: 16px; 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /static/assets/scss/style.scss: -------------------------------------------------------------------------------- 1 | /* Theme Description 2 | ------------------------------------------------- 3 | 4 | Theme Name: 5 | Author: 6 | Support: 7 | Description: 8 | Version: 9 | 10 | ------------------------------------------------- 11 | */ 12 | 13 | /* CSS Index 14 | ------------------------------------------------- 15 | 16 | 1. Theme default css 17 | 2. header 18 | 3. slider 19 | 4. about-area 20 | 5. features-box 21 | 6. department 22 | 7. team 23 | 8. video-area 24 | 9. counter 25 | 10. footer 26 | 27 | ------------------------------------------------- 28 | */ 29 | 30 | // Defult 31 | @import 'variables'; 32 | @import 'mixins'; 33 | @import 'overlay'; 34 | @import 'common'; 35 | @import 'color'; 36 | 37 | 38 | // Homepage1 39 | @import 'headerMenu'; 40 | @import 'h1-hero'; 41 | @import 'category'; 42 | @import 'latest_products'; 43 | @import 'best-product'; 44 | @import 'footer'; 45 | 46 | // inner Page 47 | @import 'services'; 48 | 49 | 50 | // Deful Element Page 51 | @import 'blog_page'; 52 | @import 'contact'; 53 | @import 'bradcam'; 54 | @import 'extend'; 55 | @import 'elements'; 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | // ------------include Inner page------------------- 64 | // mixin scss 65 | // @import "extends"; 66 | // button scss 67 | @import "button"; 68 | @import "blog"; 69 | @import "single_blog"; 70 | // body scss 71 | //@import "menu"; 72 | // @import "banner"; 73 | @import "single_product"; 74 | @import "trending_items"; 75 | @import "client_review"; 76 | @import "feature_part"; 77 | @import "subscribe_part"; 78 | @import "product_list"; 79 | 80 | @import "our_offer"; 81 | @import "best_seller"; 82 | @import "client_logo"; 83 | @import "product"; 84 | @import "new_arrival"; 85 | @import "shipping_details"; 86 | @import "instagram_photo"; 87 | @import "confirmation_part"; 88 | 89 | @import "blog_part"; 90 | @import "about_us"; 91 | 92 | // breadcrumb scss 93 | @import "breadcrumb"; 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /static/assets/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /static/assets/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /static/assets/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /static/assets/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /static/assets/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /static/assets/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /static/assets/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /static/assets/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /static/assets/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /static/assets/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /static/assets/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /static/assets/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/static/assets/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /vendor/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/vendor/__init__.py -------------------------------------------------------------------------------- /vendor/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Vendor 3 | 4 | admin.site.register(Vendor) 5 | -------------------------------------------------------------------------------- /vendor/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class VendorConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'vendor' 7 | -------------------------------------------------------------------------------- /vendor/decorators.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import REDIRECT_FIELD_NAME 2 | from django.contrib.auth.decorators import user_passes_test 3 | 4 | 5 | def vendor_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='vendor_sign_up'): 6 | """ 7 | Decorator for views that checks that the logged in user is a vendor, 8 | redirects to the log-in page if necessary. 9 | """ 10 | actual_decorator = user_passes_test( 11 | lambda u: u.is_active and u.is_vendor, 12 | login_url=login_url, 13 | redirect_field_name=redirect_field_name 14 | ) 15 | if function: 16 | return actual_decorator(function) 17 | return actual_decorator 18 | -------------------------------------------------------------------------------- /vendor/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-29 19:36 2 | 3 | import cloudinary.models 4 | from django.conf import settings 5 | import django.core.validators 6 | from django.db import migrations, models 7 | import django.db.models.deletion 8 | import django.utils.timezone 9 | 10 | 11 | class Migration(migrations.Migration): 12 | 13 | initial = True 14 | 15 | dependencies = [ 16 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 17 | ] 18 | 19 | operations = [ 20 | migrations.CreateModel( 21 | name='Vendor', 22 | fields=[ 23 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 24 | ('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)), 25 | ('updated_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)), 26 | ('vendor_name', models.CharField(max_length=100)), 27 | ('shop_logo', cloudinary.models.CloudinaryField(max_length=255, verbose_name='logo')), 28 | ('owner_name', models.CharField(max_length=100, null=True)), 29 | ('nid_number', models.CharField(max_length=100, null=True)), 30 | ('mobile_number', models.CharField(max_length=17, null=True, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+8801234233566'. Up to 11 digits allowed.", regex='^\\+?880?\\d{9,11}$')])), 31 | ('email', models.EmailField(max_length=254)), 32 | ('address', models.TextField(null=True)), 33 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 34 | ], 35 | options={ 36 | 'verbose_name_plural': 'Vendors', 37 | }, 38 | ), 39 | ] 40 | -------------------------------------------------------------------------------- /vendor/migrations/0002_auto_20210904_1157.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-04 05:57 2 | 3 | import cloudinary.models 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | import django.db.models.deletion 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 13 | ('vendor', '0001_initial'), 14 | ] 15 | 16 | operations = [ 17 | migrations.AlterField( 18 | model_name='vendor', 19 | name='shop_logo', 20 | field=cloudinary.models.CloudinaryField(blank=True, max_length=255, null=True, verbose_name='logo'), 21 | ), 22 | migrations.AlterField( 23 | model_name='vendor', 24 | name='user', 25 | field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /vendor/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/vendor/migrations/__init__.py -------------------------------------------------------------------------------- /vendor/models.py: -------------------------------------------------------------------------------- 1 | from cloudinary.models import CloudinaryField 2 | 3 | from customers.models import User 4 | from django.core.validators import RegexValidator 5 | from django.db import models 6 | from model.common_fields import BaseModel 7 | 8 | 9 | class Vendor(BaseModel): 10 | """Vendor model for storing vendor information""" 11 | 12 | user = models.OneToOneField( 13 | User, on_delete=models.CASCADE, null=True, blank=True) 14 | vendor_name = models.CharField(max_length=100) 15 | shop_logo = CloudinaryField('logo', null=True, blank=True) 16 | owner_name = models.CharField(max_length=100, null=True) 17 | nid_number = models.CharField(max_length=100, null=True) 18 | phone_regex = RegexValidator( 19 | regex=r'^\+?880?\d{9,11}$', message="Phone number must be entered in the format: '+8801234233566'. Up to 11 digits allowed.") 20 | mobile_number = models.CharField( 21 | validators=[phone_regex], max_length=17, null=True) 22 | 23 | email = models.EmailField() 24 | 25 | address = models.TextField(null=True) 26 | 27 | def __str__(self): 28 | return f'{self.vendor_name}' 29 | 30 | class Meta: 31 | verbose_name_plural = "Vendors" 32 | -------------------------------------------------------------------------------- /vendor/templates/vendor/add_product_form.html: -------------------------------------------------------------------------------- 1 | {% extends 'vendor/_base.html' %} 2 | {% load crispy_forms_tags %} 3 | {% block content %} 4 | {% if messages.success %} 5 | {% for message in messages %} 6 |
{{ message }}
7 | {% endfor %} 8 | {% else %} 9 | {% for message in messages %} 10 |
{{ message }}
11 | {% endfor %} 12 | {% endif %} 13 |
14 |
15 |
16 |
17 | {{ form|crispy }} {% csrf_token %} 18 |
19 |
20 | 21 | 22 |
23 |
24 |
25 |
26 |
27 | {% endblock %} 28 | -------------------------------------------------------------------------------- /vendor/templates/vendor/edit_product_form.html: -------------------------------------------------------------------------------- 1 | {% extends 'vendor/_base.html' %} 2 | {% load crispy_forms_tags %} 3 | {% block content %} 4 |
5 |
6 |
7 |
8 | {{ form|crispy }} {% csrf_token %} 9 |
10 |
11 | 12 | 13 |
14 |
15 |
16 |
17 |
18 | {% endblock %} -------------------------------------------------------------------------------- /vendor/templates/vendor/mail/welcome_email.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 36 | 37 | 38 |
19 |

Hi {{user.full_name}},

20 | Thank you for registering with the Lomofy. We appreciate your interest in Lomofy!

21 |

22 |

23 | 24 | Continue Shopping 25 |

26 |

We can control our finances, you will know how much you spend, you have more control over money and a smaller saving problem.

27 |

28 | Thank you, 29 |
The Lomofy Team 30 |
31 |
32 | {{ request.headers.user_agent }} 33 |

**This is an automated message**

34 |

35 |
39 |
40 | 41 | -------------------------------------------------------------------------------- /vendor/templates/vendor/sign_out.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /vendor/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/vendor/test/__init__.py -------------------------------------------------------------------------------- /vendor/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import views as auth_views 2 | from django.urls import path 3 | 4 | from .views import home_views, product_views, sign_in_views, sign_up_views 5 | 6 | app_name = 'vendor' 7 | 8 | urlpatterns = [ 9 | # root_path 10 | path('', home_views.home, name='root_path'), 11 | # auth_path 12 | path('sell-on-lomofy', sign_up_views.VendorSignUpView, name='vendor_sign_up'), 13 | path('sign-in', sign_in_views.SignInView.as_view(), name='vendor_sign_in'), 14 | path( 15 | "sign-out", 16 | auth_views.LogoutView.as_view(template_name="vendor/sign_out.html"), 17 | name="vendor_sign_out", 18 | ), 19 | 20 | # Product management urls 21 | path('add-product', product_views.create_product_view, name='add_product'), 22 | path('edit/', product_views.edit_product_view, name='edit_product'), 23 | ] 24 | -------------------------------------------------------------------------------- /vendor/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/vendor/utils/__init__.py -------------------------------------------------------------------------------- /vendor/utils/service.py: -------------------------------------------------------------------------------- 1 | import threading 2 | 3 | from django.conf import settings 4 | from django.contrib.sites.shortcuts import get_current_site 5 | from django.core.mail import EmailMessage 6 | from django.template.loader import render_to_string 7 | 8 | 9 | class EmailThread(threading.Thread): 10 | ''' Thread to send email in background. ''' 11 | 12 | def __init__(self, mail): 13 | self.mail = mail 14 | threading.Thread.__init__(self) 15 | 16 | def run(self): 17 | try: 18 | self.mail.send() 19 | except Exception as e: 20 | print('Error sending email: %s' % e) 21 | 22 | 23 | def send_welcome_mail(request, user): 24 | ''' Send welcome mail to vendor. ''' 25 | current_site = get_current_site(request) 26 | 27 | body = render_to_string("vendor/mail/welcome_email.html", 28 | {'current_site': request.META['HTTP_USER_AGENT'], 'domain': current_site.domain, 'user': request.user.vendor}) 29 | 30 | mail = EmailMessage( 31 | subject="Welcome to Lomofy!", 32 | body=body, 33 | from_email=settings.EMAIL_HOST_USER, 34 | to=[request.user.vendor.email], 35 | ) 36 | mail.content_subtype = "HTML" 37 | mail.send() 38 | return None 39 | -------------------------------------------------------------------------------- /vendor/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/vendor/views/__init__.py -------------------------------------------------------------------------------- /vendor/views/home_views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import redirect, render 2 | 3 | 4 | def home(request): 5 | return render(request, 'vendor/home.html') -------------------------------------------------------------------------------- /vendor/views/product_views.py: -------------------------------------------------------------------------------- 1 | from customers.models import User 2 | from django.contrib.auth import login 3 | from django.shortcuts import redirect, render 4 | from django.views.generic import CreateView 5 | from product.models import Product 6 | from vendor.decorators import vendor_required 7 | from vendor.forms import ProductForm 8 | from vendor.models import Vendor 9 | 10 | 11 | @vendor_required 12 | def create_product_view(request): 13 | """Add a product to the vendor's product list.""" 14 | if request.method == 'POST': 15 | form = ProductForm(request.POST, request.FILES) 16 | if form.is_valid(): 17 | product = form.save(commit=False) 18 | product.created_by = Vendor.objects.get(user=request.user) 19 | product.save() 20 | return redirect('vendor:root_path') 21 | else: 22 | form = ProductForm() 23 | return render(request, 'vendor/add_product_form.html', {'form': form}) 24 | 25 | 26 | @vendor_required 27 | def edit_product_view(request, product_id): 28 | """Edit a product in the vendor's product list.""" 29 | product = Product.objects.get(id=product_id) 30 | if request.method == 'POST': 31 | form = ProductForm(request.POST, request.FILES, instance=product) 32 | if form.is_valid(): 33 | product = form.save(commit=False) 34 | product.created_by = Vendor.objects.get(user=request.user) 35 | product.save() 36 | return redirect('vendor:root_path') 37 | else: 38 | form = ProductForm(instance=product) 39 | return render(request, 'vendor/edit_product_form.html', {'form': form}) 40 | -------------------------------------------------------------------------------- /vendor/views/sign_in_views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.views import LoginView 2 | from django.contrib.auth.forms import AuthenticationForm 3 | 4 | 5 | class SignInView(LoginView): 6 | ''' Sign in for vendor ''' 7 | form_class = AuthenticationForm 8 | template_name = 'vendor/sign_in.html' 9 | redirect_field_name = 'vendor:root_path' 10 | success_url = 'vendor:root_path' 11 | -------------------------------------------------------------------------------- /vendor/views/sign_up_views.py: -------------------------------------------------------------------------------- 1 | from django.contrib import messages 2 | from django.contrib.auth import authenticate, login 3 | from django.shortcuts import redirect, render 4 | from vendor.forms import VendorSignUpForm 5 | from vendor.utils import service 6 | 7 | 8 | def VendorSignUpView(request): 9 | ''' Sign up a new vendor ''' 10 | if request.method == 'POST': 11 | form = VendorSignUpForm(request.POST, request.FILES) 12 | if form.is_valid(): 13 | form.save() 14 | user = authenticate(email=form.cleaned_data['email'], password=form.cleaned_data['password1']) 15 | ''' 16 | auto sign in after sign up 17 | ''' 18 | login(request, user) 19 | messages.success(request, f'Account has been successfully created as {request.user.vendor.email} ') 20 | service.send_welcome_mail(request, request.user.vendor.email) 21 | return redirect('vendor:root_path') 22 | else: 23 | form = VendorSignUpForm() 24 | return render(request, 'vendor/sign_up.html', {'form': form}) 25 | -------------------------------------------------------------------------------- /wishlist/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/wishlist/__init__.py -------------------------------------------------------------------------------- /wishlist/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class WishlistConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'wishlist' 7 | -------------------------------------------------------------------------------- /wishlist/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hossainchisty/Multi-Vendor-eCommerce/94e0f52bd1ceb6823e8aac0dc42eeea27268b297/wishlist/migrations/__init__.py -------------------------------------------------------------------------------- /wishlist/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('', views.product_wishlist, name='product_wishlist'), 6 | path('', views.add_to_wishlist, name='add_to_wishlist'), 7 | ] 8 | -------------------------------------------------------------------------------- /wishlist/views.py: -------------------------------------------------------------------------------- 1 | from customers.decorators import customer_required 2 | from django.contrib import messages 3 | from django.http import HttpResponseRedirect 4 | from django.shortcuts import get_object_or_404, render 5 | from django.views.decorators.cache import cache_page 6 | from product.models import Product 7 | 8 | 9 | @cache_page(60 * 5) 10 | @customer_required 11 | def product_wishlist(request): 12 | ''' Display the products in the wishlist ''' 13 | products = Product.objects.filter(wishlist=request.user.customer) 14 | return render(request, 'wishlist/product_wishlist.html', {'products': products}) 15 | 16 | 17 | @customer_required 18 | def add_to_wishlist(request, product_id): 19 | ''' 20 | if user has already added the product to the wishlist, then remove it from the wishlist else create a new wishlist item. 21 | ''' 22 | 23 | product = get_object_or_404(Product, id=product_id) 24 | 25 | if product.wishlist.filter(id=request.user.customer.id).exists(): 26 | product.wishlist.remove(request.user.customer) 27 | messages.info(request, f'{product.title} remove form wishlist!') 28 | else: 29 | product.wishlist.add(request.user.customer) 30 | messages.success( 31 | request, f'{product.title} was added to your wishlist!') 32 | return HttpResponseRedirect(request.META.get('HTTP_REFERER')) 33 | --------------------------------------------------------------------------------