├── .coveragerc ├── .deepsource.toml ├── .github └── workflows │ └── codeql-analysis.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .runcode.yaml ├── .travis.yml ├── .vscode └── settings.json ├── Dockerfile ├── ENV.md ├── Jenkinsfile ├── LICENSE ├── MANIFEST.in ├── README.md ├── Steps ├── accounts ├── __init__.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_initial.py │ ├── 0003_alter_account_created_by.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params1.py ├── tasks.py ├── tests_celery_tasks.py ├── urls.py └── views.py ├── cases ├── __init__.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_initial.py │ ├── 0003_alter_case_created_by.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params1.py ├── tasks.py ├── tests_celery_tasks.py ├── urls.py └── views.py ├── cms ├── __init__.py ├── admin.py ├── apps.py ├── blocks.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── templatetags │ └── menus_tags.py ├── tests.py └── views.py ├── common ├── __init__.py ├── access_decorators_mixins.py ├── admin.py ├── app_urls │ └── __init__.py ├── apps.py ├── base.py ├── context_processors │ ├── __init__.py │ └── common.py ├── custom_auth.py ├── custom_openapi.py ├── external_auth.py ├── manager.py ├── middleware │ ├── __init__.py │ └── get_company.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_initial.py │ ├── 0003_alter_user_profile_pic.py │ ├── 0004_alter_profile_alternate_phone.py │ ├── 0005_org_api_key.py │ ├── 0006_alter_org_api_key.py │ ├── 0007_org_is_active.py │ ├── 0008_alter_user_managers.py │ ├── 0009_user_is_staff.py │ └── __init__.py ├── mixins.py ├── models.py ├── serializer.py ├── status.py ├── swagger-ui.html ├── swagger_params1.py ├── tasks.py ├── templates │ ├── comment_email.html │ ├── password_reset_email.html │ ├── user_delete_email.html │ ├── user_status.html │ ├── user_status_activate.html │ ├── user_status_deactivate.html │ └── user_status_in.html ├── templatetags │ ├── __init__.py │ └── common_tags.py ├── tests_celery_tasks.py ├── token_generator.py ├── urls.py ├── utils.py └── views.py ├── contacts ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_contact_created_by.py │ ├── 0003_alter_contact_secondary_number_and_more.py │ ├── 0004_alter_contact_address.py │ ├── 0005_alter_contact_address.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params1.py ├── tasks.py ├── tests_celery_tasks.py ├── urls.py └── views.py ├── crm ├── __init__.py ├── celery.py ├── server_settings.py ├── settings.py ├── urls.py └── wsgi.py ├── docker-compose.yml ├── docker ├── docker-compose.yml ├── dockerfile ├── entrypoint.sh └── wait-for-postgres.sh ├── docs ├── Makefile ├── __init__.py └── source │ ├── Accounts.rst │ ├── Cases.rst │ ├── Change Password.rst │ ├── Contacts.rst │ ├── Documents.rst │ ├── Forget Password.rst │ ├── Leads.rst │ ├── Login.rst │ ├── Opportunity.rst │ ├── Profile.rst │ ├── conf.py │ └── index.rst ├── dump.rdb ├── emails ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── serializer.py ├── templates │ ├── create_mail.html │ ├── emails.html │ ├── mail_all.html │ ├── mail_center.html │ ├── mail_drafts.html │ ├── mail_important.html │ ├── mail_sent.html │ └── mail_trash.html ├── tests.py ├── urls.py └── views.py ├── events ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params1.py ├── tasks.py ├── templates │ └── assigned_to_email_template_event.html ├── tests_celery_tasks.py ├── urls.py └── views.py ├── installation.md ├── invoices ├── __init__.py ├── admin.py ├── api_urls.py ├── api_views.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params.py ├── swagger_params1.py ├── tasks.py ├── templates │ ├── assigned_to_email_template.html │ ├── invoice_cancelled.html │ ├── invoice_create_1.html │ ├── invoice_detail_email.html │ ├── invoice_download_pdf.html │ ├── invoices_create.html │ ├── invoices_detail.html │ ├── invoices_detail_1.html │ └── invoices_list.html ├── tests.py ├── tests_celery_tasks.py ├── urls.py └── views.py ├── leads ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_lead_created_by.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params1.py ├── tasks.py ├── tests_celery_tasks.py ├── urls.py └── views.py ├── manage.py ├── opportunity ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_opportunity_created_by.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params1.py ├── tasks.py ├── tests_celery_tasks.py ├── urls.py └── views.py ├── planner ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── serializer.py ├── templates │ ├── calls.html │ ├── calls_list.html │ ├── contacts.html │ ├── dialog_models.html │ ├── events_base.html │ ├── leads.html │ ├── meetings.html │ ├── meetings_list.html │ ├── reminder.html │ ├── tasks.html │ ├── tasks_list.html │ └── users.html ├── tests.py ├── urls.py └── views.py ├── pytest.ini ├── requirements.txt ├── schema.yaml ├── schema.yml ├── scripts ├── gunicorn.sh └── migrate.sh ├── setup.py ├── static └── assets │ ├── css │ ├── animate.min.css │ ├── bootstrap.min.css │ ├── bootstrap.min.css.map │ ├── flaticon.css │ ├── fontawesome.min.css │ ├── magnific-popup.min.css │ ├── meanmenu.min.css │ ├── odometer.min.css │ ├── owl.carousel.min.css │ ├── owl.theme.default.min.css │ ├── owl.video.play.png │ ├── rangeSlider.min.css │ ├── responsive.css │ ├── responsive.css.map │ ├── responsive.scss │ ├── showMoreItems-theme.min.css │ ├── style.css │ ├── style.css.map │ └── style.scss │ ├── img │ ├── about │ │ ├── about-img1.jpg │ │ ├── about-img2.png │ │ ├── about-img3.png │ │ ├── about-img4.png │ │ ├── about-img5.png │ │ ├── about-img6.jpg │ │ └── about-img7.jpg │ ├── app-banner.png │ ├── app-download.png │ ├── apple-store.png │ ├── bg1.jpg │ ├── bg10.jpg │ ├── bg11.jpg │ ├── bg12.png │ ├── bg2.jpg │ ├── bg3.jpg │ ├── bg4.jpg │ ├── bg5.jpg │ ├── bg6.jpg │ ├── bg7.jpg │ ├── bg8.jpg │ ├── bg9.jpg │ ├── blog-banner │ │ ├── blog-banner-list1.jpg │ │ ├── blog-banner-list2.jpg │ │ ├── blog-banner-list3.jpg │ │ ├── blog-banner-list4.jpg │ │ └── blog-banner.jpg │ ├── blog │ │ ├── blog-img1.jpg │ │ ├── blog-img10.jpg │ │ ├── blog-img11.jpg │ │ ├── blog-img12.jpg │ │ ├── blog-img13.jpg │ │ ├── blog-img14.jpg │ │ ├── blog-img15.jpg │ │ ├── blog-img16.jpg │ │ ├── blog-img17.jpg │ │ ├── blog-img18.jpg │ │ ├── blog-img19.jpg │ │ ├── blog-img2.jpg │ │ ├── blog-img20.jpg │ │ ├── blog-img21.jpg │ │ ├── blog-img22.jpg │ │ ├── blog-img23.jpg │ │ ├── blog-img24.jpg │ │ ├── blog-img25.jpg │ │ ├── blog-img26.jpg │ │ ├── blog-img27.jpg │ │ ├── blog-img3.jpg │ │ ├── blog-img4.jpg │ │ ├── blog-img5.jpg │ │ ├── blog-img6.jpg │ │ ├── blog-img7.jpg │ │ ├── blog-img8.jpg │ │ └── blog-img9.jpg │ ├── business-banner.jpg │ ├── categories │ │ ├── categories-img1.jpg │ │ ├── categories-img10.jpg │ │ ├── categories-img11.jpg │ │ ├── categories-img2.jpg │ │ ├── categories-img3.jpg │ │ ├── categories-img4.jpg │ │ ├── categories-img5.jpg │ │ ├── categories-img6.jpg │ │ ├── categories-img7.jpg │ │ ├── categories-img8.jpg │ │ └── categories-img9.jpg │ ├── coming-soon.jpg │ ├── consulting-banner-bg.jpg │ ├── cta-bg1.jpg │ ├── custom-ads.jpg │ ├── error.png │ ├── facility-img.png │ ├── favicon.png │ ├── featured-video │ │ ├── featured-video1.jpg │ │ ├── featured-video2.jpg │ │ ├── featured-video3.jpg │ │ ├── featured-video4.jpg │ │ └── featured-video5.jpg │ ├── furniture-banner-bg1.jpg │ ├── furniture-banner-bg2.jpg │ ├── furniture-banner-bg3.jpg │ ├── gallery │ │ ├── gallery-img1.jpg │ │ ├── gallery-img2.jpg │ │ ├── gallery-img3.jpg │ │ ├── gallery-img4.jpg │ │ ├── gallery-img5.jpg │ │ ├── gallery-img6.jpg │ │ ├── gallery-img7.jpg │ │ ├── gallery-img8.jpg │ │ └── gallery-img9.jpg │ ├── how-it-works.png │ ├── instagram │ │ ├── instagram-img1.jpg │ │ ├── instagram-img10.jpg │ │ ├── instagram-img11.jpg │ │ ├── instagram-img12.jpg │ │ ├── instagram-img13.jpg │ │ ├── instagram-img14.jpg │ │ ├── instagram-img15.jpg │ │ ├── instagram-img16.jpg │ │ ├── instagram-img2.jpg │ │ ├── instagram-img3.jpg │ │ ├── instagram-img4.jpg │ │ ├── instagram-img5.jpg │ │ ├── instagram-img6.jpg │ │ ├── instagram-img7.jpg │ │ ├── instagram-img8.jpg │ │ └── instagram-img9.jpg │ ├── it-agency-banner-bg.jpg │ ├── latest-posts │ │ ├── latest-posts1.jpg │ │ ├── latest-posts2.jpg │ │ ├── latest-posts3.jpg │ │ ├── latest-posts4.jpg │ │ └── latest-posts5.jpg │ ├── logo-app.png │ ├── logo-blog.png │ ├── logo-business.png │ ├── logo-consulting.png │ ├── logo-it-agency.png │ ├── logo-marketing.png │ ├── logo-personal-portfolio.png │ ├── logo-shop.png │ ├── logo-startup.png │ ├── logo-white-app.png │ ├── logo-white-blog.png │ ├── logo-white-business.png │ ├── logo-white-saas.png │ ├── logo-white-shop.png │ ├── logo-white-startup.png │ ├── marketing-banner.png │ ├── page-title │ │ ├── page-title-bg-image1.jpg │ │ ├── page-title-bg-image2.jpg │ │ ├── page-title-bg-image3.jpg │ │ ├── page-title-bg-image4.jpg │ │ ├── page-title-bg-image5.jpg │ │ ├── page-title-bg1.jpg │ │ ├── page-title-bg2.jpg │ │ ├── page-title-bg3.jpg │ │ ├── page-title-bg4.jpg │ │ └── page-title-bg5.jpg │ ├── partner │ │ ├── partner-white1.png │ │ ├── partner-white2.png │ │ ├── partner-white3.png │ │ ├── partner-white4.png │ │ ├── partner-white5.png │ │ ├── partner-white6.png │ │ ├── partner1.png │ │ ├── partner2.png │ │ ├── partner3.png │ │ ├── partner4.png │ │ ├── partner5.png │ │ └── partner6.png │ ├── personal-portfolio-banner.jpg │ ├── play-store.png │ ├── portfolio │ │ ├── portfolio-img1.jpg │ │ ├── portfolio-img10.jpg │ │ ├── portfolio-img11.jpg │ │ ├── portfolio-img12.jpg │ │ ├── portfolio-img2.jpg │ │ ├── portfolio-img3.jpg │ │ ├── portfolio-img4.jpg │ │ ├── portfolio-img5.jpg │ │ ├── portfolio-img6.jpg │ │ ├── portfolio-img7.jpg │ │ ├── portfolio-img8.jpg │ │ └── portfolio-img9.jpg │ ├── process │ │ ├── process1.png │ │ ├── process2.png │ │ └── process3.png │ ├── products │ │ ├── products-img1.jpg │ │ ├── products-img10.jpg │ │ ├── products-img11.jpg │ │ ├── products-img12.jpg │ │ ├── products-img13.jpg │ │ ├── products-img14.jpg │ │ ├── products-img15.jpg │ │ ├── products-img16.jpg │ │ ├── products-img17.jpg │ │ ├── products-img18.jpg │ │ ├── products-img19.jpg │ │ ├── products-img2.jpg │ │ ├── products-img20.jpg │ │ ├── products-img3.jpg │ │ ├── products-img4.jpg │ │ ├── products-img5.jpg │ │ ├── products-img6.jpg │ │ ├── products-img7.jpg │ │ ├── products-img8.jpg │ │ └── products-img9.jpg │ ├── saas-banner.png │ ├── screenshot │ │ ├── frame.png │ │ ├── screenshot1.png │ │ ├── screenshot2.png │ │ ├── screenshot3.png │ │ ├── screenshot4.png │ │ └── screenshot5.png │ ├── services │ │ ├── services-img1.jpg │ │ ├── services-img10.png │ │ ├── services-img11.png │ │ ├── services-img12.png │ │ ├── services-img13.jpg │ │ ├── services-img14.jpg │ │ ├── services-img15.jpg │ │ ├── services-img16.jpg │ │ ├── services-img17.jpg │ │ ├── services-img18.jpg │ │ ├── services-img2.jpg │ │ ├── services-img3.jpg │ │ ├── services-img4.jpg │ │ ├── services-img5.jpg │ │ ├── services-img6.jpg │ │ ├── services-img7.png │ │ ├── services-img8.png │ │ └── services-img9.png │ ├── shape │ │ ├── border.png │ │ ├── border2.png │ │ ├── shape1.png │ │ ├── shape10.png │ │ ├── shape11.png │ │ ├── shape12.png │ │ ├── shape13.png │ │ ├── shape14.png │ │ ├── shape15.png │ │ ├── shape16.png │ │ ├── shape17.png │ │ ├── shape18.png │ │ ├── shape19.png │ │ ├── shape2.png │ │ ├── shape3.png │ │ ├── shape4.png │ │ ├── shape5.png │ │ ├── shape6.png │ │ ├── shape7.png │ │ ├── shape8.png │ │ └── shape9.png │ ├── shop-banner-bg.jpg │ ├── signature.png │ ├── skills │ │ ├── skills-img1.png │ │ ├── skills-img2.png │ │ ├── skills-img3.png │ │ └── skills-img4.png │ ├── startup-banner.jpg │ ├── team │ │ ├── team-img1.jpg │ │ ├── team-img2.jpg │ │ ├── team-img3.jpg │ │ ├── team-img4.jpg │ │ ├── team-img5.jpg │ │ ├── team-img6.jpg │ │ ├── team-img7.jpg │ │ ├── team-img8.jpg │ │ └── team-img9.jpg │ ├── testimonials │ │ ├── testimonials-img1.jpg │ │ ├── testimonials-img2.jpg │ │ ├── testimonials-img3.jpg │ │ ├── testimonials-img4.jpg │ │ ├── testimonials-img5.jpg │ │ └── testimonials-img6.jpg │ ├── trending-img1.jpg │ ├── trending-img2.jpg │ ├── user │ │ ├── user1.jpg │ │ ├── user2.jpg │ │ ├── user3.jpg │ │ ├── user4.jpg │ │ └── user5.jpg │ ├── video-img.jpg │ ├── video-img2.jpg │ ├── what-we-do.jpg │ ├── who-we-are.jpg │ └── works │ │ ├── works-img1.jpg │ │ ├── works-img10.jpg │ │ ├── works-img11.jpg │ │ ├── works-img12.jpg │ │ ├── works-img13.jpg │ │ ├── works-img14.jpg │ │ ├── works-img15.jpg │ │ ├── works-img16.jpg │ │ ├── works-img17.jpg │ │ ├── works-img18.jpg │ │ ├── works-img2.jpg │ │ ├── works-img3.jpg │ │ ├── works-img4.jpg │ │ ├── works-img5.jpg │ │ ├── works-img6.jpg │ │ ├── works-img7.jpg │ │ ├── works-img8.jpg │ │ └── works-img9.jpg │ ├── js │ ├── ajaxchimp.min.js │ ├── appear.min.js │ ├── bootstrap.bundle.min.js │ ├── contact-form-script.js │ ├── form-validator.min.js │ ├── jquery.min.js │ ├── magnific-popup.min.js │ ├── main.js │ ├── meanmenu.min.js │ ├── mixitup.min.js │ ├── odometer.min.js │ ├── owl.carousel.min.js │ ├── parallax.min.js │ ├── rangeSlider.min.js │ ├── showMoreItems.min.js │ └── smooth-scroll.js │ └── webfonts │ ├── 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 ├── system_requirements.txt ├── tasks ├── __init__.py ├── admin.py ├── apps.py ├── celery_tasks.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_task_created_by.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params1.py ├── templates │ └── tasks_email_template.html ├── tests_celery_tasks.py ├── urls.py ├── utils.py └── views.py ├── teams ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_teams_table.py │ ├── 0003_alter_teams_created_by.py │ └── __init__.py ├── models.py ├── serializer.py ├── swagger_params1.py ├── tasks.py ├── urls.py └── views.py └── templates ├── assigned_to ├── account_assigned.html ├── cases_assigned.html ├── contact_assigned.html ├── leads_assigned.html └── opportunity_assigned.html ├── base.html ├── cms ├── blog │ ├── blog_detail_page.html │ └── blog_list_page.html ├── home_page.html └── streams │ ├── aboutapp.html │ ├── app_features.html │ ├── blog │ ├── code_block.html │ ├── content_title.html │ ├── image.html │ └── rich_text.html │ ├── carousel.html │ ├── count.html │ ├── home_blog.html │ ├── left_image_right_content.html │ ├── pricing.html │ └── right_image_left_content.html ├── cms_base.html ├── common └── user_activation_status.html ├── healthz.html ├── registration └── password_reset_email.html ├── root.html ├── root_email_template.html └── root_email_template_new.html /.coveragerc: -------------------------------------------------------------------------------- 1 | [report] 2 | exclude_lines = 3 | # lines with this comment are not hit 4 | pragma: no cover 5 | 6 | # Don't complain about missing debug-only code: 7 | def __unicode__ 8 | def __repr__ 9 | def __str__ 10 | if self\.debug 11 | 12 | # Don't complain if tests don't hit defensive assertion code: 13 | raise AssertionError 14 | raise NotImplementedError 15 | 16 | # Don't complain if non-runnable code isn't run: 17 | if 0: 18 | if __name__ == .__main__.: 19 | 20 | except Exception as e: 21 | except Exception: 22 | 23 | omit = 24 | *tests* 25 | ./settings/* 26 | ./*/migrations/* 27 | ./*/apps.py 28 | ./*/admin.py 29 | -------------------------------------------------------------------------------- /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [[analyzers]] 4 | name = "shell" 5 | enabled = true 6 | 7 | [[analyzers]] 8 | name = "python" 9 | enabled = true 10 | 11 | [analyzers.meta] 12 | runtime_version = "3.x.x" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *~ 3 | *.swo 4 | *.swp 5 | db.sqlite3 6 | media 7 | media-images 8 | cache 9 | .idea 10 | static/CACHE 11 | .sass-cache/ 12 | main.css 13 | main.css.map 14 | ref.css 15 | ref.css.map 16 | .coverage 17 | crm/dev_settings\.py 18 | env 19 | .env 20 | docs/build 21 | celerybeat-schedule 22 | local_settings.py 23 | media 24 | .sass-cache 25 | server.log 26 | .vscode 27 | staticfiles 28 | .venv -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/ambv/black 3 | rev: stable 4 | hooks: 5 | - id: black 6 | language_version: python3.6 7 | -------------------------------------------------------------------------------- /.runcode.yaml: -------------------------------------------------------------------------------- 1 | onCreate: 2 | - sudo apt-get update -y 3 | - sudo apt install python-is-python3 xvfb libfontconfig wkhtmltopdf libpq-dev python3-dev python3-pip build-essential libssl-dev libffi-dev python3-venv redis-server redis-tools virtualenv zsh python3-virtualenv -y 4 | - | 5 | sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' 6 | wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - 7 | sudo apt-get update 8 | sudo apt-get -y install postgresql 9 | - | 10 | sudo -u postgres psql postgres -c "ALTER USER postgres PASSWORD 'root'" 11 | sudo -u postgres psql postgres -c "CREATE DATABASE bottlecrm WITH OWNER = postgres" 12 | - | 13 | virtualenv -p python3 ../venv 14 | . ../venv/bin/activate 15 | cp ENV.md .env 16 | pip install -U pip 17 | pip install -r requirements.txt 18 | python manage.py migrate 19 | onStart: 20 | - | 21 | . ../venv/bin/activate 22 | WS_DOMAIN=`cat /home/ubuntu/runcode/ws-url-domain.txt` 23 | printf "\nGO TO THIS URL TO VIEW PAGE \033[4;34m https://8000-${WS_DOMAIN}\033[0;30m\n\n" 24 | python manage.py runserver 25 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "3.6.9" 4 | 5 | services: 6 | - redis-server 7 | - elasticsearch 8 | 9 | #Django & Database 10 | addons: 11 | postgresql: "9.4" 12 | 13 | sudo: required 14 | 15 | env: 16 | -DJANGO=3.0.6 17 | 18 | before_install: 19 | - gem install sass 20 | - gem install compass 21 | - npm install less 22 | 23 | install: 24 | - pip install -r requirements.txt 25 | - pip install coveralls 26 | - pip install redis 27 | 28 | # command to run tests 29 | script: 30 | - python manage.py test --keepdb 31 | - coverage run --source=accounts,cases,common,contacts,leads,opportunity,tasks,invoices,events,teams,marketing manage.py test --keepdb --noinput 32 | - coverage xml 33 | - pytest 34 | - python-codacy-coverage -r coverage.xml 35 | 36 | after_success: 37 | coveralls 38 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.formatting.provider": "black" 3 | } -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:20.04 2 | 3 | # invalidate cache 4 | ARG APP_NAME 5 | 6 | # test arg 7 | RUN test -n "$APP_NAME" 8 | 9 | # install system packages 10 | RUN apt-get update -y 11 | RUN apt-get install -y \ 12 | python3-pip \ 13 | python3-venv \ 14 | build-essential \ 15 | libpq-dev \ 16 | libmariadbclient-dev \ 17 | libjpeg62-dev \ 18 | zlib1g-dev \ 19 | libwebp-dev \ 20 | curl \ 21 | vim \ 22 | net-tools 23 | 24 | # setup user 25 | RUN useradd -ms /bin/bash ubuntu 26 | USER ubuntu 27 | 28 | # install app 29 | RUN mkdir -p /home/ubuntu/"$APP_NAME"/"$APP_NAME" 30 | WORKDIR /home/ubuntu/"$APP_NAME"/"$APP_NAME" 31 | COPY . . 32 | RUN python3 -m venv ../venv 33 | RUN . ../venv/bin/activate 34 | RUN /home/ubuntu/"$APP_NAME"/venv/bin/pip install -U pip 35 | RUN /home/ubuntu/"$APP_NAME"/venv/bin/pip install -r requirements.txt 36 | RUN /home/ubuntu/"$APP_NAME"/venv/bin/pip install gunicorn 37 | 38 | # setup path 39 | ENV PATH="${PATH}:/home/ubuntu/$APP_NAME/$APP_NAME/scripts" 40 | 41 | USER ubuntu 42 | -------------------------------------------------------------------------------- /ENV.md: -------------------------------------------------------------------------------- 1 | # Environment variables 2 | 3 | SECRET_KEY="mco934$@)NHUYTC%6789" 4 | ENV_TYPE="dev" 5 | DOMAIN_NAME="" 6 | 7 | # AWS 8 | AWS_BUCKET_NAME="" 9 | 10 | AWS_ACCESS_KEY_ID="" 11 | AWS_SECRET_ACCESS_KEY="" 12 | AWS_SES_REGION_NAME="" 13 | AWS_SES_REGION_ENDPOINT="" 14 | 15 | 16 | # DB 17 | DBNAME="bottlecrm" 18 | DBUSER="postgres" 19 | DBPASSWORD="root" 20 | DBHOST="localhost" 21 | DBPORT="" 22 | 23 | # Sentry 24 | SENTRY_DSN="" 25 | 26 | # Celery 27 | CELERY_BROKER_URL="" 28 | CELERY_RESULT_BACKEND="" 29 | 30 | # Swagger 31 | SWAGGER_ROOT_URL="" 32 | 33 | #CACHES 34 | MEMCACHELOCATION="" 35 | 36 | # Email 37 | DEFAULT_FROM_EMAIL="" 38 | ADMIN_EMAIL="" 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 MicroPyramid 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. 22 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include requirements.txt 2 | recursive-include */templates * 3 | -------------------------------------------------------------------------------- /Steps: -------------------------------------------------------------------------------- 1 | Google Login 2 | org 3 | 1)List 4 | 2)Create 5 | 3)Update 6 | 4)Add User to organisation 7 | 5)Remove User from organisation 8 | 6)Change user permission 9 | 10 | Leads 11 | 12 | 1)List 13 | 2)Create 14 | 3)Update 15 | 4)LeadDetailView 16 | 5)upload 17 | 6)Lead comment 18 | 7)Lead attachment 19 | 20 | 21 | -------------------------------------------------------------------------------- /accounts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/accounts/__init__.py -------------------------------------------------------------------------------- /accounts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AccountsConfig(AppConfig): 5 | name = "accounts" 6 | -------------------------------------------------------------------------------- /accounts/migrations/0003_alter_account_created_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-10-13 08: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 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('accounts', '0002_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='account', 18 | name='created_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /accounts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/accounts/migrations/__init__.py -------------------------------------------------------------------------------- /accounts/swagger_params1.py: -------------------------------------------------------------------------------- 1 | from drf_spectacular.types import OpenApiTypes 2 | from drf_spectacular.utils import OpenApiParameter 3 | 4 | organization_params_in_header = organization_params_in_header = OpenApiParameter( 5 | "org", OpenApiTypes.STR, OpenApiParameter.HEADER 6 | ) 7 | 8 | organization_params = [ 9 | organization_params_in_header, 10 | ] 11 | 12 | account_get_params = [ 13 | organization_params_in_header, 14 | OpenApiParameter("name", OpenApiTypes.STR, OpenApiParameter.QUERY), 15 | OpenApiParameter("city", OpenApiTypes.STR, OpenApiParameter.QUERY), 16 | OpenApiParameter("tags", OpenApiTypes.STR, OpenApiParameter.QUERY), 17 | ] 18 | 19 | 20 | -------------------------------------------------------------------------------- /accounts/tests_celery_tasks.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | 3 | from django.test import TestCase 4 | from django.test.utils import override_settings 5 | 6 | from accounts.models import Email 7 | from accounts.tasks import ( 8 | send_email, 9 | send_email_to_assigned_user, 10 | send_scheduled_emails, 11 | ) 12 | from accounts.tests import AccountCreateTest 13 | 14 | 15 | class TestCeleryTasks(AccountCreateTest, TestCase): 16 | @override_settings( 17 | CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, 18 | CELERY_ALWAYS_EAGER=True, 19 | BROKER_BACKEND="memory", 20 | ) 21 | def test_celery_tasks(self): 22 | email_scheduled = Email.objects.create( 23 | message_subject="message subject", 24 | message_body="message body", 25 | scheduled_later=True, 26 | timezone="Asia/Kolkata", 27 | from_account=self.account, 28 | scheduled_date_time=(datetime.now() - timedelta(minutes=5)), 29 | from_email="from@email.com", 30 | ) 31 | email_scheduled.recipients.add(self.contact.id, self.contact_user1.id) 32 | task = send_scheduled_emails.apply() 33 | self.assertEqual("SUCCESS", task.state) 34 | 35 | task = send_email.apply((email_scheduled.id,)) 36 | self.assertEqual("SUCCESS", task.state) 37 | 38 | task = send_email_to_assigned_user.apply( 39 | ( 40 | [ 41 | self.user.id, 42 | self.user1.id, 43 | ], 44 | self.account.id, 45 | ), 46 | ) 47 | self.assertEqual("SUCCESS", task.state) 48 | -------------------------------------------------------------------------------- /accounts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from accounts import views 4 | 5 | app_name = "api_accounts" 6 | 7 | urlpatterns = [ 8 | path("", views.AccountsListView.as_view()), 9 | path("/", views.AccountDetailView.as_view()), 10 | path("/create_mail/", views.AccountCreateMailView.as_view()), 11 | path("comment//", views.AccountCommentView.as_view()), 12 | path("attachment//", views.AccountAttachmentView.as_view()), 13 | ] 14 | -------------------------------------------------------------------------------- /cases/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/cases/__init__.py -------------------------------------------------------------------------------- /cases/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CasesConfig(AppConfig): 5 | name = "cases" 6 | -------------------------------------------------------------------------------- /cases/migrations/0003_alter_case_created_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-10-31 12:42 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 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('cases', '0002_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='case', 18 | name='created_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /cases/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/cases/migrations/__init__.py -------------------------------------------------------------------------------- /cases/swagger_params1.py: -------------------------------------------------------------------------------- 1 | from drf_spectacular.types import OpenApiTypes 2 | from drf_spectacular.utils import OpenApiParameter 3 | 4 | organization_params_in_header = organization_params_in_header = OpenApiParameter( 5 | "org", OpenApiTypes.STR, OpenApiParameter.HEADER 6 | ) 7 | 8 | organization_params = [ 9 | organization_params_in_header, 10 | ] 11 | 12 | cases_list_get_params = [ 13 | organization_params_in_header, 14 | OpenApiParameter("name", OpenApiTypes.STR,OpenApiParameter.QUERY), 15 | OpenApiParameter("status", OpenApiTypes.STR,OpenApiParameter.QUERY), 16 | OpenApiParameter("priority", OpenApiTypes.STR,OpenApiParameter.QUERY), 17 | OpenApiParameter("account", OpenApiTypes.STR,OpenApiParameter.QUERY), 18 | ] 19 | -------------------------------------------------------------------------------- /cases/tasks.py: -------------------------------------------------------------------------------- 1 | from celery import Celery 2 | from django.conf import settings 3 | from django.core.mail import EmailMessage 4 | from django.template.loader import render_to_string 5 | 6 | from accounts.models import Profile 7 | from cases.models import Case 8 | 9 | app = Celery("redis://") 10 | 11 | 12 | @app.task 13 | def send_email_to_assigned_user(recipients, case_id): 14 | """Send Mail To Users When they are assigned to a case""" 15 | case = Case.objects.get(id=case_id) 16 | created_by = case.created_by 17 | for profile_id in recipients: 18 | recipients_list = [] 19 | profile = Profile.objects.filter(id=profile_id, is_active=True).first() 20 | if profile: 21 | recipients_list.append(profile.user.email) 22 | context = {} 23 | context["url"] = settings.DOMAIN_NAME 24 | context["user"] = profile.user 25 | context["case"] = case 26 | context["created_by"] = created_by 27 | subject = "Assigned to case." 28 | html_content = render_to_string( 29 | "assigned_to/cases_assigned.html", context=context 30 | ) 31 | 32 | msg = EmailMessage(subject, html_content, to=recipients_list) 33 | msg.content_subtype = "html" 34 | msg.send() 35 | -------------------------------------------------------------------------------- /cases/tests_celery_tasks.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.test.utils import override_settings 3 | 4 | from cases.tasks import send_email_to_assigned_user 5 | from cases.tests import CaseCreation 6 | 7 | 8 | class TestCeleryTasks(CaseCreation, TestCase): 9 | @override_settings( 10 | CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, 11 | CELERY_ALWAYS_EAGER=True, 12 | BROKER_BACKEND="memory", 13 | ) 14 | def test_celery_tasks(self): 15 | task = send_email_to_assigned_user.apply( 16 | ( 17 | [ 18 | self.user.id, 19 | self.user1.id, 20 | ], 21 | self.case.id, 22 | ), 23 | ) 24 | self.assertEqual("SUCCESS", task.state) 25 | -------------------------------------------------------------------------------- /cases/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from cases import views 4 | 5 | app_name = "api_cases" 6 | 7 | urlpatterns = [ 8 | path("", views.CaseListView.as_view()), 9 | path("/", views.CaseDetailView.as_view()), 10 | path("comment//", views.CaseCommentView.as_view()), 11 | path("attachment//", views.CaseAttachmentView.as_view()), 12 | ] 13 | -------------------------------------------------------------------------------- /cms/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/cms/__init__.py -------------------------------------------------------------------------------- /cms/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /cms/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CmsConfig(AppConfig): 5 | default_auto_field = "django.db.models.BigAutoField" 6 | name = "cms" 7 | -------------------------------------------------------------------------------- /cms/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/cms/migrations/__init__.py -------------------------------------------------------------------------------- /cms/templatetags/menus_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | from ..models import Menu 4 | 5 | register = template.Library() 6 | 7 | 8 | @register.simple_tag() 9 | def get_menu(slug): 10 | return Menu.objects.get(slug=slug) 11 | -------------------------------------------------------------------------------- /cms/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /cms/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /common/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/common/__init__.py -------------------------------------------------------------------------------- /common/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from common.models import Address, Comment, CommentFiles, User 4 | 5 | # Register your models here. 6 | 7 | admin.site.register(User) 8 | admin.site.register(Address) 9 | admin.site.register(Comment) 10 | admin.site.register(CommentFiles) 11 | -------------------------------------------------------------------------------- /common/app_urls/__init__.py: -------------------------------------------------------------------------------- 1 | from django.urls import include, path 2 | 3 | app_name = "common_urls" 4 | urlpatterns = [ 5 | path("", include(("common.urls"))), 6 | path("accounts/", include("accounts.urls", namespace="api_accounts")), 7 | path("contacts/", include("contacts.urls", namespace="api_contacts")), 8 | path("leads/", include("leads.urls", namespace="api_leads")), 9 | path("opportunities/", include("opportunity.urls", namespace="api_opportunities")), 10 | path("teams/", include("teams.urls", namespace="api_teams")), 11 | path("tasks/", include("tasks.urls", namespace="api_tasks")), 12 | path("events/", include("events.urls", namespace="api_events")), 13 | path("cases/", include("cases.urls", namespace="api_cases")), 14 | ] 15 | -------------------------------------------------------------------------------- /common/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CommonConfig(AppConfig): 5 | name = "common" 6 | -------------------------------------------------------------------------------- /common/base.py: -------------------------------------------------------------------------------- 1 | import uuid 2 | 3 | # Django imports 4 | from django.db import models 5 | 6 | # Third party imports 7 | from crum import get_current_user 8 | 9 | # Module imports 10 | from common.mixins import AuditModel 11 | 12 | 13 | class BaseModel(AuditModel): 14 | id = models.UUIDField( 15 | default=uuid.uuid4, unique=True, editable=False, db_index=True, primary_key=True 16 | ) 17 | 18 | class Meta: 19 | abstract = True 20 | 21 | def save(self, *args, **kwargs): 22 | user = get_current_user() 23 | if user is None or user.is_anonymous: 24 | self.created_by = None 25 | self.updated_by = None 26 | super(BaseModel, self).save(*args, **kwargs) 27 | else: 28 | # Check if the model is being created or updated 29 | if self._state.adding: 30 | # If created only set created_by value: set updated_by to None 31 | self.created_by = user 32 | self.updated_by = None 33 | # If updated only set updated_by value don't touch created_by 34 | self.updated_by = user 35 | super(BaseModel, self).save(*args, **kwargs) 36 | 37 | def __str__(self): 38 | return str(self.id) -------------------------------------------------------------------------------- /common/context_processors/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/common/context_processors/__init__.py -------------------------------------------------------------------------------- /common/context_processors/common.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | 4 | def app_name(request): 5 | return { 6 | "APPLICATION_NAME": settings.APPLICATION_NAME, 7 | } 8 | -------------------------------------------------------------------------------- /common/custom_openapi.py: -------------------------------------------------------------------------------- 1 | def preprocessing_filter_spec(endpoints): 2 | filtered = [] 3 | for (path, path_regex, method, callback) in endpoints: 4 | # Remove all but DRF API endpoints 5 | if path.startswith("/api/"): 6 | filtered.append((path, path_regex, method, callback)) 7 | return filtered 8 | -------------------------------------------------------------------------------- /common/manager.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import BaseUserManager 2 | 3 | class UserManager(BaseUserManager): 4 | def create_user(self, email, password=None, **extra_fields): 5 | if not email: 6 | raise ValueError('The Email field must be set') 7 | email = self.normalize_email(email) 8 | user = self.model(email=email, **extra_fields) 9 | user.set_password(password) 10 | user.save(using=self._db) 11 | return user 12 | 13 | def create_superuser(self, email, password=None, **extra_fields): 14 | extra_fields.setdefault('is_superuser', True) 15 | extra_fields.setdefault('is_staff', True) 16 | 17 | if extra_fields.get('is_staff') is not True: 18 | raise ValueError('Superuser must have is_staff=True.') 19 | 20 | 21 | if extra_fields.get('is_superuser') is not True: 22 | raise ValueError('Superuser must have is_superuser=True.') 23 | 24 | return self.create_user(email, password, **extra_fields) 25 | -------------------------------------------------------------------------------- /common/middleware/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/common/middleware/__init__.py -------------------------------------------------------------------------------- /common/migrations/0003_alter_user_profile_pic.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-07-12 09:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('common', '0002_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='user', 15 | name='profile_pic', 16 | field=models.CharField(blank=True, max_length=1000, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /common/migrations/0004_alter_profile_alternate_phone.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-07-21 11:23 2 | 3 | from django.db import migrations 4 | import phonenumber_field.modelfields 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('common', '0003_alter_user_profile_pic'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='profile', 16 | name='alternate_phone', 17 | field=phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, null=True, region=None), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /common/migrations/0005_org_api_key.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-11-02 11:19 2 | 3 | import common.models 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('common', '0004_alter_profile_alternate_phone'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='org', 16 | name='api_key', 17 | field=models.TextField(default=common.models.generate_unique_key, editable=False), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /common/migrations/0006_alter_org_api_key.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-11-02 11:20 2 | 3 | import common.models 4 | from django.db import migrations, models 5 | import uuid 6 | 7 | def generate_unique_key(): 8 | return str(uuid.uuid4()) 9 | 10 | def set_unique_api_keys(apps, schema_editor): 11 | Org = apps.get_model('common', 'Org') 12 | for org in Org.objects.all(): 13 | org.api_key = generate_unique_key() 14 | org.save() 15 | 16 | 17 | class Migration(migrations.Migration): 18 | 19 | dependencies = [ 20 | ('common', '0005_org_api_key'), 21 | ] 22 | 23 | operations = [ 24 | migrations.RunPython(set_unique_api_keys), 25 | migrations.AlterField( 26 | model_name='org', 27 | name='api_key', 28 | field=models.TextField(default=common.models.generate_unique_key, editable=False, unique=True), 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /common/migrations/0007_org_is_active.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-11-02 11:42 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('common', '0006_alter_org_api_key'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='org', 15 | name='is_active', 16 | field=models.BooleanField(default=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /common/migrations/0008_alter_user_managers.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2024-02-14 06:22 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('common', '0007_org_is_active'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelManagers( 14 | name='user', 15 | managers=[ 16 | ], 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /common/migrations/0009_user_is_staff.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2024-02-14 07:11 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('common', '0008_alter_user_managers'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='user', 15 | name='is_staff', 16 | field=models.BooleanField(default=False, verbose_name='staff status'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /common/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/common/migrations/__init__.py -------------------------------------------------------------------------------- /common/mixins.py: -------------------------------------------------------------------------------- 1 | # Python imports 2 | import uuid 3 | 4 | # Django imports 5 | from common.models import models 6 | 7 | 8 | class TimeAuditModel(models.Model): 9 | 10 | """To path when the record was created and last modified""" 11 | 12 | created_at = models.DateTimeField( 13 | auto_now_add=True, 14 | verbose_name="Created At", 15 | ) 16 | updated_at = models.DateTimeField(auto_now=True, verbose_name="Last Modified At") 17 | 18 | class Meta: 19 | abstract = True 20 | 21 | 22 | class UserAuditModel(models.Model): 23 | 24 | """To path when the record was created and last modified""" 25 | 26 | created_by = models.ForeignKey( 27 | "common.User", 28 | on_delete=models.SET_NULL, 29 | related_name="%(class)s_created_by", 30 | verbose_name="Created By", 31 | null=True, 32 | ) 33 | updated_by = models.ForeignKey( 34 | "common.User", 35 | on_delete=models.SET_NULL, 36 | related_name="%(class)s_updated_by", 37 | verbose_name="Last Modified By", 38 | null=True, 39 | ) 40 | 41 | class Meta: 42 | abstract = True 43 | 44 | 45 | class AuditModel(TimeAuditModel, UserAuditModel): 46 | 47 | """To path when the record was created and last modified""" 48 | 49 | class Meta: 50 | abstract = True -------------------------------------------------------------------------------- /common/swagger-ui.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Swagger 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /common/swagger_params1.py: -------------------------------------------------------------------------------- 1 | from drf_spectacular.types import OpenApiTypes 2 | from drf_spectacular.utils import OpenApiParameter 3 | 4 | organization_params_in_header = OpenApiParameter( 5 | "org", OpenApiTypes.STR, OpenApiParameter.HEADER 6 | ) 7 | 8 | organization_params = [ 9 | organization_params_in_header, 10 | ] 11 | 12 | user_list_params = [ 13 | organization_params_in_header, 14 | OpenApiParameter("email", OpenApiTypes.STR,OpenApiParameter.QUERY), 15 | OpenApiParameter( 16 | "role", OpenApiTypes.STR, OpenApiParameter.QUERY,enum=["ADMIN", "USER"] 17 | ), 18 | OpenApiParameter( 19 | "status", 20 | OpenApiTypes.STR, 21 | OpenApiParameter.QUERY, 22 | enum=["Active", "In Active"], 23 | ), 24 | ] 25 | 26 | document_get_params = [ 27 | organization_params_in_header, 28 | OpenApiParameter("title", OpenApiTypes.STR,OpenApiParameter.QUERY), 29 | OpenApiParameter( 30 | "status", 31 | OpenApiTypes.STR, 32 | OpenApiParameter.QUERY, 33 | enum=["Active", "In Active"], 34 | ), 35 | OpenApiParameter("shared_to", OpenApiTypes.STR,OpenApiParameter.QUERY), 36 | ] 37 | 38 | -------------------------------------------------------------------------------- /common/templates/comment_email.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | Hi {{mentioned_user}} 5 | {% endblock heading %} 6 | 7 | {% block content_body %} 8 | You have been tagged for the comment posted by {{commented_by}} 9 | {% endblock content_body %} 10 | 11 | {% block button_link %} 12 | {% if url %} 13 |
14 | Click here 16 |
17 | {% endif %} 18 | {% endblock button_link %} -------------------------------------------------------------------------------- /common/templates/password_reset_email.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | Hi {{email}} 5 | {% endblock heading %} 6 | 7 | 8 | {% ifequal 'activated' message %} 9 | {% block content_body %} 10 | Your account has been activated by {{status_changed_user}}. You can login to your account and access all the features of 11 | Django CRM. 12 | {% endblock content_body %} 13 | {% block button_link %} 14 | {% if url %} 15 | 19 | {% endif %} 20 | {% endblock button_link %} 21 | {% endifequal %} 22 | -------------------------------------------------------------------------------- /common/templates/user_delete_email.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | Hi {{email}} 5 | {% endblock heading %} 6 | 7 | 8 | {% ifequal 'deleted' message %} 9 | {% block content_body %} 10 | Your account has been deleted by {{deleted_by}}. You are no longer able to access your account. 11 | {% endblock content_body %} 12 | {% endifequal %} 13 | -------------------------------------------------------------------------------- /common/templates/user_status.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | Hi {{email}} 5 | {% endblock heading %} 6 | 7 | 8 | {% ifequal 'activated' message %} 9 | {% block content_body %} 10 | You account has been activated by {{status_changed_user}}. You can login to your account and access all the features of 11 | Django CRM. 12 | {% endblock content_body %} 13 | {% block button_link %} 14 | {% if url %} 15 |
16 | Login 18 |
19 | {% endif %} 20 | {% endblock button_link %} 21 | 22 | {% else %} 23 | {% block content_body %} 24 | You account has been deactivated by {{status_changed_user}}. You will receive an email if your account has been 25 | activated. 26 | {% endblock content_body %} 27 | {% block extra_content %} 28 | Please contact your admin if you have any queries. 29 | {% endblock extra_content %} 30 | {% endifequal %} 31 | 32 | 33 | {% comment %} 34 | 35 | 36 | {% ifequal 'deactivated' message %} 37 | {% block content_body %} 38 | You account has been deactivated by {{status_changed_user}}. You will receive an email if your account has been 39 | activated. 40 | {% endblock content_body %} 41 | {% block extra_content %} 42 | Please contact your admin if you have any queries. 43 | {% endblock extra_content %} 44 | {% endifequal %} 45 | 46 | {% endcomment %} -------------------------------------------------------------------------------- /common/templates/user_status_activate.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | Hi {{email}} 5 | {% endblock heading %} 6 | 7 | 8 | {% ifequal 'activated' message %} 9 | {% block content_body %} 10 | You account has been activated by {{status_changed_user}}. You can login to your account and access all the features of 11 | Django CRM. 12 | {% endblock content_body %} 13 | {% block button_link %} 14 | {% if url %} 15 |
16 | Login 18 |
19 | {% endif %} 20 | {% endblock button_link %} 21 | {% endifequal %} 22 | -------------------------------------------------------------------------------- /common/templates/user_status_deactivate.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | Hi {{email}} 5 | {% endblock heading %} 6 | 7 | {% ifequal 'deactivated' message %} 8 | {% block content_body %} 9 | You account has been deactivated by {{status_changed_user}}. You will receive an email if your account has been 10 | activated. 11 | {% endblock content_body %} 12 | {% block extra_content %} 13 | Please contact your admin if you have any queries. 14 | {% endblock extra_content %} 15 | {% endifequal %} 16 | -------------------------------------------------------------------------------- /common/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/common/templatetags/__init__.py -------------------------------------------------------------------------------- /common/token_generator.py: -------------------------------------------------------------------------------- 1 | # from django.utils import six 2 | import six 3 | from django.contrib.auth.tokens import PasswordResetTokenGenerator 4 | 5 | 6 | class TokenGenerator(PasswordResetTokenGenerator): 7 | """this class is used to generate a unique token to identify the user""" 8 | 9 | def _make_hash_value(self, user, timestamp): 10 | return ( 11 | six.text_type(user.pk) 12 | + six.text_type(timestamp) 13 | + six.text_type(user.is_active) 14 | ) 15 | 16 | 17 | account_activation_token = TokenGenerator() 18 | -------------------------------------------------------------------------------- /common/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework_simplejwt import views as jwt_views 3 | 4 | from common import views 5 | 6 | app_name = "api_common" 7 | 8 | 9 | urlpatterns = [ 10 | path("dashboard/", views.ApiHomeView.as_view()), 11 | path( 12 | "auth/refresh-token/", 13 | jwt_views.TokenRefreshView.as_view(), 14 | name="token_refresh", 15 | ), 16 | # GoogleLoginView 17 | path("auth/google/", views.GoogleLoginView.as_view()), 18 | path("org/", views.OrgProfileCreateView.as_view()), 19 | path("profile/", views.ProfileView.as_view()), 20 | path("users/get-teams-and-users/", views.GetTeamsAndUsersView.as_view()), 21 | path("users/", views.UsersListView.as_view()), 22 | path("user//", views.UserDetailView.as_view()), 23 | path("documents/", views.DocumentListView.as_view()), 24 | path("documents//", views.DocumentDetailView.as_view()), 25 | path("api-settings/", views.DomainList.as_view()), 26 | path("api-settings//", views.DomainDetailView.as_view()), 27 | path("user//status/", views.UserStatusView.as_view()), 28 | ] 29 | -------------------------------------------------------------------------------- /contacts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/contacts/__init__.py -------------------------------------------------------------------------------- /contacts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from contacts.models import Contact 4 | 5 | admin.site.register(Contact) 6 | -------------------------------------------------------------------------------- /contacts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ContactsConfig(AppConfig): 5 | name = "contacts" 6 | -------------------------------------------------------------------------------- /contacts/migrations/0002_alter_contact_created_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-06-29 07:31 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 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('contacts', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='contact', 18 | name='created_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /contacts/migrations/0003_alter_contact_secondary_number_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-07-21 11:23 2 | 3 | from django.db import migrations, models 4 | import phonenumber_field.modelfields 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('contacts', '0002_alter_contact_created_by'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='contact', 16 | name='secondary_number', 17 | field=phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, null=True, region=None), 18 | ), 19 | migrations.AlterField( 20 | model_name='contact', 21 | name='twitter_username', 22 | field=models.CharField(blank=True, max_length=255, null=True), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /contacts/migrations/0004_alter_contact_address.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-11-23 05:54 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('contacts', '0003_alter_contact_secondary_number_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='contact', 15 | name='address', 16 | field=models.TextField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /contacts/migrations/0005_alter_contact_address.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-11-23 05:59 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 | ('common', '0007_org_is_active'), 11 | ('contacts', '0004_alter_contact_address'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='contact', 17 | name='address', 18 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='adress_contacts', to='common.address'), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /contacts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/contacts/migrations/__init__.py -------------------------------------------------------------------------------- /contacts/tasks.py: -------------------------------------------------------------------------------- 1 | from celery import Celery 2 | from django.conf import settings 3 | from django.core.mail import EmailMessage 4 | from django.template.loader import render_to_string 5 | 6 | from common.models import Profile 7 | from contacts.models import Contact 8 | 9 | app = Celery("redis://") 10 | 11 | 12 | @app.task 13 | def send_email_to_assigned_user(recipients, contact_id): 14 | """Send Mail To Users When they are assigned to a contact""" 15 | contact = Contact.objects.get(id=contact_id) 16 | created_by = contact.created_by 17 | for profile_id in recipients: 18 | recipients_list = [] 19 | profile = Profile.objects.filter(id=profile_id, is_active=True).first() 20 | if profile: 21 | recipients_list.append(profile.user.email) 22 | context = {} 23 | context["url"] = settings.DOMAIN_NAME 24 | context["user"] = profile.user 25 | context["contact"] = contact 26 | context["created_by"] = created_by 27 | subject = "Assigned a contact for you." 28 | html_content = render_to_string( 29 | "assigned_to/contact_assigned.html", context=context 30 | ) 31 | 32 | msg = EmailMessage(subject, html_content, to=recipients_list) 33 | msg.content_subtype = "html" 34 | msg.send() 35 | -------------------------------------------------------------------------------- /contacts/tests_celery_tasks.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | 3 | from django.test import TestCase 4 | from django.test.utils import override_settings 5 | 6 | from contacts.tasks import send_email_to_assigned_user 7 | from contacts.tests import ContactObjectsCreation 8 | 9 | 10 | class TestCeleryTasks(ContactObjectsCreation, TestCase): 11 | @override_settings( 12 | CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, 13 | CELERY_ALWAYS_EAGER=True, 14 | BROKER_BACKEND="memory", 15 | ) 16 | def test_celery_tasks(self): 17 | task = send_email_to_assigned_user.apply( 18 | ( 19 | [ 20 | self.user.id, 21 | self.user_contacts_mp.id, 22 | ], 23 | self.contact.id, 24 | ), 25 | ) 26 | self.assertEqual("SUCCESS", task.state) 27 | -------------------------------------------------------------------------------- /contacts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from contacts import views 4 | 5 | app_name = "api_contacts" 6 | 7 | urlpatterns = [ 8 | path("", views.ContactsListView.as_view()), 9 | path("/", views.ContactDetailView.as_view()), 10 | path("comment//", views.ContactCommentView.as_view()), 11 | path("attachment//", views.ContactAttachmentView.as_view()), 12 | ] 13 | -------------------------------------------------------------------------------- /crm/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, unicode_literals 2 | 3 | # This will make sure the app is always imported when 4 | # Django starts so that shared_task will use this app. 5 | from .celery import app as celery_app 6 | 7 | __all__ = ["celery_app"] 8 | -------------------------------------------------------------------------------- /crm/celery.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, unicode_literals 2 | 3 | import os 4 | 5 | from celery import Celery 6 | 7 | # set the default Django settings module for the 'celery' program. 8 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "crm.settings") 9 | # os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'crm.dev_settings') 10 | # os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'crm.server_settings') 11 | 12 | app = Celery("crm") 13 | 14 | # Using a string here means the worker don't have to serialize 15 | # the configuration object to child processes. 16 | # - namespace='CELERY' means all celery-related configuration keys 17 | # should have a `CELERY_` prefix. 18 | app.config_from_object("django.conf:settings", namespace="CELERY") 19 | 20 | # Load task modules from all registered Django app configs. 21 | app.autodiscover_tasks() 22 | -------------------------------------------------------------------------------- /crm/server_settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import sentry_sdk 4 | from sentry_sdk.integrations.django import DjangoIntegration 5 | 6 | DEBUG = False 7 | 8 | AWS_STORAGE_BUCKET_NAME = AWS_BUCKET_NAME = os.environ["AWS_BUCKET_NAME"] 9 | AWS_ACCESS_KEY_ID = os.environ["AWS_ACCESS_KEY_ID"] 10 | AWS_SECRET_ACCESS_KEY = os.environ["AWS_SECRET_ACCESS_KEY"] 11 | S3_DOMAIN = AWS_S3_CUSTOM_DOMAIN = str(AWS_BUCKET_NAME) + ".s3.amazonaws.com" 12 | AWS_SES_REGION_NAME = os.environ["AWS_SES_REGION_NAME"] 13 | AWS_SES_REGION_ENDPOINT = os.environ["AWS_SES_REGION_ENDPOINT"] 14 | 15 | AWS_S3_OBJECT_PARAMETERS = { 16 | "CacheControl": "max-age=86400", 17 | } 18 | 19 | DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" 20 | DEFAULT_S3_PATH = "media" 21 | 22 | MEDIA_ROOT = "/%s/" % DEFAULT_S3_PATH 23 | MEDIA_URL = "//%s/%s/" % (S3_DOMAIN, DEFAULT_S3_PATH) 24 | # STATIC_URL = "https://%s/" % (S3_DOMAIN) 25 | # ADMIN_MEDIA_PREFIX = STATIC_URL + "admin/" 26 | 27 | CORS_ORIGIN_ALLOW_ALL = True 28 | 29 | AWS_IS_GZIPPED = True 30 | AWS_ENABLED = True 31 | AWS_S3_SECURE_URLS = True 32 | 33 | EMAIL_BACKEND = "django_ses.SESBackend" 34 | 35 | SESSION_COOKIE_DOMAIN = ".bottlecrm.com" 36 | 37 | sentry_sdk.init( 38 | dsn=os.environ["SENTRY_DSN"], 39 | integrations=[DjangoIntegration()], 40 | traces_sample_rate=1.0, 41 | # If you wish to associate users to errors (assuming you are using 42 | # django.contrib.auth) you may enable sending PII data. 43 | send_default_pii=True, 44 | ) 45 | 46 | RAVEN_CONFIG = { 47 | "dsn": os.environ["SENTRY_DSN"], 48 | } 49 | -------------------------------------------------------------------------------- /crm/wsgi.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | 4 | from django.core.wsgi import get_wsgi_application 5 | 6 | PROJECT_DIR = os.path.abspath(__file__) 7 | sys.path.append(PROJECT_DIR) 8 | 9 | 10 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "crm.settings") 11 | 12 | application = get_wsgi_application() 13 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2.0' 2 | 3 | services: 4 | db: 5 | image: postgres 6 | # volumes: 7 | # - /home/db:/var/lib/postgresql/data 8 | env_file: 9 | - ./db.env 10 | 11 | web: 12 | build: . 13 | image: micropyramid/django-crm:1 14 | env_file: 15 | - ./db.env 16 | ports: 17 | - "8001:8000" 18 | depends_on: 19 | - db -------------------------------------------------------------------------------- /docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | crm-app: 4 | image: djcrm:1 5 | container_name: crm-app 6 | environment: 7 | - DBNAME=crm 8 | - DBUSER=crm 9 | - DBPASSWORD=crm 10 | - DBHOST=crm-db 11 | - DBPORT=5432 12 | - ENV_TYPE=development 13 | - DEFAULT_FROM_EMAIL=your_email@example.com 14 | - ADMIN_EMAIL=your_admin_email@example.com 15 | - CELERY_BROKER_URL="celery.url" 16 | - CELERY_RESULT_BACKEND="celery.backend.url" 17 | - DOMAIN_NAME="DOMAIN.NAME" 18 | - SWAGGER_ROOT_URL="SWAGGER.ROOT.URL" 19 | depends_on: 20 | - crm-db 21 | ports: 22 | - 8000:8000 23 | networks: 24 | - nw 25 | 26 | crm-db: 27 | image: postgres:12-bookworm 28 | container_name: crm-db 29 | environment: 30 | - POSTGRES_DB=crm 31 | - POSTGRES_USER=crm 32 | - POSTGRES_PASSWORD=crm 33 | ports: 34 | - 5432:5432 35 | volumes: 36 | - /var/run/postgresql/:/var/run/postgresql 37 | networks: 38 | - nw 39 | 40 | networks: 41 | nw: {} 42 | -------------------------------------------------------------------------------- /docker/dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:22.04 2 | 3 | ARG DEBIAN_FRONTEND=noninteractive 4 | ARG PIP_EXTRA_INDEX_URL 5 | 6 | WORKDIR /app 7 | 8 | # Intall dependencies 9 | COPY requirements.txt /app 10 | 11 | RUN apt update 12 | RUN apt install -y git ruby-dev ruby-ffi postgresql-client redis-server wkhtmltopdf 13 | RUN apt clean 14 | RUN gem install sass 15 | RUN gem install compass 16 | # install nvm/npm 17 | # RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash 18 | RUN apt install nodejs npm -y 19 | RUN npm -g install less 20 | RUN apt install -y python3-pip 21 | RUN python3 -m pip install --no-cache-dir -r requirements.txt 22 | RUN python3 -m pip install --no-cache-dir redis 23 | 24 | RUN python3 -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' > /app/secret_key.txt 25 | ENV SECRET_KEY \ 26 | $(cat /app/secret_key.txt) 27 | RUN rm /app/secret_key.txt 28 | 29 | 30 | COPY . /app 31 | COPY docker/entrypoint.sh /app 32 | COPY docker/wait-for-postgres.sh /app 33 | 34 | 35 | RUN chmod +x entrypoint.sh 36 | RUN chmod +x wait-for-postgres.sh 37 | ENTRYPOINT ["./entrypoint.sh"] 38 | -------------------------------------------------------------------------------- /docker/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Execute startup scripts 4 | ./wait-for-postgres.sh "$DBHOST" 5 | python3 manage.py collectstatic --noinput 6 | python3 manage.py migrate 7 | python3 manage.py runserver 0.0.0.0:8000 -------------------------------------------------------------------------------- /docker/wait-for-postgres.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # wait-for-postgres.sh 3 | 4 | set -e 5 | 6 | host="$1" 7 | shift 8 | cmd=( "$@" ) 9 | 10 | echo "Testing Postgres connection with psql ..." 11 | until PGPASSWORD="$DBPASSWORD" psql -h "$host" -U "$DBUSER" -c "\q"; do 12 | >&2 echo -n . 13 | sleep 1 14 | done 15 | 16 | >&2 echo "Postgres is up - executing command" 17 | exec $cmd 18 | -------------------------------------------------------------------------------- /docs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/docs/__init__.py -------------------------------------------------------------------------------- /docs/source/Accounts.rst: -------------------------------------------------------------------------------- 1 | Accounts 2 | ******** 3 | 4 | | These have the user roles i.e Admin and User. User Role will have permissions where Admin can access. 5 | 6 | | Create your Accounts - new account can be created for different users and contacts and leads can create in accounts itself in their view pages 7 | 8 | 9 | 10 | 11 | | **Fig** Accounts page 12 | 13 | | This page view describes us about the accounts available and basic information. 14 | 15 | | There are 2 types of accounts i.e Open/Closed accounts. 16 | 17 | | We can Edit/Delete accounts here 18 | 19 | | To create an account we have a option "Add New Account" at the top right corner On Clicking it you will be redirected to the below page. 20 | 21 | | **Optional:** We can filter the users based on name,city,tags . 22 | 23 | 24 | | **Fig** Account create page 25 | 26 | | Here while we are creating an account, it is mandatory to have minimum one contact and one lead. 27 | 28 | | **Note:** Fields having ``*`` are mandatory 29 | 30 | 31 | 32 | 33 | 34 | .. | Rules to follow:- 35 | 36 | .. 1.writing test cases for the code 37 | 38 | .. 2.test cases coverage percent should be above 90% 39 | -------------------------------------------------------------------------------- /docs/source/Cases.rst: -------------------------------------------------------------------------------- 1 | Cases 2 | ***** 3 | 4 | 5 | 6 | | **Fig** cases Home Page 7 | 8 | | The above figure shows the cases view, this page gives details and list view of leads 9 | | You can filter the results by name, status, priority, account. 10 | 11 | | Create a new Lead using the button on right corner ``+ Add New case`` 12 | 13 | 14 | | **Fig** cases Create Page 15 | 16 | | **Note:** Fields having ``*`` are mandatory. 17 | 18 | | **Note:** To create a cases user,accounts are required. -------------------------------------------------------------------------------- /docs/source/Change Password.rst: -------------------------------------------------------------------------------- 1 | Change Password 2 | *************** 3 | 4 | 5 | 6 | | **Fig** Password Change Page 7 | 8 | | The above figure shows the password change view, here enter the old password in "old password field" and enter new password in "new password field" and retype the new password in "confirm new password" field. 9 | 10 | | Click "Change Password" button to change the password successfully, otherwise cancel to cancel the process. 11 | -------------------------------------------------------------------------------- /docs/source/Contacts.rst: -------------------------------------------------------------------------------- 1 | Contacts 2 | ******** 3 | 4 | | Contacts can be created and can be assigned to Accounts 5 | 6 | 7 | 8 | 9 | | **Fig** Contacts Home Page 10 | 11 | | The above figure shows the contacts view, this page gives details and list view of leads 12 | | You can filter the results by name, city, assigned user. 13 | 14 | | Create a new Lead using the button on right corner ``+ Add New contact`` 15 | 16 | 17 | | **Fig** Contacts Create Page 18 | 19 | | **Note:** Fields having ``*`` are mandatory. 20 | 21 | | **Note:** To create a contacts lead is required. -------------------------------------------------------------------------------- /docs/source/Documents.rst: -------------------------------------------------------------------------------- 1 | Documents 2 | ********* 3 | 4 | 5 | 6 | | **Fig** documents Home Page 7 | 8 | | The above figure shows the documents view, this page gives details and list view of leads 9 | | You can filter the results by title, status, shared to. 10 | 11 | | Create a new Document using the button on right corner ``+ Add New Document`` 12 | 13 | 14 | | **Fig** Documents Create Page 15 | 16 | | **Note:** Fields having ``*`` are mandatory. 17 | -------------------------------------------------------------------------------- /docs/source/Forget Password.rst: -------------------------------------------------------------------------------- 1 | Forget Password 2 | *************** 3 | 4 | 5 | | **Fig** Forget Password Page View 6 | 7 | | Enter the registered email id and click submit, then you will be sent a email to the registered email address, and redirect to the acknowledge page as below figure 8 | 9 | 10 | | **Fig** Email Sent acknowledgement view 11 | 12 | | When you check the mail you will receive a email similar to the below figure. 13 | 14 | 15 | | **Fig** Email recieved 16 | 17 | | When you click on the link in the mail, you will get a page as below 18 | 19 | 20 | | **Fig** Password Reset view 21 | 22 | 23 | | After you successful change the password you will get below page 24 | 25 | 26 | | **Fig** Password Reset Successful view 27 | 28 | | Now click on login and enter your credentials 29 | 30 | | After successful login you will be redirected to Dashboard which looks similiar to the below figure 31 | 32 | 33 | | **Fig** Dashboard view 34 | 35 | | The home page/Dashboard have access to all the modules of the CRM 36 | 37 | | **Note:** The numbers below accounts, contacts, leads, opportunities represent the total count of each module. -------------------------------------------------------------------------------- /docs/source/Leads.rst: -------------------------------------------------------------------------------- 1 | Leads 2 | ***** 3 | 4 | 5 | 6 | | **Fig** Accounts Home Page 7 | 8 | | This is Account Home Page, this page gives details and list view of leads 9 | | You can filter the results by name, source, assigned user, status, tags 10 | 11 | | Create a new Lead using the button on right corner ``+ Add New Lead`` 12 | 13 | 14 | | **Fig** Leads Create Page 15 | 16 | | **Note:** Fields having ``*`` are mandatory 17 | -------------------------------------------------------------------------------- /docs/source/Login.rst: -------------------------------------------------------------------------------- 1 | Login 2 | ***** 3 | 4 | 5 | | **Fig** Login Page 6 | -------------------------------------------------------------------------------- /docs/source/Opportunity.rst: -------------------------------------------------------------------------------- 1 | Opportunity 2 | *********** 3 | 4 | | New Opportunities can be added and can be assigned to accounts and contacts. 5 | 6 | 7 | 8 | | **Fig** Opportunity Home Page 9 | 10 | | The above figure shows the Opportunity view, this page gives details and list view of leads 11 | | They are two types of leads open and closed 12 | | You can filter the results by name, stage, account, lead source 13 | 14 | | Create a new Lead using the button on right corner ``+ Add New Opportunity`` 15 | 16 | 17 | | **Fig** Opportunity Create Page 18 | 19 | | **Note:** Fields having ``*`` are mandatory. 20 | 21 | | **Note:** To create a Opportunity lead is required. -------------------------------------------------------------------------------- /docs/source/Profile.rst: -------------------------------------------------------------------------------- 1 | Profile 2 | ******* 3 | 4 | Dropdown menu for user settings 5 | 6 | 7 | 8 | | **Fig** Dropdown menu 9 | 10 | Here in this drop down all the essential options for the user profile management are available i.e. 11 | 12 | Users 13 | ~~~~~ 14 | 15 | | On clicking users, the following page is shown 16 | 17 | 18 | | **Fig:** Users view 19 | 20 | | Here the user can activate/deactivate, edit/delete user data. 21 | 22 | | To create new user click on `` + Add New User``. 23 | 24 | | One clicking `` + Add New User`` the following page is shown: 25 | 26 | 27 | | **Fig** User create page 28 | 29 | | **Note:** Fields having ``*`` are mandatory. 30 | 31 | 32 | 33 | | **Fig:** User Edit User page 34 | 35 | Settings 36 | ~~~~~~~~~ 37 | | On clicking settings, the following page is shown: 38 | 39 | .. image:: screenshots/settingshome.png 40 | :align: center 41 | 42 | | **Fig:** User Settings page 43 | 44 | | Click on `` + Add New Setting`` 45 | 46 | 47 | 48 | | **Fig:** User Create Setting page 49 | 50 | 51 | Change Password 52 | ~~~~~~~~~~~~~~~ 53 | 54 | | On clicking settings, the following page is shown: 55 | 56 | 57 | 58 | | **Fig:** User Change password page 59 | 60 | Profile 61 | ~~~~~~~ 62 | 63 | | On clicking settings, the following page is shown: 64 | 65 | 66 | 67 | | **Fig:** User profile page 68 | 69 | 70 | 71 | | **Fig:** User edit profile page 72 | 73 | | Here user can edit his personal details. 74 | 75 | 76 | Logout 77 | ~~~~~~~ 78 | On Clicking logout you will be logged out from the account and redirected to Login page. -------------------------------------------------------------------------------- /dump.rdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/dump.rdb -------------------------------------------------------------------------------- /emails/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/emails/__init__.py -------------------------------------------------------------------------------- /emails/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from emails.models import Email 4 | 5 | # Register your models here. 6 | admin.site.register(Email) 7 | -------------------------------------------------------------------------------- /emails/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class EmailsConfig(AppConfig): 5 | name = "emails" 6 | -------------------------------------------------------------------------------- /emails/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | from .models import Email 4 | 5 | 6 | class EmailForm(forms.ModelForm): 7 | 8 | from_email = forms.EmailField(max_length=200, required=True) 9 | to_email = forms.EmailField(max_length=200, required=True) 10 | subject = forms.CharField(max_length=200, required=True) 11 | message = forms.CharField(max_length=200, required=True) 12 | 13 | class Meta: 14 | model = Email 15 | fields = ("from_email", "to_email", "subject", "message") 16 | -------------------------------------------------------------------------------- /emails/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/emails/migrations/__init__.py -------------------------------------------------------------------------------- /emails/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from common.base import BaseModel 3 | 4 | # Create your models here. 5 | 6 | 7 | class Email(BaseModel): 8 | 9 | from_email = models.EmailField(max_length=200) 10 | to_email = models.EmailField(max_length=200) 11 | subject = models.CharField(max_length=200) 12 | message = models.CharField(max_length=200) 13 | file = models.FileField(null=True, upload_to="files/") 14 | # send_time = models.DateTimeField(default=datetime.now) 15 | send_time = models.DateTimeField(auto_now_add=True) 16 | status = models.CharField(max_length=200, default="sent") 17 | important = models.BooleanField(max_length=10, default=False) 18 | 19 | class Meta: 20 | verbose_name = "Email" 21 | verbose_name_plural = "Emails" 22 | db_table = "email" 23 | ordering = ("-created_at",) 24 | 25 | def __str__(self): 26 | return f"{self.message_subject}" -------------------------------------------------------------------------------- /emails/serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from emails.models import Email 4 | 5 | 6 | class EmailSerailizer(serializers.ModelSerializer): 7 | class Meta: 8 | model = Email 9 | fields = "__all__" 10 | -------------------------------------------------------------------------------- /emails/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.conf.urls import url 3 | from django.conf.urls.static import static 4 | 5 | from . import views 6 | 7 | app_name = "emails" 8 | 9 | 10 | urlpatterns = [ 11 | url(r"^list/", views.emails_list, name="list"), 12 | url(r"^compose/", views.email, name="compose"), 13 | url(r"^email_sent/", views.email_sent, name="email_sent"), 14 | url( 15 | r"^email_move_to_trash/(?P\d+)/$", 16 | views.email_move_to_trash, 17 | name="email_move_to_trash", 18 | ), 19 | url(r"^email_delete/(?P\d+)/$", views.email_delete, name="email_delete"), 20 | url(r"^email_trash/", views.email_trash, name="email_trash"), 21 | url( 22 | r"^email_trash_delete/(?P\d+)/$", 23 | views.email_trash_delete, 24 | name="email_trash_delete", 25 | ), 26 | url(r"^email_draft/", views.email_draft, name="email_draft"), 27 | url( 28 | r"^email_draft_delete/(?P\d+)/$", 29 | views.email_draft_delete, 30 | name="email_draft_delete", 31 | ), 32 | url(r"^email_imp/(?P\d+)/$", views.email_imp, name="email_imp"), 33 | url(r"^email_imp_list/", views.email_imp_list, name="email_imp_list"), 34 | url( 35 | r"^email_sent_edit/(?P\d+)/$", views.email_sent_edit, name="email_sent_edit" 36 | ), 37 | url(r"^email_unimp/(?P\d+)/$", views.email_unimp, name="email_unimp"), 38 | url(r"^email_view/(?P\d+)/$", views.email_view, name="email_view"), 39 | ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 40 | -------------------------------------------------------------------------------- /events/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/events/__init__.py -------------------------------------------------------------------------------- /events/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /events/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class EventsConfig(AppConfig): 5 | name = "events" 6 | -------------------------------------------------------------------------------- /events/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/events/migrations/__init__.py -------------------------------------------------------------------------------- /events/swagger_params1.py: -------------------------------------------------------------------------------- 1 | from drf_spectacular.types import OpenApiTypes 2 | from drf_spectacular.utils import OpenApiParameter 3 | 4 | organization_params_in_header = organization_params_in_header = OpenApiParameter( 5 | "org", OpenApiTypes.STR, OpenApiParameter.HEADER 6 | ) 7 | 8 | organization_params = [ 9 | organization_params_in_header, 10 | ] 11 | 12 | event_list_get_params = [ 13 | organization_params_in_header, 14 | OpenApiParameter("name", OpenApiTypes.STR,OpenApiParameter.QUERY), 15 | OpenApiParameter("created_by", OpenApiTypes.STR,OpenApiParameter.QUERY), 16 | OpenApiParameter("assigned_users", OpenApiTypes.STR,OpenApiParameter.QUERY), 17 | OpenApiParameter( 18 | "date_of_meeting", 19 | OpenApiParameter.QUERY, 20 | OpenApiTypes.DATE 21 | ), 22 | ] 23 | 24 | event_detail_post_params = [ 25 | organization_params_in_header, 26 | OpenApiParameter( 27 | "event_attachment", 28 | OpenApiParameter.QUERY, 29 | OpenApiTypes.BINARY 30 | ), 31 | OpenApiParameter("comment", OpenApiTypes.STR,OpenApiParameter.QUERY), 32 | ] 33 | 34 | event_comment_edit_params = [ 35 | organization_params_in_header, 36 | OpenApiParameter("comment", OpenApiTypes.STR,OpenApiParameter.QUERY), 37 | ] 38 | -------------------------------------------------------------------------------- /events/templates/assigned_to_email_template_event.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | Hello {{ user }} 5 | {% endblock heading %} 6 | 7 | 8 | {% block content_body %} 9 | You have been invited to the following event {{event_name}} created by {{event_created_by}} 10 | {% endblock content_body %} 11 | 12 | {% block extra_content %} 13 |

14 | When : {{event_date_of_meeting}} 15 |

16 | 17 | {% if other_members %} 18 |

19 | Who : {{other_members}} 20 |

21 | {% endif %} 22 | 23 | {% endblock extra_content %} 24 | 25 | 26 | {% block button_link %} 27 |
28 | Click 30 | Here 31 |
32 | {% endblock button_link %} -------------------------------------------------------------------------------- /events/tests_celery_tasks.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.test.utils import override_settings 3 | 4 | from events.tasks import send_email 5 | from events.tests import EventObjectTest 6 | 7 | 8 | class TestEventCeleryTasks(EventObjectTest, TestCase): 9 | @override_settings( 10 | CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, 11 | CELERY_ALWAYS_EAGER=True, 12 | BROKER_BACKEND="memory", 13 | ) 14 | def test_event_celery_tasks(self): 15 | task = send_email.apply((self.event.id, [self.user.id, self.user1.id])) 16 | self.assertEqual("SUCCESS", task.state) 17 | -------------------------------------------------------------------------------- /events/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from events import views 4 | 5 | app_name = "api_events" 6 | 7 | urlpatterns = [ 8 | path("", views.EventListView.as_view()), 9 | path("/", views.EventDetailView.as_view()), 10 | path("comment//", views.EventCommentView.as_view()), 11 | path("attachment//", views.EventAttachmentView.as_view()), 12 | ] 13 | -------------------------------------------------------------------------------- /installation.md: -------------------------------------------------------------------------------- 1 | # CRM Installation using docker 2 | 3 | - pull application image 4 | 5 | ```sh 6 | docker pull micropyramid/crm:0.1 7 | ``` 8 | 9 | - setup environment variables, below variables are required. 10 | 11 | ```sh 12 | # environment type, eg: stage, live 13 | export ENV_TYPE="" 14 | # sentry dns value, logs backend django project errors 15 | export SENTRY_DSN="" 16 | # sentry dns value, logs frontend react errors 17 | export REACT_APP_DSN="" 18 | # swagger api base/root url, eg: http://127.0.0.1 19 | export SWAGGER_ROOT_URL="" 20 | # postgresql database host address, eg: example.com or some ip address 21 | export DBHOST="" 22 | # postgresql database port 23 | export DBPORT="" 24 | # postgresql database name 25 | export DBNAME="" 26 | # postgresql database user name 27 | export DBUSER="" 28 | # postgresql database password 29 | export DBPASSWORD="" 30 | # s3 bucket name, required for storing media and static files. 31 | export S3_BUCKET_NAME="" 32 | # access key to access s3 bucket 33 | export AWS_ACCESS_KEY_ID="" 34 | # secret key to access s3 bucket 35 | export AWS_SECRET_ACCESS_KEY="" 36 | ``` 37 | 38 | - run application 39 | 40 | ```sh 41 | docker run \ 42 | -n crm \ 43 | -p 8000:80 \ 44 | -e ENV_TYPE="$ENV_TYPE" \ 45 | -e SENTRY_DSN="$SENTRY_DSN" \ 46 | -e REACT_APP_DSN="$REACT_APP_DSN" \ 47 | -e SWAGGER_ROOT_URL="$SWAGGER_ROOT_URL" \ 48 | -e DBHOST="$DBHOST" \ 49 | -e DBPORT="$DBPORT" \ 50 | -e DBNAME="$DBNAME" \ 51 | -e DBUSER="$DBUSER" \ 52 | -e DBPASSWORD="$DBPASSWORD" \ 53 | -e S3_BUCKET_NAME="$S3_BUCKET_NAME" \ 54 | -e AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" \ 55 | -e AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" \ 56 | micropyramid/crm:0.1 57 | ``` 58 | 59 | - GOTO: http://127.0.0.1:8000 60 | -------------------------------------------------------------------------------- /invoices/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/invoices/__init__.py -------------------------------------------------------------------------------- /invoices/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /invoices/api_urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from invoices import api_views 4 | 5 | app_name = "api_invoices" 6 | 7 | urlpatterns = [ 8 | path("", api_views.InvoiceListView.as_view()), 9 | path("/", api_views.InvoiceDetailView.as_view()), 10 | path("comment//", api_views.InvoiceCommentView.as_view()), 11 | path("attachment//", api_views.InvoiceAttachmentView.as_view()), 12 | ] 13 | -------------------------------------------------------------------------------- /invoices/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class InvoicesConfig(AppConfig): 5 | name = "invoices" 6 | -------------------------------------------------------------------------------- /invoices/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/invoices/migrations/__init__.py -------------------------------------------------------------------------------- /invoices/templates/assigned_to_email_template.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | 5 | Hello {{ user }} 6 | {% endblock heading %} 7 | 8 | 9 | {% block content_body %} 10 | {{invoice_created_by}} shared an invoice with you - {{invoice_title}} 11 | {% endblock content_body %} 12 | 13 | {% block button_link %} 14 |
15 | Click Here 17 |
18 | {% endblock button_link %} 19 | -------------------------------------------------------------------------------- /invoices/templates/invoice_cancelled.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template.html' %} 2 | 3 | {% block content_body %} 4 |

5 | 6 | Invoice has been Cancelled 7 | 8 |

9 | {% endblock content_body %} 10 | 11 | 12 | {% comment %} 13 | {% block button_link %} 14 |
15 | Click 17 | Here 18 |
19 | {% endblock button_link %} 20 | {% endcomment %} -------------------------------------------------------------------------------- /invoices/templates/invoice_detail_email.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block content_body %} 4 |

5 | 6 | An Invoice has been generated 7 | 8 |

9 | {% endblock content_body %} 10 | 11 | {% block button_link %} 12 |
13 | Click 15 | Here 16 |
17 | {% endblock button_link %} -------------------------------------------------------------------------------- /invoices/tests_celery_tasks.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.test.utils import override_settings 3 | 4 | from invoices.tasks import send_email, send_invoice_email, send_invoice_email_cancel 5 | from invoices.tests import InvoiceCreateTest 6 | 7 | 8 | class TestSendMailOnInvoiceCreationTask(InvoiceCreateTest, TestCase): 9 | @override_settings( 10 | CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, 11 | CELERY_ALWAYS_EAGER=True, 12 | BROKER_BACKEND="memory", 13 | ) 14 | def test_send_mail_on_invoice_creation_task(self): 15 | task = send_email.apply((self.invoice.id, [self.user.id, self.user1.id])) 16 | self.assertEqual("SUCCESS", task.state) 17 | 18 | task = send_invoice_email.apply((self.invoice.id,)) 19 | self.assertEqual("SUCCESS", task.state) 20 | 21 | task = send_invoice_email_cancel.apply((self.invoice.id,)) 22 | self.assertEqual("SUCCESS", task.state) 23 | -------------------------------------------------------------------------------- /invoices/urls.py: -------------------------------------------------------------------------------- 1 | # from django.urls import path 2 | # from invoices.views import * 3 | 4 | # app_name = "invoices" 5 | 6 | 7 | # urlpatterns = [ 8 | # path("", invoices_list, name="invoices_list"), 9 | # path("create/", invoices_create, name="invoices_create"), 10 | # path("detail//", invoice_details, name="invoice_details"), 11 | # path("edit//", invoice_edit, name="invoice_edit"), 12 | # path("delete//", invoice_delete, name="invoice_delete"), 13 | # path("download//", invoice_download, name="invoice_download"), 14 | # path("send-mail//", invoice_send_mail, name="invoice_send_mail"), 15 | # path( 16 | # "cancelled-mail//", 17 | # invoice_change_status_cancelled, 18 | # name="invoice_change_status_cancelled", 19 | # ), 20 | # path( 21 | # "paid-mail//", 22 | # invoice_change_status_paid, 23 | # name="invoice_change_status_paid", 24 | # ), 25 | # path("comment/add/", AddCommentView.as_view(), name="add_comment"), 26 | # path("comment/edit/", UpdateCommentView.as_view(), name="edit_comment"), 27 | # path("comment/remove/", DeleteCommentView.as_view(), name="remove_comment"), 28 | # path("attachment/add/", AddAttachmentView.as_view(), name="add_attachment"), 29 | # path( 30 | # "attachment/remove/", DeleteAttachmentsView.as_view(), name="remove_attachment" 31 | # ), 32 | # path("get_teams_and_users/", get_teams_and_users, name="get_teams_and_users"), 33 | # ] 34 | -------------------------------------------------------------------------------- /leads/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/leads/__init__.py -------------------------------------------------------------------------------- /leads/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from leads.models import Lead 4 | 5 | admin.site.register(Lead) 6 | -------------------------------------------------------------------------------- /leads/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class LeadsConfig(AppConfig): 5 | name = "leads" 6 | -------------------------------------------------------------------------------- /leads/migrations/0002_alter_lead_created_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-06-29 07:31 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 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('leads', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='lead', 18 | name='created_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /leads/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/leads/migrations/__init__.py -------------------------------------------------------------------------------- /leads/swagger_params1.py: -------------------------------------------------------------------------------- 1 | from drf_spectacular.types import OpenApiTypes 2 | from drf_spectacular.utils import OpenApiExample, OpenApiParameter, extend_schema 3 | 4 | organization_params_in_header = organization_params_in_header = OpenApiParameter( 5 | "org", OpenApiTypes.STR, OpenApiParameter.HEADER 6 | ) 7 | 8 | organization_params = [ 9 | organization_params_in_header, 10 | ] 11 | 12 | lead_list_get_params = [ 13 | organization_params_in_header, 14 | OpenApiParameter("title", OpenApiTypes.STR, OpenApiParameter.QUERY), 15 | OpenApiParameter("source", OpenApiTypes.STR, OpenApiParameter.QUERY), 16 | OpenApiParameter("assigned_to", OpenApiTypes.STR, OpenApiParameter.QUERY), 17 | OpenApiParameter( 18 | "status", 19 | OpenApiTypes.STR, 20 | OpenApiParameter.QUERY, 21 | enum=["assigned", "in process", "converted", "recycled", "closed"], 22 | ), 23 | OpenApiParameter("tags", OpenApiTypes.STR, OpenApiParameter.QUERY), 24 | ] 25 | -------------------------------------------------------------------------------- /leads/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from leads import views 4 | from .import views 5 | 6 | app_name = "api_leads" 7 | 8 | urlpatterns = [ 9 | path( 10 | "create-from-site/", 11 | views.CreateLeadFromSite.as_view(), 12 | name="create_lead_from_site", 13 | ), 14 | path("", views.LeadListView.as_view()), 15 | path("/", views.LeadDetailView.as_view()), 16 | path("upload/", views.LeadUploadView.as_view()), 17 | path("comment//", views.LeadCommentView.as_view()), 18 | path("attachment//", views.LeadAttachmentView.as_view()), 19 | path("companies",views.CompaniesView.as_view()), 20 | path('company/', views.CompanyDetail.as_view()), 21 | ] 22 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "crm.settings") 7 | os.environ["DJANGO_SETTINGS_MODULE"] = "crm.settings" 8 | try: 9 | from django.core.management import execute_from_command_line 10 | except ImportError: 11 | # The above import may fail for some other reason. Ensure that the 12 | # issue is really that Django is missing to avoid masking other 13 | # exceptions on Python 2. 14 | try: 15 | pass 16 | 17 | except ImportError: 18 | raise ImportError( 19 | "Couldn't import Django. Are you sure it's installed and " 20 | "available on your PYTHONPATH environment variable? Did you " 21 | "forget to activate a virtual environment?" 22 | ) 23 | raise 24 | execute_from_command_line(sys.argv) 25 | -------------------------------------------------------------------------------- /opportunity/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/opportunity/__init__.py -------------------------------------------------------------------------------- /opportunity/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from opportunity.models import Opportunity 4 | 5 | admin.site.register(Opportunity) 6 | -------------------------------------------------------------------------------- /opportunity/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class OpportunityConfig(AppConfig): 5 | name = "opportunity" 6 | -------------------------------------------------------------------------------- /opportunity/migrations/0002_alter_opportunity_created_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-10-31 12:35 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 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('opportunity', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='opportunity', 18 | name='created_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /opportunity/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/opportunity/migrations/__init__.py -------------------------------------------------------------------------------- /opportunity/swagger_params1.py: -------------------------------------------------------------------------------- 1 | from drf_spectacular.types import OpenApiTypes 2 | from drf_spectacular.utils import OpenApiParameter 3 | 4 | organization_params_in_header = organization_params_in_header = OpenApiParameter( 5 | "org", OpenApiTypes.STR, OpenApiParameter.HEADER 6 | ) 7 | 8 | organization_params = [ 9 | organization_params_in_header, 10 | ] 11 | 12 | 13 | opportunity_list_get_params = [ 14 | organization_params_in_header, 15 | OpenApiParameter("name", OpenApiTypes.STR,OpenApiParameter.QUERY), 16 | OpenApiParameter("account", OpenApiTypes.STR,OpenApiParameter.QUERY), 17 | OpenApiParameter("stage", OpenApiTypes.STR,OpenApiParameter.QUERY), 18 | OpenApiParameter("lead_source", OpenApiTypes.STR,OpenApiParameter.QUERY), 19 | OpenApiParameter("tags", OpenApiTypes.STR,OpenApiParameter.QUERY), 20 | ] 21 | 22 | opportunity_detail_get_params = [ 23 | organization_params_in_header, 24 | OpenApiParameter( 25 | "opportunity_attachment", 26 | OpenApiParameter.QUERY, 27 | OpenApiTypes.BINARY, 28 | ), 29 | OpenApiParameter("comment", OpenApiTypes.STR,OpenApiParameter.QUERY), 30 | ] 31 | 32 | opportunity_comment_edit_params = [ 33 | organization_params_in_header, 34 | OpenApiParameter("comment", OpenApiTypes.STR,OpenApiParameter.QUERY), 35 | ] 36 | -------------------------------------------------------------------------------- /opportunity/tasks.py: -------------------------------------------------------------------------------- 1 | from celery import Celery 2 | from django.conf import settings 3 | from django.core.mail import EmailMessage 4 | from django.template.loader import render_to_string 5 | 6 | from common.models import Profile 7 | from opportunity.models import Opportunity 8 | 9 | app = Celery("redis://") 10 | 11 | 12 | @app.task 13 | def send_email_to_assigned_user(recipients, opportunity_id): 14 | """Send Mail To Users When they are assigned to a opportunity""" 15 | opportunity = Opportunity.objects.get(id=opportunity_id) 16 | created_by = opportunity.created_by 17 | for user in recipients: 18 | recipients_list = [] 19 | profile = Profile.objects.filter(id=user, is_active=True).first() 20 | if profile: 21 | recipients_list.append(profile.user.email) 22 | context = {} 23 | context["url"] = settings.DOMAIN_NAME 24 | context["user"] = profile.user 25 | context["opportunity"] = opportunity 26 | context["created_by"] = created_by 27 | subject = "Assigned an opportunity for you." 28 | html_content = render_to_string( 29 | "assigned_to/opportunity_assigned.html", context=context 30 | ) 31 | 32 | msg = EmailMessage(subject, html_content, to=recipients_list) 33 | msg.content_subtype = "html" 34 | msg.send() 35 | -------------------------------------------------------------------------------- /opportunity/tests_celery_tasks.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.test.utils import override_settings 3 | 4 | from opportunity.tasks import send_email_to_assigned_user 5 | from opportunity.tests import OpportunityModel 6 | 7 | 8 | class TestCeleryTasks(OpportunityModel, TestCase): 9 | @override_settings( 10 | CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, 11 | CELERY_ALWAYS_EAGER=True, 12 | BROKER_BACKEND="memory", 13 | ) 14 | def test_celery_tasks(self): 15 | task = send_email_to_assigned_user.apply( 16 | ( 17 | [ 18 | self.user.id, 19 | self.user1.id, 20 | ], 21 | self.opportunity.id, 22 | ), 23 | ) 24 | self.assertEqual("SUCCESS", task.state) 25 | -------------------------------------------------------------------------------- /opportunity/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from opportunity import views 4 | 5 | app_name = "api_opportunities" 6 | 7 | urlpatterns = [ 8 | path("", views.OpportunityListView.as_view()), 9 | path("/", views.OpportunityDetailView.as_view()), 10 | path("comment//", views.OpportunityCommentView.as_view()), 11 | path("attachment//", views.OpportunityAttachmentView.as_view()), 12 | ] 13 | -------------------------------------------------------------------------------- /planner/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/planner/__init__.py -------------------------------------------------------------------------------- /planner/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Reminder 4 | 5 | # Register your models here. 6 | 7 | # admin.site.register(Event) 8 | admin.site.register(Reminder) 9 | -------------------------------------------------------------------------------- /planner/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PlannerConfig(AppConfig): 5 | name = "planner" 6 | -------------------------------------------------------------------------------- /planner/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/planner/migrations/__init__.py -------------------------------------------------------------------------------- /planner/serializer.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/planner/serializer.py -------------------------------------------------------------------------------- /planner/templates/reminder.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 |
3 | {{ reminder_form_set.management_form }} 4 | {% for form in reminder_form_set %} 5 |
6 | {{ form.reminder_type }} 7 | {{ form.reminder_time }} 8 | {{ form.DELETE }} 9 | {{ form.id }} 10 |
11 | {% endfor %} 12 |
13 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | DJANGO_SETTINGS_MODULE=crm.settings 3 | python_files = tests.py test_*.py *_tests.py 4 | 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | django==4.2.1 2 | celery==5.2.7 3 | python-dotenv==1.0.0 4 | django-cors-headers==4.0.0 5 | djangorestframework==3.14.0 6 | djangorestframework-simplejwt==5.2.2 7 | drf-spectacular==0.26.2 8 | django-ses==3.5.0 9 | psycopg2-binary==2.9.6 10 | whitenoise==6.4.0 11 | sentry-sdk==1.24.0 12 | wagtail==5.0.1 13 | django_extensions==3.2.1 14 | django_storages==1.13.2 15 | 16 | drf-rw-serializers==1.0.5 17 | django-crum==0.7.9 18 | Redis==4.6.0 19 | # remove it 20 | django-phonenumber-field==7.1.0 21 | arrow==1.2.3 22 | phonenumbers==8.13.13 23 | -------------------------------------------------------------------------------- /scripts/gunicorn.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euxo pipefail 4 | 5 | APP_NAME=bottlecrm-api 6 | 7 | cd /home/ubuntu/$APP_NAME/$APP_NAME 8 | . ../venv/bin/activate 9 | 10 | # debug 11 | whoami; pwd; ls -al; env 12 | 13 | exec gunicorn crm.wsgi:application \ 14 | --name $APP_NAME \ 15 | --workers 2 \ 16 | --threads 4 \ 17 | --worker-class gthread \ 18 | --worker-tmp-dir /dev/shm \ 19 | --bind 0.0.0.0:8000 \ 20 | --log-level debug 21 | -------------------------------------------------------------------------------- /scripts/migrate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euxo pipefail 4 | 5 | APP_NAME=bottlecrm-api 6 | 7 | cd /home/ubuntu/$APP_NAME/$APP_NAME 8 | . ../venv/bin/activate 9 | 10 | # debug 11 | whoami; pwd; ls -al; env 12 | 13 | exec python manage.py migrate 14 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from setuptools import find_packages, setup 4 | 5 | with open(os.path.join(os.path.dirname(__file__), "README.rst")) as readme: 6 | README = readme.read() 7 | 8 | # allow setup.py to be run from any path 9 | os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) 10 | PROJECT_NAME = "django_crm" 11 | 12 | data_files = [] 13 | for dirpath, dirnames, filenames in os.walk(PROJECT_NAME): 14 | for i, dirname in enumerate(dirnames): 15 | if dirname.startswith("."): 16 | del dirnames[i] 17 | if "__init__.py" in filenames: 18 | continue 19 | elif filenames: 20 | for f in filenames: 21 | data_files.append(os.path.join(dirpath[len(PROJECT_NAME) + 1 :], f)) 22 | 23 | setup( 24 | name="django-crm", 25 | version="0.7.0", 26 | packages=find_packages(exclude=["tests", "tests.*"]), 27 | include_package_data=True, 28 | description="An opensourse CRM developed on django framework", 29 | long_description=README, 30 | url="https://github.com/MicroPyramid/Django-CRM.git", 31 | author="Micropyramid", 32 | author_email="hello@micropyramid.com", 33 | classifiers=[ 34 | "Development Status :: 4 - Beta", 35 | "Framework :: Django", 36 | "License :: OSI Approved :: MIT License", 37 | "Programming Language :: Python", 38 | "Programming Language :: Python :: 3", 39 | "Programming Language :: Python :: 3.2", 40 | "Programming Language :: Python :: 3.3", 41 | "Programming Language :: Python :: 3.4", 42 | "Programming Language :: Python :: 3.5", 43 | "Programming Language :: Python :: 3.6", 44 | ], 45 | install_requires=[], 46 | ) 47 | -------------------------------------------------------------------------------- /static/assets/css/bootstrap.min.css.map: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/css/bootstrap.min.css.map -------------------------------------------------------------------------------- /static/assets/css/owl.theme.default.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Owl Carousel v2.3.4 3 | * Copyright 2013-2018 David Deutsch 4 | * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE 5 | */ 6 | .owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791} -------------------------------------------------------------------------------- /static/assets/css/owl.video.play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/css/owl.video.play.png -------------------------------------------------------------------------------- /static/assets/css/responsive.css.map: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/assets/css/showMoreItems-theme.min.css: -------------------------------------------------------------------------------- 1 | .showMoreItemsList{height: auto;overflow: hidden;list-style: none;}.showMoreItemsList .item{float: left;width: 33.33%;box-sizing: border-box;padding: 0 8px;}.showMoreItemsList .item .box{max-width: 400px;margin: 0 auto 30px;}.showMoreItemsList .item .name{text-align: center;}.showMoreItemsList .item .pic img{max-width: 100%}.showMoreItemsList + .button-box{text-align: center;clear: both;margin-bottom: 50px;}.showMoreItemsList + .button-box button{padding: 8px 20px;border:none;box-shadow: 0 0 0;outline: 0;cursor: pointer;background: #db3434; color: #fff; text-align: center; text-decoration: none; width: 158px; border-radius: 30px;}@media screen and (max-width:1280px){.showMoreItemsList .item{width: 50%;}}@media screen and (max-width:600px){.showMoreItemsList .item{width: 100%;}} -------------------------------------------------------------------------------- /static/assets/css/style.css.map: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/css/style.css.map -------------------------------------------------------------------------------- /static/assets/img/about/about-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/about/about-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/about/about-img2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/about/about-img2.png -------------------------------------------------------------------------------- /static/assets/img/about/about-img3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/about/about-img3.png -------------------------------------------------------------------------------- /static/assets/img/about/about-img4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/about/about-img4.png -------------------------------------------------------------------------------- /static/assets/img/about/about-img5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/about/about-img5.png -------------------------------------------------------------------------------- /static/assets/img/about/about-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/about/about-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/about/about-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/about/about-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/app-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/app-banner.png -------------------------------------------------------------------------------- /static/assets/img/app-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/app-download.png -------------------------------------------------------------------------------- /static/assets/img/apple-store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/apple-store.png -------------------------------------------------------------------------------- /static/assets/img/bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg1.jpg -------------------------------------------------------------------------------- /static/assets/img/bg10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg10.jpg -------------------------------------------------------------------------------- /static/assets/img/bg11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg11.jpg -------------------------------------------------------------------------------- /static/assets/img/bg12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg12.png -------------------------------------------------------------------------------- /static/assets/img/bg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg2.jpg -------------------------------------------------------------------------------- /static/assets/img/bg3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg3.jpg -------------------------------------------------------------------------------- /static/assets/img/bg4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg4.jpg -------------------------------------------------------------------------------- /static/assets/img/bg5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg5.jpg -------------------------------------------------------------------------------- /static/assets/img/bg6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg6.jpg -------------------------------------------------------------------------------- /static/assets/img/bg7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg7.jpg -------------------------------------------------------------------------------- /static/assets/img/bg8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg8.jpg -------------------------------------------------------------------------------- /static/assets/img/bg9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/bg9.jpg -------------------------------------------------------------------------------- /static/assets/img/blog-banner/blog-banner-list1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog-banner/blog-banner-list1.jpg -------------------------------------------------------------------------------- /static/assets/img/blog-banner/blog-banner-list2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog-banner/blog-banner-list2.jpg -------------------------------------------------------------------------------- /static/assets/img/blog-banner/blog-banner-list3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog-banner/blog-banner-list3.jpg -------------------------------------------------------------------------------- /static/assets/img/blog-banner/blog-banner-list4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog-banner/blog-banner-list4.jpg -------------------------------------------------------------------------------- /static/assets/img/blog-banner/blog-banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog-banner/blog-banner.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img10.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img11.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img12.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img13.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img14.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img15.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img16.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img17.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img18.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img19.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img20.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img21.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img22.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img23.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img24.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img25.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img26.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img27.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img8.jpg -------------------------------------------------------------------------------- /static/assets/img/blog/blog-img9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/blog/blog-img9.jpg -------------------------------------------------------------------------------- /static/assets/img/business-banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/business-banner.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img10.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img11.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img8.jpg -------------------------------------------------------------------------------- /static/assets/img/categories/categories-img9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/categories/categories-img9.jpg -------------------------------------------------------------------------------- /static/assets/img/coming-soon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/coming-soon.jpg -------------------------------------------------------------------------------- /static/assets/img/consulting-banner-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/consulting-banner-bg.jpg -------------------------------------------------------------------------------- /static/assets/img/cta-bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/cta-bg1.jpg -------------------------------------------------------------------------------- /static/assets/img/custom-ads.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/custom-ads.jpg -------------------------------------------------------------------------------- /static/assets/img/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/error.png -------------------------------------------------------------------------------- /static/assets/img/facility-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/facility-img.png -------------------------------------------------------------------------------- /static/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/favicon.png -------------------------------------------------------------------------------- /static/assets/img/featured-video/featured-video1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/featured-video/featured-video1.jpg -------------------------------------------------------------------------------- /static/assets/img/featured-video/featured-video2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/featured-video/featured-video2.jpg -------------------------------------------------------------------------------- /static/assets/img/featured-video/featured-video3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/featured-video/featured-video3.jpg -------------------------------------------------------------------------------- /static/assets/img/featured-video/featured-video4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/featured-video/featured-video4.jpg -------------------------------------------------------------------------------- /static/assets/img/featured-video/featured-video5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/featured-video/featured-video5.jpg -------------------------------------------------------------------------------- /static/assets/img/furniture-banner-bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/furniture-banner-bg1.jpg -------------------------------------------------------------------------------- /static/assets/img/furniture-banner-bg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/furniture-banner-bg2.jpg -------------------------------------------------------------------------------- /static/assets/img/furniture-banner-bg3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/furniture-banner-bg3.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img8.jpg -------------------------------------------------------------------------------- /static/assets/img/gallery/gallery-img9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/gallery/gallery-img9.jpg -------------------------------------------------------------------------------- /static/assets/img/how-it-works.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/how-it-works.png -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img10.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img11.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img12.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img13.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img14.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img15.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img16.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img8.jpg -------------------------------------------------------------------------------- /static/assets/img/instagram/instagram-img9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/instagram/instagram-img9.jpg -------------------------------------------------------------------------------- /static/assets/img/it-agency-banner-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/it-agency-banner-bg.jpg -------------------------------------------------------------------------------- /static/assets/img/latest-posts/latest-posts1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/latest-posts/latest-posts1.jpg -------------------------------------------------------------------------------- /static/assets/img/latest-posts/latest-posts2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/latest-posts/latest-posts2.jpg -------------------------------------------------------------------------------- /static/assets/img/latest-posts/latest-posts3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/latest-posts/latest-posts3.jpg -------------------------------------------------------------------------------- /static/assets/img/latest-posts/latest-posts4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/latest-posts/latest-posts4.jpg -------------------------------------------------------------------------------- /static/assets/img/latest-posts/latest-posts5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/latest-posts/latest-posts5.jpg -------------------------------------------------------------------------------- /static/assets/img/logo-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-app.png -------------------------------------------------------------------------------- /static/assets/img/logo-blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-blog.png -------------------------------------------------------------------------------- /static/assets/img/logo-business.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-business.png -------------------------------------------------------------------------------- /static/assets/img/logo-consulting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-consulting.png -------------------------------------------------------------------------------- /static/assets/img/logo-it-agency.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-it-agency.png -------------------------------------------------------------------------------- /static/assets/img/logo-marketing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-marketing.png -------------------------------------------------------------------------------- /static/assets/img/logo-personal-portfolio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-personal-portfolio.png -------------------------------------------------------------------------------- /static/assets/img/logo-shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-shop.png -------------------------------------------------------------------------------- /static/assets/img/logo-startup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-startup.png -------------------------------------------------------------------------------- /static/assets/img/logo-white-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-white-app.png -------------------------------------------------------------------------------- /static/assets/img/logo-white-blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-white-blog.png -------------------------------------------------------------------------------- /static/assets/img/logo-white-business.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-white-business.png -------------------------------------------------------------------------------- /static/assets/img/logo-white-saas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-white-saas.png -------------------------------------------------------------------------------- /static/assets/img/logo-white-shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-white-shop.png -------------------------------------------------------------------------------- /static/assets/img/logo-white-startup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/logo-white-startup.png -------------------------------------------------------------------------------- /static/assets/img/marketing-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/marketing-banner.png -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg-image1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg-image1.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg-image2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg-image2.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg-image3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg-image3.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg-image4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg-image4.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg-image5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg-image5.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg1.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg2.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg3.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg4.jpg -------------------------------------------------------------------------------- /static/assets/img/page-title/page-title-bg5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/page-title/page-title-bg5.jpg -------------------------------------------------------------------------------- /static/assets/img/partner/partner-white1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner-white1.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner-white2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner-white2.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner-white3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner-white3.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner-white4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner-white4.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner-white5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner-white5.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner-white6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner-white6.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner1.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner2.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner3.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner4.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner5.png -------------------------------------------------------------------------------- /static/assets/img/partner/partner6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/partner/partner6.png -------------------------------------------------------------------------------- /static/assets/img/personal-portfolio-banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/personal-portfolio-banner.jpg -------------------------------------------------------------------------------- /static/assets/img/play-store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/play-store.png -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img10.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img11.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img12.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img8.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-img9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/portfolio/portfolio-img9.jpg -------------------------------------------------------------------------------- /static/assets/img/process/process1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/process/process1.png -------------------------------------------------------------------------------- /static/assets/img/process/process2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/process/process2.png -------------------------------------------------------------------------------- /static/assets/img/process/process3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/process/process3.png -------------------------------------------------------------------------------- /static/assets/img/products/products-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img10.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img11.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img12.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img13.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img14.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img15.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img16.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img17.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img18.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img19.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img20.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img8.jpg -------------------------------------------------------------------------------- /static/assets/img/products/products-img9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/products/products-img9.jpg -------------------------------------------------------------------------------- /static/assets/img/saas-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/saas-banner.png -------------------------------------------------------------------------------- /static/assets/img/screenshot/frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/screenshot/frame.png -------------------------------------------------------------------------------- /static/assets/img/screenshot/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/screenshot/screenshot1.png -------------------------------------------------------------------------------- /static/assets/img/screenshot/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/screenshot/screenshot2.png -------------------------------------------------------------------------------- /static/assets/img/screenshot/screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/screenshot/screenshot3.png -------------------------------------------------------------------------------- /static/assets/img/screenshot/screenshot4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/screenshot/screenshot4.png -------------------------------------------------------------------------------- /static/assets/img/screenshot/screenshot5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/screenshot/screenshot5.png -------------------------------------------------------------------------------- /static/assets/img/services/services-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img10.png -------------------------------------------------------------------------------- /static/assets/img/services/services-img11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img11.png -------------------------------------------------------------------------------- /static/assets/img/services/services-img12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img12.png -------------------------------------------------------------------------------- /static/assets/img/services/services-img13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img13.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img14.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img15.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img16.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img17.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img18.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/services/services-img7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img7.png -------------------------------------------------------------------------------- /static/assets/img/services/services-img8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img8.png -------------------------------------------------------------------------------- /static/assets/img/services/services-img9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/services/services-img9.png -------------------------------------------------------------------------------- /static/assets/img/shape/border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/border.png -------------------------------------------------------------------------------- /static/assets/img/shape/border2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/border2.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape1.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape10.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape11.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape12.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape13.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape14.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape15.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape16.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape17.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape18.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape19.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape2.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape3.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape4.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape5.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape6.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape7.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape8.png -------------------------------------------------------------------------------- /static/assets/img/shape/shape9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shape/shape9.png -------------------------------------------------------------------------------- /static/assets/img/shop-banner-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/shop-banner-bg.jpg -------------------------------------------------------------------------------- /static/assets/img/signature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/signature.png -------------------------------------------------------------------------------- /static/assets/img/skills/skills-img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/skills/skills-img1.png -------------------------------------------------------------------------------- /static/assets/img/skills/skills-img2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/skills/skills-img2.png -------------------------------------------------------------------------------- /static/assets/img/skills/skills-img3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/skills/skills-img3.png -------------------------------------------------------------------------------- /static/assets/img/skills/skills-img4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/skills/skills-img4.png -------------------------------------------------------------------------------- /static/assets/img/startup-banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/startup-banner.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img8.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-img9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/team/team-img9.jpg -------------------------------------------------------------------------------- /static/assets/img/testimonials/testimonials-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/testimonials/testimonials-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/testimonials/testimonials-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/testimonials/testimonials-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/testimonials/testimonials-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/testimonials/testimonials-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/testimonials/testimonials-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/testimonials/testimonials-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/testimonials/testimonials-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/testimonials/testimonials-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/testimonials/testimonials-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/testimonials/testimonials-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/trending-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/trending-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/trending-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/trending-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/user/user1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/user/user1.jpg -------------------------------------------------------------------------------- /static/assets/img/user/user2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/user/user2.jpg -------------------------------------------------------------------------------- /static/assets/img/user/user3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/user/user3.jpg -------------------------------------------------------------------------------- /static/assets/img/user/user4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/user/user4.jpg -------------------------------------------------------------------------------- /static/assets/img/user/user5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/user/user5.jpg -------------------------------------------------------------------------------- /static/assets/img/video-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/video-img.jpg -------------------------------------------------------------------------------- /static/assets/img/video-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/video-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/what-we-do.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/what-we-do.jpg -------------------------------------------------------------------------------- /static/assets/img/who-we-are.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/who-we-are.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img1.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img10.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img11.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img12.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img13.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img14.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img15.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img16.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img17.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img18.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img2.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img3.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img4.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img5.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img6.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img7.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img8.jpg -------------------------------------------------------------------------------- /static/assets/img/works/works-img9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/img/works/works-img9.jpg -------------------------------------------------------------------------------- /static/assets/webfonts/Flaticon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/Flaticon.eot -------------------------------------------------------------------------------- /static/assets/webfonts/Flaticon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/Flaticon.ttf -------------------------------------------------------------------------------- /static/assets/webfonts/Flaticon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/Flaticon.woff -------------------------------------------------------------------------------- /static/assets/webfonts/Flaticon.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/Flaticon.woff2 -------------------------------------------------------------------------------- /static/assets/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /static/assets/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /static/assets/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /static/assets/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /static/assets/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /static/assets/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /static/assets/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /static/assets/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /static/assets/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /static/assets/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /static/assets/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /static/assets/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/static/assets/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /system_requirements.txt: -------------------------------------------------------------------------------- 1 | sudo apt-get update && apt-get upgrade -y 2 | 3 | sudo apt-get install -y curl wget libpq-dev python3-dev gem ruby ruby-dev build-essential libssl-dev libffi-dev python-dev python-virtualenv python-pip git redis-server libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev libharfbuzz-dev libfribidi-dev tcl8.6-dev tk8.6-dev python-tk 4 | 5 | sudo gem install sass 6 | 7 | sudo apt-get install wkhtmltopdf 8 | 9 | sudo apt-get install postfix -------------------------------------------------------------------------------- /tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/tasks/__init__.py -------------------------------------------------------------------------------- /tasks/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from tasks.models import Task 4 | 5 | # Register your models here. 6 | 7 | admin.site.register(Task) 8 | -------------------------------------------------------------------------------- /tasks/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class TasksConfig(AppConfig): 5 | name = "tasks" 6 | -------------------------------------------------------------------------------- /tasks/migrations/0002_alter_task_created_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-10-31 12:42 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 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('tasks', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='task', 18 | name='created_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /tasks/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/tasks/migrations/__init__.py -------------------------------------------------------------------------------- /tasks/swagger_params1.py: -------------------------------------------------------------------------------- 1 | from drf_spectacular.types import OpenApiTypes 2 | from drf_spectacular.utils import OpenApiParameter 3 | 4 | organization_params_in_header = organization_params_in_header = OpenApiParameter( 5 | "org", OpenApiTypes.STR, OpenApiParameter.HEADER 6 | ) 7 | 8 | organization_params = [ 9 | organization_params_in_header, 10 | ] 11 | 12 | task_list_get_params = [ 13 | organization_params_in_header, 14 | OpenApiParameter("title", OpenApiTypes.STR,OpenApiParameter.QUERY), 15 | OpenApiParameter("status", OpenApiTypes.STR,OpenApiParameter.QUERY), 16 | OpenApiParameter("priority", OpenApiTypes.STR,OpenApiParameter.QUERY), 17 | ] 18 | -------------------------------------------------------------------------------- /tasks/templates/tasks_email_template.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | 5 | Hello {{ user }} 6 | {% endblock heading %} 7 | 8 | 9 | {% block content_body %} 10 | 11 | {{task_created_by}} assigned a task for you - {{task_title}} 12 | 13 | {% endblock content_body %} 14 | 15 | {% block button_link %} 16 |
17 | click 19 | here 20 |
21 | {% endblock button_link %} -------------------------------------------------------------------------------- /tasks/tests_celery_tasks.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.test.utils import override_settings 3 | 4 | from tasks.celery_tasks import send_email 5 | from tasks.tests import TaskCreateTest 6 | 7 | 8 | class TestEventCeleryTasks(TaskCreateTest, TestCase): 9 | @override_settings( 10 | CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, 11 | CELERY_ALWAYS_EAGER=True, 12 | BROKER_BACKEND="memory", 13 | ) 14 | def test_event_celery_tasks(self): 15 | task = send_email.apply( 16 | ( 17 | self.task.id, 18 | [ 19 | self.user.id, 20 | self.user1.id, 21 | ], 22 | ) 23 | ) 24 | self.assertEqual("SUCCESS", task.state) 25 | -------------------------------------------------------------------------------- /tasks/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from tasks import views 4 | 5 | app_name = "api_tasks" 6 | 7 | urlpatterns = [ 8 | path("", views.TaskListView.as_view()), 9 | path("/", views.TaskDetailView.as_view()), 10 | path("comment//", views.TaskCommentView.as_view()), 11 | path("attachment//", views.TaskAttachmentView.as_view()), 12 | ] 13 | -------------------------------------------------------------------------------- /tasks/utils.py: -------------------------------------------------------------------------------- 1 | STATUS_CHOICES = ( 2 | ("New", "New"), 3 | ("In Progress", "In Progress"), 4 | ("Completed", "Completed"), 5 | ) 6 | 7 | PRIORITY_CHOICES = (("Low", "Low"), ("Medium", "Medium"), ("High", "High")) 8 | -------------------------------------------------------------------------------- /teams/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/teams/__init__.py -------------------------------------------------------------------------------- /teams/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /teams/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class TeamsConfig(AppConfig): 5 | name = "teams" 6 | -------------------------------------------------------------------------------- /teams/migrations/0002_alter_teams_table.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-07-12 09:52 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('teams', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelTable( 14 | name='teams', 15 | table='teams', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /teams/migrations/0003_alter_teams_created_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.1 on 2023-07-24 08:19 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 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('teams', '0002_alter_teams_table'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='teams', 18 | name='created_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /teams/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicroPyramid/Django-CRM/59a5fa607f6d808acd08cbf077a96233bdab8544/teams/migrations/__init__.py -------------------------------------------------------------------------------- /teams/models.py: -------------------------------------------------------------------------------- 1 | import arrow 2 | from django.db import models 3 | from django.utils.translation import gettext_lazy as _ 4 | 5 | from common.models import Org, Profile 6 | from common.base import BaseModel 7 | 8 | 9 | 10 | class Teams(BaseModel): 11 | name = models.CharField(max_length=100) 12 | description = models.TextField() 13 | users = models.ManyToManyField(Profile, related_name="user_teams") 14 | created_on = models.DateTimeField(_("Created on"), auto_now_add=True) 15 | org = models.ForeignKey(Org, on_delete=models.SET_NULL, null=True, blank=True) 16 | 17 | class Meta: 18 | verbose_name = "Team" 19 | verbose_name_plural = "Teams" 20 | db_table = "teams" 21 | ordering = ("-created_at",) 22 | 23 | def __str__(self): 24 | return f"{self.name}" 25 | 26 | @property 27 | def created_on_arrow(self): 28 | return arrow.get(self.created_on).humanize() 29 | 30 | def get_users(self): 31 | return ",".join( 32 | [str(_id) for _id in list(self.users.values_list("id", flat=True))] 33 | ) 34 | # return ','.join(list(self.users.values_list('id', flat=True))) 35 | -------------------------------------------------------------------------------- /teams/swagger_params1.py: -------------------------------------------------------------------------------- 1 | from drf_spectacular.types import OpenApiTypes 2 | from drf_spectacular.utils import OpenApiParameter 3 | 4 | organization_params_in_header = organization_params_in_header = OpenApiParameter( 5 | "org", OpenApiTypes.STR, OpenApiParameter.HEADER 6 | ) 7 | 8 | organization_params = [ 9 | organization_params_in_header, 10 | ] 11 | 12 | teams_list_get_params = [ 13 | organization_params_in_header, 14 | OpenApiParameter("team_name", OpenApiTypes.STR,OpenApiParameter.QUERY), 15 | OpenApiParameter("created_by", OpenApiTypes.STR,OpenApiParameter.QUERY), 16 | OpenApiParameter("assigned_users", OpenApiTypes.STR,OpenApiParameter.QUERY), 17 | ] 18 | -------------------------------------------------------------------------------- /teams/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from teams import views 4 | 5 | app_name = "api_leads" 6 | 7 | urlpatterns = [ 8 | path("", views.TeamsListView.as_view()), 9 | path("/", views.TeamsDetailView.as_view()), 10 | ] 11 | -------------------------------------------------------------------------------- /templates/assigned_to/account_assigned.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | 5 | Hi {{ user.get_username }} 6 | {% endblock heading %} 7 | 8 | 9 | {% block content_body %} 10 | {{created_by}} assigned a account for you - {{account}}
11 | {% endblock content_body %} 12 | 13 | {% block button_link %} 14 |
15 | Click Here 17 |
18 | {% endblock button_link %} -------------------------------------------------------------------------------- /templates/assigned_to/cases_assigned.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | 5 | Hello {{ user.get_username }} 6 | {% endblock heading %} 7 | 8 | 9 | {% block content_body %} 10 | {{created_by}} assigned a case for you - {{ case.name }}
11 | {% endblock content_body %} 12 | 13 | {% block button_link %} 14 |
15 | Click Here 17 |
18 | {% endblock button_link %} -------------------------------------------------------------------------------- /templates/assigned_to/contact_assigned.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | 5 | Hi {{ user.get_username }} 6 | {% endblock heading %} 7 | 8 | 9 | {% block content_body %} 10 | {{created_by}} assigned a contact for you - {{contact}}
11 | {% endblock content_body %} 12 | 13 | {% block button_link %} 14 |
15 | Click Here 17 |
18 | {% endblock button_link %} -------------------------------------------------------------------------------- /templates/assigned_to/leads_assigned.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | 5 | Hi {{ user.get_username }} 6 | {% endblock heading %} 7 | 8 | 9 | {% block content_body %} 10 | 11 | {% if created_by %} 12 | {{created_by}} assigned a lead for you - {{ lead.title }}
13 | {% else %} 14 | A lead has been assigned for you - {{ lead.title }}
15 | 16 | {% if source %} 17 |

18 | Source: {{ source }}
19 |

20 | {% endif %} 21 | 22 | {% endif %} 23 | 24 | {% endblock content_body %} 25 | 26 | {% block button_link %} 27 |
28 | Click 30 | Here 31 |
32 | {% endblock button_link %} -------------------------------------------------------------------------------- /templates/assigned_to/opportunity_assigned.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | 3 | {% block heading %} 4 | 5 | Hello {{ user.get_username }} 6 | {% endblock heading %} 7 | 8 | 9 | {% block content_body %} 10 | {{created_by}} assigned an opportunity for you - {{ opportunity.name }}
11 | {% endblock content_body %} 12 | 13 | {% block button_link %} 14 |
15 | Click Here 17 |
18 | {% endblock button_link %} -------------------------------------------------------------------------------- /templates/cms/home_page.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends 'cms_base.html' %} 3 | {% load wagtailcore_tags static %} 4 | 5 | {% block content %} 6 | 7 | {% for block in page.content %} 8 | 9 |
{% include_block block %}
10 | 11 | {% endfor %} 12 | 13 | {% endblock content %} 14 | -------------------------------------------------------------------------------- /templates/cms/streams/aboutapp.html: -------------------------------------------------------------------------------- 1 | {% load wagtailimages_tags static %} 2 | 3 | 4 |
5 |
6 |
7 |

{{ self.heading }}

8 |

{{ self.paragraph }}

9 |
10 | 11 |
12 |
13 |
14 |

{{ self.sub_heading }}

15 |

{{ self.sub_paragraph }}

16 | 17 |
    18 | {% for link in self.links %} 19 |
  • {{ link.text }}
  • 20 | {% endfor %} 21 |
22 | {% if self.cta_url %} 23 | {{ self.cta_text }} 24 | {% else %} 25 | {{ self.cta_text }} 26 | {% endif %} 27 | 28 |
29 |
30 | 31 |
32 |
33 | image 34 |
35 |
36 |
37 |
38 |
39 | -------------------------------------------------------------------------------- /templates/cms/streams/app_features.html: -------------------------------------------------------------------------------- 1 | {% load wagtailcore_tags static %} 2 | 3 | 4 |
5 |
6 |
7 |

{{ self.heading }}

8 |

{{ self.description }}

9 |
10 | 11 |
12 | {% for card in self.cards %} 13 |
14 |
15 | 16 |

{{ card.card_heading }}s

17 |

{{ card.card_description }}

18 |
19 |
20 | {% endfor %} 21 |
22 |
23 |
image
24 |
25 | 26 | -------------------------------------------------------------------------------- /templates/cms/streams/blog/code_block.html: -------------------------------------------------------------------------------- 1 | 2 |
{{ self }}
-------------------------------------------------------------------------------- /templates/cms/streams/blog/content_title.html: -------------------------------------------------------------------------------- 1 |

{{ self }}

-------------------------------------------------------------------------------- /templates/cms/streams/blog/image.html: -------------------------------------------------------------------------------- 1 | {% load wagtailimages_tags %} 2 | 3 | {% image self scale-100 as tmp_photo %} 4 |
{{ tmp_photo.alt }}
-------------------------------------------------------------------------------- /templates/cms/streams/blog/rich_text.html: -------------------------------------------------------------------------------- 1 |

{{ self }}

-------------------------------------------------------------------------------- /templates/cms/streams/carousel.html: -------------------------------------------------------------------------------- 1 | {% load wagtailcore_tags wagtailimages_tags static %} 2 | 3 |
4 |
5 |
6 | 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /templates/cms/streams/count.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 |
6 |
7 | {% for link in self.links %} 8 |
9 |
10 |

{{ link.count_value }}

11 | {{ link.text }} 12 |
13 |
14 | {% endfor %} 15 | 16 |
17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /templates/cms/streams/pricing.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 |
7 |

{{ self.heading }}

8 |

{{ self.description }}

9 |
10 | 11 |
12 | {% for card in self.cards %} 13 |
14 |
15 |
16 |

{{ card.card_heading }}

17 | {{ card.card_price }}/year 18 |
19 |
    20 |
  • {{ card.card_description }}
  • 21 | 22 |
23 | {% if card.cta_url %} 24 | {{ card.cta_text }} 25 | {% else %} 26 | {{ card.cta_text }} 27 | {% endif %} 28 |
29 |
30 | {% endfor %} 31 | 32 | 33 |
34 |
35 |
36 | -------------------------------------------------------------------------------- /templates/healthz.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | healthz 7 | 27 | 28 | 29 |
30 |

healthz

31 |
32 |
33 | 34 | 35 | -------------------------------------------------------------------------------- /templates/registration/password_reset_email.html: -------------------------------------------------------------------------------- 1 | {% extends 'root_email_template_new.html' %} 2 | {% block content %} 3 | {% block heading %} 4 | Set a New Password 5 | {% endblock heading %} 6 | 7 | {% block content_body %} 8 | Click the below link to Set a New Password to login and enjoy the features of Bottle CRM. 9 | {% endblock content_body %} 10 | 11 | {% block button_link %} 12 |

13 | {{complete_url}} 14 |

15 | {% endblock button_link %} 16 | 17 | {% block extra_content %} 18 |

19 | This link will be valid for 3 days. 20 | Please ignore this email, if you did not request to set New Password. 21 |

22 | {% endblock extra_content %} 23 | {% endblock %} --------------------------------------------------------------------------------