├── myproject ├── __init__.py ├── core │ ├── __init__.py │ ├── admin.py │ ├── static │ │ ├── css │ │ │ ├── simple-line-icons │ │ │ │ ├── .npmignore │ │ │ │ ├── fonts │ │ │ │ │ ├── Simple-Line-Icons.eot │ │ │ │ │ ├── Simple-Line-Icons.ttf │ │ │ │ │ ├── Simple-Line-Icons.woff │ │ │ │ │ └── Simple-Line-Icons.woff2 │ │ │ │ └── css │ │ │ │ │ └── simple-line-icons.css │ │ │ ├── font-awesome │ │ │ │ ├── fonts │ │ │ │ │ ├── FontAwesome.otf │ │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ │ └── .npmignore │ │ │ └── flag-icon-css │ │ │ │ ├── .editorconfig │ │ │ │ └── flags │ │ │ │ └── 4x3 │ │ │ │ ├── pl.svg │ │ │ │ ├── fr.svg │ │ │ │ ├── in.svg │ │ │ │ ├── us.svg │ │ │ │ └── br.svg │ │ ├── img │ │ │ ├── avatars │ │ │ │ ├── 1.jpg │ │ │ │ ├── 2.jpg │ │ │ │ ├── 3.jpg │ │ │ │ ├── 4.jpg │ │ │ │ ├── 5.jpg │ │ │ │ ├── 6.jpg │ │ │ │ ├── 7.jpg │ │ │ │ └── 8.jpg │ │ │ └── brand │ │ │ │ ├── logo.png │ │ │ │ ├── sygnet.svg │ │ │ │ └── logo.svg │ │ ├── landpage │ │ │ ├── assets │ │ │ │ ├── .DS_Store │ │ │ │ ├── css │ │ │ │ │ ├── .DS_Store │ │ │ │ │ ├── masonry.css │ │ │ │ │ ├── pushy.css │ │ │ │ │ ├── odometer-theme-default.css │ │ │ │ │ └── magnific-popup.css │ │ │ │ └── js │ │ │ │ │ ├── masonry.js │ │ │ │ │ ├── ie10-viewport-bug-workaround.js │ │ │ │ │ ├── pushy.min.js │ │ │ │ │ ├── scripts.js │ │ │ │ │ ├── ie-emulation-modes-warning.js │ │ │ │ │ ├── wow.min.js │ │ │ │ │ └── holder.min.js │ │ │ └── css │ │ │ │ └── style.css │ │ └── js │ │ │ ├── modal.js │ │ │ ├── ui.datepicker-pt-BR.js │ │ │ ├── custom-tooltips.min.js │ │ │ ├── coreui.min.js │ │ │ ├── main.js │ │ │ └── pace.min.js │ ├── tests.py │ ├── apps.py │ ├── templates │ │ ├── includes │ │ │ ├── breadcrumb.html │ │ │ ├── breadcrumb_detail.html │ │ │ ├── footer.html │ │ │ ├── breadcrumb_update.html │ │ │ ├── sidebar.html │ │ │ ├── nav.html │ │ │ └── aside-menu.html │ │ ├── modal │ │ │ └── modal_delete.html │ │ ├── base.html │ │ └── dashboard.html │ ├── actions.py │ ├── mixins.py │ ├── urls.py │ ├── views.py │ └── models.py ├── crm │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── 0002_auto_20180416_2146.py │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── mixins.py │ ├── managers.py │ ├── urls.py │ ├── views.py │ ├── templates │ │ └── crm │ │ │ ├── customer_form.html │ │ │ ├── customer_detail.html │ │ │ └── customer_list.html │ ├── admin.py │ ├── forms.py │ └── models.py ├── accounts │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── views.py │ ├── urls.py │ ├── models.py │ ├── forms.py │ ├── admin.py │ └── templates │ │ └── accounts │ │ ├── login.html │ │ └── register.html ├── urls.py ├── wsgi.py ├── utils │ └── lists.py └── settings.py ├── requirements.txt ├── README.md ├── manage.py ├── contrib └── env_gen.py └── .gitignore /myproject/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /myproject/core/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /myproject/crm/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /myproject/accounts/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /myproject/crm/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /myproject/accounts/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /myproject/core/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /myproject/core/static/css/simple-line-icons/.npmignore: -------------------------------------------------------------------------------- 1 | .* 2 | !.gitignore 3 | *.log 4 | *~ 5 | *# -------------------------------------------------------------------------------- /myproject/core/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /myproject/crm/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /myproject/accounts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /myproject/core/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoreConfig(AppConfig): 5 | name = 'core' 6 | -------------------------------------------------------------------------------- /myproject/core/static/img/avatars/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/avatars/1.jpg -------------------------------------------------------------------------------- /myproject/core/static/img/avatars/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/avatars/2.jpg -------------------------------------------------------------------------------- /myproject/core/static/img/avatars/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/avatars/3.jpg -------------------------------------------------------------------------------- /myproject/core/static/img/avatars/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/avatars/4.jpg -------------------------------------------------------------------------------- /myproject/core/static/img/avatars/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/avatars/5.jpg -------------------------------------------------------------------------------- /myproject/core/static/img/avatars/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/avatars/6.jpg -------------------------------------------------------------------------------- /myproject/core/static/img/avatars/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/avatars/7.jpg -------------------------------------------------------------------------------- /myproject/core/static/img/avatars/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/avatars/8.jpg -------------------------------------------------------------------------------- /myproject/core/static/img/brand/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/img/brand/logo.png -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/landpage/assets/.DS_Store -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/css/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/landpage/assets/css/.DS_Store -------------------------------------------------------------------------------- /myproject/core/templates/includes/breadcrumb.html: -------------------------------------------------------------------------------- 1 | {% block breadcrumb %} 2 | 3 | 4 | 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /myproject/crm/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CrmConfig(AppConfig): 5 | name = 'myproject.crm' 6 | verbose_name = 'CRM' 7 | -------------------------------------------------------------------------------- /myproject/core/static/css/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /myproject/accounts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AccountsConfig(AppConfig): 5 | name = 'myproject.accounts' 6 | verbose_name = 'Contas' 7 | -------------------------------------------------------------------------------- /myproject/core/static/css/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /myproject/core/static/css/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /myproject/core/static/css/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /myproject/core/static/css/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /myproject/core/static/css/simple-line-icons/fonts/Simple-Line-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/simple-line-icons/fonts/Simple-Line-Icons.eot -------------------------------------------------------------------------------- /myproject/core/static/css/simple-line-icons/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/simple-line-icons/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /myproject/core/static/css/simple-line-icons/fonts/Simple-Line-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/simple-line-icons/fonts/Simple-Line-Icons.woff -------------------------------------------------------------------------------- /myproject/core/static/css/simple-line-icons/fonts/Simple-Line-Icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/crm2/master/myproject/core/static/css/simple-line-icons/fonts/Simple-Line-Icons.woff2 -------------------------------------------------------------------------------- /myproject/core/actions.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import get_object_or_404 2 | 3 | 4 | def _delete(model, pk): 5 | obj = get_object_or_404(model, pk=pk) 6 | obj.active = False 7 | obj.save() 8 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | dj-database-url==0.5.0 2 | Django==2.0.4 3 | django-extensions==2.0.6 4 | django-localflavor==2.0 5 | django-widget-tweaks==1.4.2 6 | Pillow==5.1.0 7 | python-decouple==3.1 8 | pytz==2018.3 9 | -------------------------------------------------------------------------------- /myproject/core/mixins.py: -------------------------------------------------------------------------------- 1 | class ActiveMixin(object): 2 | 3 | def get_queryset(self): 4 | queryset = super(ActiveMixin, self).get_queryset() 5 | queryset = queryset.filter(active=True) 6 | return queryset 7 | -------------------------------------------------------------------------------- /myproject/core/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from myproject.core import views as v 3 | 4 | app_name = 'core' 5 | 6 | urlpatterns = [ 7 | path('', v.index, name='index'), 8 | path('dashboard/', v.dashboard, name='dashboard'), 9 | ] 10 | -------------------------------------------------------------------------------- /myproject/core/static/css/flag-icon-css/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | -------------------------------------------------------------------------------- /myproject/core/static/js/modal.js: -------------------------------------------------------------------------------- 1 | // Deleta objetos 2 | $(document).on('click', '.object-delete', function() { 3 | let object = $(this).data('object') 4 | let url = $(this).data('url') 5 | $('#span-modal').text(object); 6 | $('#a-modal').attr("href", url); 7 | }); 8 | -------------------------------------------------------------------------------- /myproject/core/templates/includes/breadcrumb_detail.html: -------------------------------------------------------------------------------- 1 | {% block breadcrumb %} 2 | 3 | 4 | 5 | 6 | 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /myproject/core/templates/includes/footer.html: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /myproject/core/static/css/flag-icon-css/flags/4x3/pl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /myproject/core/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.decorators import login_required 2 | from django.shortcuts import render 3 | 4 | 5 | def index(request): 6 | return render(request, 'index.html') 7 | 8 | 9 | # @login_required 10 | def dashboard(request): 11 | return render(request, 'dashboard.html') 12 | -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/js/masonry.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | 'use strict'; 3 | 4 | jQuery(window).load(function(){ 5 | 6 | jQuery('.masonry').masonry({ 7 | columnWidth: '.grid-sizer', 8 | gutter: '.gutter-sizer', 9 | itemSelector: '.item' 10 | }); 11 | 12 | }); 13 | 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /myproject/core/templates/includes/breadcrumb_update.html: -------------------------------------------------------------------------------- 1 | {% block breadcrumb %} 2 | 3 | 4 | 5 | 6 | 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /myproject/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import include, path 3 | 4 | urlpatterns = [ 5 | path('', include('myproject.core.urls')), 6 | path('accounts/', include('myproject.accounts.urls')), 7 | path('crm/', include('myproject.crm.urls')), 8 | path('admin/', admin.site.urls), 9 | ] 10 | -------------------------------------------------------------------------------- /myproject/crm/mixins.py: -------------------------------------------------------------------------------- 1 | from django.urls import reverse_lazy 2 | 3 | 4 | class SuccessUrlMixin(object): 5 | 6 | def get_success_url(self): 7 | obj, _ = self.model_name.objects.get_or_create( 8 | user=self.object, 9 | ) 10 | kw = {'pk': obj.pk} 11 | return reverse_lazy(self.my_success_url, kwargs=kw) 12 | -------------------------------------------------------------------------------- /myproject/core/static/css/flag-icon-css/flags/4x3/fr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /myproject/crm/managers.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class PersonManager(models.Manager): 5 | 6 | def get_queryset(self): 7 | return super(PersonManager, self).get_queryset().filter(person_type='u') 8 | 9 | 10 | class CustomerManager(models.Manager): 11 | 12 | def get_queryset(self): 13 | return super(CustomerManager, self).get_queryset().filter(person_type='c') 14 | -------------------------------------------------------------------------------- /myproject/accounts/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User 2 | from django.urls import reverse_lazy 3 | from django.shortcuts import render 4 | from django.views.generic import CreateView 5 | from .forms import RegisterForm 6 | 7 | 8 | class RegisterView(CreateView): 9 | model = User 10 | template_name = 'accounts/register.html' 11 | form_class = RegisterForm 12 | success_url = reverse_lazy('accounts:login') 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # crm2 2 | 3 | CRM example with Django 2.0 4 | 5 | How to contribute? 6 | 7 | * Clone this repository. 8 | * Create virtualenv with Python 3. 9 | * Active the virtualenv. 10 | * Install dependences. 11 | * Run the migrations. 12 | 13 | ``` 14 | git clone https://github.com/rg3915/crm2.git 15 | cd crm2 16 | python3 -m venv .venv 17 | source .venv/bin/activate 18 | pip install -r requirements.txt 19 | python contrib/env_gen.py 20 | python manage.py migrate 21 | ``` -------------------------------------------------------------------------------- /myproject/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for myproject project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /myproject/utils/lists.py: -------------------------------------------------------------------------------- 1 | PHONE_TYPE = ( 2 | ('pri', 'principal'), 3 | ('com', 'comercial'), 4 | ('res', 'residencial'), 5 | ('cel', 'celular'), 6 | ('cl', 'Claro'), 7 | ('oi', 'Oi'), 8 | ('t', 'Tim'), 9 | ('v', 'Vivo'), 10 | ('n', 'Nextel'), 11 | ('fax', 'fax'), 12 | ('o', 'outros'), 13 | ) 14 | 15 | PERSON_TYPE = ( 16 | ('u', 'usuario'), 17 | ('c', 'cliente'), 18 | ('f', 'fornecedor'), 19 | ) 20 | 21 | DEPARTMENT = ( 22 | ('adm', 'Administrativo'), 23 | ('fin', 'Financeiro'), 24 | ('jur', 'Jurídico'), 25 | ) 26 | -------------------------------------------------------------------------------- /myproject/accounts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from django.contrib.auth.views import login, logout 3 | from .views import RegisterView 4 | from .forms import LoginForm 5 | 6 | 7 | app_name = 'accounts' 8 | 9 | urlpatterns = [ 10 | path( 11 | 'login/', 12 | login, 13 | { 14 | 'template_name': 'accounts/login.html', 15 | 'authentication_form': LoginForm}, 16 | name='login' 17 | ), 18 | path('logout/', logout, name='logout'), 19 | path('register/', RegisterView.as_view(), name='register'), 20 | ] 21 | -------------------------------------------------------------------------------- /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", "myproject.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError as exc: 10 | raise ImportError( 11 | "Couldn't import Django. Are you sure it's installed and " 12 | "available on your PYTHONPATH environment variable? Did you " 13 | "forget to activate a virtual environment?" 14 | ) from exc 15 | execute_from_command_line(sys.argv) 16 | -------------------------------------------------------------------------------- /myproject/core/static/css/font-awesome/.npmignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.egg-info 3 | *.db 4 | *.db.old 5 | *.swp 6 | *.db-journal 7 | 8 | .coverage 9 | .DS_Store 10 | .installed.cfg 11 | _gh_pages/* 12 | 13 | .idea/* 14 | .svn/* 15 | src/website/static/* 16 | src/website/media/* 17 | 18 | bin 19 | cfcache 20 | develop-eggs 21 | dist 22 | downloads 23 | eggs 24 | parts 25 | tmp 26 | .sass-cache 27 | node_modules 28 | 29 | src/website/settingslocal.py 30 | stunnel.log 31 | 32 | .ruby-version 33 | 34 | # don't need these in the npm package. 35 | src/ 36 | _config.yml 37 | bower.json 38 | component.json 39 | composer.json 40 | CONTRIBUTING.md 41 | Gemfile 42 | Gemfile.lock 43 | -------------------------------------------------------------------------------- /myproject/crm/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from myproject.crm import views as c 3 | 4 | app_name = 'crm' 5 | 6 | urlpatterns = [ 7 | path('customer/', c.CustomerList.as_view(), name='customer_list'), 8 | path('customer/add/', c.CustomerCreate.as_view(), name='customer_add'), 9 | path('customer//', c.CustomerDetail.as_view(), name='customer_detail'), 10 | path( 11 | 'customer//edit/', 12 | c.CustomerUpdate.as_view(), 13 | name='customer_update' 14 | ), 15 | path( 16 | 'customer//delete/', 17 | c.customer_delete, 18 | name='customer_delete' 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /contrib/env_gen.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | Django SECRET_KEY generator. 5 | """ 6 | from django.utils.crypto import get_random_string 7 | 8 | 9 | chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)' 10 | 11 | CONFIG_STRING = """ 12 | DEBUG=True 13 | SECRET_KEY=%s 14 | ALLOWED_HOSTS=127.0.0.1, .localhost 15 | #DATABASE_URL=postgres://USER:PASSWORD@HOST:PORT/NAME 16 | #DEFAULT_FROM_EMAIL= 17 | #EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend 18 | #EMAIL_HOST= 19 | #EMAIL_PORT= 20 | #EMAIL_USE_TLS= 21 | #EMAIL_HOST_USER= 22 | #EMAIL_HOST_PASSWORD= 23 | """.strip() % get_random_string(50, chars) 24 | 25 | # Writing our configuration file to '.env' 26 | with open('.env', 'w') as configfile: 27 | configfile.write(CONFIG_STRING) 28 | -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/js/ie10-viewport-bug-workaround.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | // See the Getting Started docs for more information: 8 | // http://getbootstrap.com/getting-started/#support-ie10-width 9 | 10 | (function () { 11 | 'use strict'; 12 | 13 | if (navigator.userAgent.match(/IEMobile\/10\.0/)) { 14 | var msViewportStyle = document.createElement('style') 15 | msViewportStyle.appendChild( 16 | document.createTextNode( 17 | '@-ms-viewport{width:auto!important}' 18 | ) 19 | ) 20 | document.querySelector('head').appendChild(msViewportStyle) 21 | } 22 | 23 | })(); 24 | -------------------------------------------------------------------------------- /myproject/accounts/models.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User 2 | from django.db import models 3 | from django.template.defaultfilters import slugify 4 | from myproject.crm.models import Person, Occupation 5 | 6 | 7 | class UserProfile(Person): 8 | pass 9 | 10 | def __str__(self): 11 | return self.user.get_full_name() 12 | 13 | class Meta: 14 | ordering = ('user__first_name',) 15 | 16 | # def save(self): 17 | # self.fullname = '{} {}'.format( 18 | # self.user.first_name, 19 | # self.user.last_name 20 | # ) 21 | # if self.fullname.strip(): 22 | # self.slug = slugify(self.fullname) 23 | # else: 24 | # self.slug = slugify(self.user.username) 25 | # super(UserProfile, self).save() 26 | -------------------------------------------------------------------------------- /myproject/accounts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.4 on 2018-04-12 00:07 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ('crm', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='UserProfile', 18 | fields=[ 19 | ('person_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.Person')), 20 | ], 21 | options={ 22 | 'ordering': ('user__first_name',), 23 | }, 24 | bases=('crm.person',), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /myproject/crm/migrations/0002_auto_20180416_2146.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.4 on 2018-04-17 00:46 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('crm', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='Customer', 15 | fields=[ 16 | ], 17 | options={ 18 | 'indexes': [], 19 | 'verbose_name': 'cliente', 20 | 'proxy': True, 21 | 'verbose_name_plural': 'clientes', 22 | }, 23 | bases=('crm.person',), 24 | ), 25 | migrations.AddField( 26 | model_name='person', 27 | name='person_type', 28 | field=models.CharField(choices=[('c', 'cliente'), ('f', 'fornecedor')], default='c', max_length=1, verbose_name='cliente ou fornecedor'), 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /myproject/core/templates/modal/modal_delete.html: -------------------------------------------------------------------------------- 1 | 2 | 29 | -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/js/pushy.min.js: -------------------------------------------------------------------------------- 1 | $(function(){function a(){e.toggleClass(j),d.toggleClass(i),f.toggleClass(k),g.toggleClass(l)}function b(){e.addClass(j),d.animate({left:"0px"},n),f.animate({left:o},n),g.animate({left:o},n)}function c(){e.removeClass(j),d.animate({left:"-"+o},n),f.animate({left:"0px"},n),g.animate({left:"0px"},n)}var d=$(".pushy"),e=$("body"),f=$("#container"),g=$(".push"),h=$(".site-overlay"),i="pushy-left pushy-open",j="pushy-active",k="container-push",l="push-push",m=$(".menu-btn, .pushy a"),n=200,o=d.width()+"px";if(cssTransforms3d=function(){var a=document.createElement("p"),b=!1,c={webkitTransform:"-webkit-transform",OTransform:"-o-transform",msTransform:"-ms-transform",MozTransform:"-moz-transform",transform:"transform"};document.body.insertBefore(a,null);for(var d in c)void 0!==a.style[d]&&(a.style[d]="translate3d(1px,1px,1px)",b=window.getComputedStyle(a).getPropertyValue(c[d]));return document.body.removeChild(a),void 0!==b&&b.length>0&&"none"!==b}())m.click(function(){a()}),h.click(function(){a()});else{d.css({left:"-"+o}),f.css({"overflow-x":"hidden"});var p=!0;m.click(function(){p?(b(),p=!1):(c(),p=!0)}),h.click(function(){p?(b(),p=!1):(c(),p=!0)})}}); -------------------------------------------------------------------------------- /myproject/core/static/css/flag-icon-css/flags/4x3/in.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /myproject/crm/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User 2 | from django.contrib.messages.views import SuccessMessageMixin 3 | from django.shortcuts import HttpResponseRedirect 4 | from django.urls import reverse_lazy 5 | from django.views.generic import ListView, DetailView, CreateView, UpdateView 6 | from myproject.core.actions import _delete 7 | from myproject.core.mixins import ActiveMixin 8 | from .models import Customer 9 | from .forms import UserAdminCreationForm, CustomerUpdateForm 10 | from .mixins import SuccessUrlMixin 11 | 12 | 13 | def customer_delete(request, pk): 14 | _delete(Customer, pk) 15 | return HttpResponseRedirect(reverse_lazy('crm:customer_list')) 16 | 17 | 18 | class CustomerList(ActiveMixin, ListView): 19 | model = Customer 20 | 21 | 22 | class CustomerDetail(DetailView): 23 | model = Customer 24 | 25 | 26 | class CustomerCreate(SuccessUrlMixin, CreateView): 27 | model = User 28 | form_class = UserAdminCreationForm 29 | template_name = 'crm/customer_form.html' 30 | model_name = Customer 31 | my_success_url = 'crm:customer_update' 32 | 33 | 34 | class CustomerUpdate(UpdateView): 35 | model = Customer 36 | form_class = CustomerUpdateForm 37 | template_name = 'crm/customer_form.html' 38 | success_url = reverse_lazy('crm:customer_list') 39 | -------------------------------------------------------------------------------- /myproject/core/static/js/ui.datepicker-pt-BR.js: -------------------------------------------------------------------------------- 1 | /* Brazilian initialisation for the jQuery UI date picker plugin. */ 2 | /* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ 3 | jQuery(function($){ 4 | $.datepicker.regional['pt-BR'] = { 5 | closeText: 'Fechar', 6 | prevText: '<Anterior', 7 | nextText: 'Próximo>', 8 | currentText: 'Hoje', 9 | monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', 10 | 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], 11 | monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', 12 | 'Jul','Ago','Set','Out','Nov','Dez'], 13 | dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'], 14 | dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], 15 | dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], 16 | weekHeader: 'Sm', 17 | dateFormat: 'dd/mm/yy', 18 | firstDay: 0, 19 | isRTL: false, 20 | showMonthAfterYear: false, 21 | yearSuffix: ''}; 22 | $.datepicker.setDefaults($.datepicker.regional['pt-BR']); 23 | }); -------------------------------------------------------------------------------- /myproject/accounts/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth.forms import AuthenticationForm, UserCreationForm 3 | from django.contrib.auth.models import User 4 | from django.template.defaultfilters import slugify 5 | from .models import UserProfile 6 | 7 | 8 | class LoginForm(AuthenticationForm): 9 | username = forms.EmailField(label='Email') 10 | 11 | class Meta: 12 | model = User 13 | 14 | 15 | def create_userprofile(instance): 16 | # Salva slug 17 | fullname = '{} {}'.format( 18 | instance.first_name, 19 | instance.last_name 20 | ) 21 | if fullname.strip(): 22 | slug = slugify(fullname) 23 | else: 24 | slug = slugify(instance.email) 25 | # Cria UserProfile 26 | userprofile, _ = UserProfile.objects.get_or_create( 27 | user=instance, 28 | slug=slug 29 | ) 30 | 31 | 32 | class RegisterForm(UserCreationForm): 33 | 34 | class Meta: 35 | model = User 36 | fields = ('first_name', 'last_name', 'email', 'password1', 'password2') 37 | 38 | def save(self, commit=True): 39 | # https://stackoverflow.com/a/3929671 40 | instance = super(RegisterForm, self).save(commit=False) 41 | # Salva username = email 42 | instance.username = self.cleaned_data['email'] 43 | if commit: 44 | instance.save() 45 | # Cria UserProfile 46 | create_userprofile(instance) 47 | return instance 48 | -------------------------------------------------------------------------------- /myproject/crm/templates/crm/customer_form.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load widget_tweaks %} 3 | 4 | {% block title %} 5 | Clientes 6 | {% endblock title %} 7 | 8 | {% block breadcrumb %} 9 | {% include "includes/breadcrumb_update.html" %} 10 | {% endblock breadcrumb %} 11 | 12 | {% block content %} 13 | 14 |
15 |
16 |
17 |
18 | Cadastrar 19 |
20 |
21 |
22 |
23 | {% csrf_token %} 24 | {% for field in form.visible_fields %} 25 |
26 | 27 | {% render_field field class="form-control" %} 28 | {% for error in field.errors %} 29 | {{ error }} 30 | {% endfor %} 31 |
32 | {% endfor %} 33 | 34 |
35 | 36 |
37 |
38 |
39 |
40 |
41 | 42 | {% endblock content %} 43 | 44 | {% block js %} 45 | 46 | 53 | 54 | {% endblock js %} -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/js/scripts.js: -------------------------------------------------------------------------------- 1 | //=================== 2 | // Odometer 3 | // Here set the numebers 4 | //=================== 5 | 6 | setTimeout(function(){ 7 | $('.odometer.01').html(23578); 8 | }, 1000); 9 | setTimeout(function(){ 10 | $('.odometer.02').html(12702); 11 | }, 1000); 12 | 13 | 14 | //=================== 15 | // Magnific Popup 16 | //=================== 17 | 18 | jQuery(document).ready(function() { 19 | jQuery('.image-gallery').magnificPopup({ 20 | delegate: '.item a', // child items selector, by clicking on it popup will open 21 | type:'image' 22 | }); 23 | 24 | //=================== 25 | // WOW 26 | // do not touch 27 | //=================== 28 | 29 | new WOW().init(); 30 | 31 | }); 32 | 33 | 34 | 35 | //=================== 36 | // Scroller 37 | // do not touch 38 | //=================== 39 | 40 | $(function(){ 41 | 42 | $('nav.pushy a[href*=#]').click(function() { 43 | 44 | if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 45 | && location.hostname == this.hostname) { 46 | 47 | var $target = $(this.hash); 48 | 49 | $target = $target.length && $target || $('[name=' + this.hash.slice(1) +']'); 50 | 51 | if ($target.length) { 52 | 53 | var targetOffset = $target.offset().top -0; 54 | 55 | $('html,body').animate({scrollTop: targetOffset}, 800); 56 | 57 | return false; 58 | 59 | } 60 | 61 | } 62 | 63 | }); 64 | 65 | }); 66 | -------------------------------------------------------------------------------- /myproject/core/static/img/brand/sygnet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 11 | 13 | 14 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /myproject/crm/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .managers import PersonManager, CustomerManager 3 | from .models import Person, Phone, Customer 4 | 5 | 6 | class PhoneInline(admin.TabularInline): 7 | model = Phone 8 | extra = 0 9 | 10 | 11 | @admin.register(Person) 12 | class PersonAdmin(admin.ModelAdmin): 13 | inlines = [PhoneInline] 14 | objects = PersonManager() 15 | list_display = ('__str__', 'active') 16 | search_fields = ('first_name', 'last_name',) 17 | # form = PersonForm 18 | actions = None 19 | 20 | # def photo_img(self, obj): 21 | # return ''.format(obj.photo) 22 | # photo_img.allow_tags = True 23 | # photo_img.short_description = 'foto' 24 | 25 | def has_add_permission(self, request, obj=None): 26 | return False 27 | 28 | def has_delete_permission(self, request, obj=None): 29 | return False 30 | 31 | 32 | @admin.register(Customer) 33 | class CustomerAdmin(PersonAdmin): 34 | objects = CustomerManager() 35 | # list_display = ('__str__', 'photo_img', 'email', 'customer_type', 'active') 36 | list_display = ('__str__', 'active') 37 | # form = CustomerForm 38 | actions = None 39 | 40 | # def save_model(self, request, obj, form, change): 41 | # obj.person_type = 'c' 42 | # super(CustomerAdmin, self).save_model(request, obj, form, change) 43 | 44 | def has_add_permission(self, request, obj=None): 45 | return False 46 | 47 | def has_delete_permission(self, request, obj=None): 48 | return False 49 | -------------------------------------------------------------------------------- /myproject/core/static/js/custom-tooltips.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * CoreUI (https://coreui.io) 3 | * Copyright 2018 Łukasz Holeczek 4 | * Licensed under MIT (https://coreui.io) 5 | */ 6 | var customTooltips=function(s){var t=this._chart.canvas.id,o=document.getElementById(t+"-tooltip");if(o||((o=document.createElement("div")).id=t+"-tooltip",o.className="chartjs-tooltip",this._chart.canvas.parentNode.appendChild(o)),0!==s.opacity){if(o.classList.remove("above","below","no-transform"),s.yAlign?o.classList.add(s.yAlign):o.classList.add("no-transform"),s.body){var a=s.title||[],l=s.body.map(function(t){return t.lines});console.log(s.body);var e='
';a.forEach(function(t){e+='
'+t+"
"}),e+="
",e+='
',l.forEach(function(t,o){var a=s.labelColors[o],l="background:"+a.backgroundColor;if(l+="; border-color:"+a.borderColor,l+="; border-width: 2px",console.log(1'+t[0].split(": ").pop()+""];e+='
'+('')+t+"
",console.log(t)}),e+="
",o.innerHTML=e}var i=this._chart.canvas.offsetTop,r=this._chart.canvas.offsetLeft;o.style.opacity=1,o.style.left=r+s.caretX+"px",o.style.top=i+s.caretY+"px"}else o.style.opacity=0};Chart.defaults.global.pointHitDetectionRadius=1,Chart.defaults.global.tooltips.enabled=!1,Chart.defaults.global.tooltips.mode="index",Chart.defaults.global.tooltips.position="nearest",Chart.defaults.global.tooltips.custom=customTooltips; 7 | //# sourceMappingURL=custom-tooltips.min.js.map -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | 103 | *.sqlite3 104 | -------------------------------------------------------------------------------- /myproject/core/models.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User 2 | from django.db import models 3 | from localflavor.br.br_states import STATE_CHOICES 4 | from myproject.utils.lists import PHONE_TYPE, DEPARTMENT 5 | 6 | 7 | class TimeStampedModel(models.Model): 8 | created = models.DateTimeField( 9 | 'criado em', 10 | auto_now_add=True, 11 | auto_now=False 12 | ) 13 | modified = models.DateTimeField( 14 | 'modificado em', 15 | auto_now_add=False, 16 | auto_now=True 17 | ) 18 | 19 | class Meta: 20 | abstract = True 21 | 22 | 23 | class Address(models.Model): 24 | address = models.CharField( 25 | 'endereço', 26 | max_length=100, 27 | null=True, 28 | blank=True 29 | ) 30 | address_number = models.IntegerField('número', null=True, blank=True) 31 | complement = models.CharField( 32 | 'complemento', 33 | max_length=100, 34 | null=True, 35 | blank=True 36 | ) 37 | district = models.CharField('bairro', max_length=100, blank=True) 38 | city = models.CharField('cidade', max_length=100, blank=True) 39 | uf = models.CharField( 40 | 'UF', 41 | max_length=2, 42 | choices=STATE_CHOICES, 43 | blank=True 44 | ) 45 | cep = models.CharField('CEP', max_length=9, null=True, blank=True) 46 | 47 | class Meta: 48 | abstract = True 49 | 50 | 51 | class Document(models.Model): 52 | cpf = models.CharField( 53 | 'CPF', 54 | max_length=11, 55 | unique=True, 56 | null=True, 57 | blank=True 58 | ) 59 | rg = models.CharField('RG', max_length=11, null=True, blank=True) 60 | cnpj = models.CharField( 61 | 'CNPJ', 62 | max_length=14, 63 | unique=True, 64 | null=True, 65 | blank=True 66 | ) 67 | ie = models.CharField( 68 | 'Inscrição Estadual', 69 | max_length=12, 70 | null=True, 71 | blank=True 72 | ) 73 | 74 | class Meta: 75 | abstract = True 76 | 77 | 78 | class Active(models.Model): 79 | active = models.BooleanField('ativo', default=True) 80 | 81 | class Meta: 82 | abstract = True 83 | -------------------------------------------------------------------------------- /myproject/crm/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth.forms import UserCreationForm 3 | from django.contrib.auth.models import User 4 | from django.template.defaultfilters import slugify 5 | from .models import Customer 6 | 7 | 8 | # class UserAdminCreationForm(UserCreationForm): 9 | # Sem senha definida 10 | class UserAdminCreationForm(forms.ModelForm): 11 | ''' Cadastro geral de User ''' 12 | first_name = forms.CharField(label='Nome') 13 | last_name = forms.CharField(label='Sobrenome') 14 | email = forms.EmailField(label='E-mail') 15 | 16 | class Meta: 17 | model = User 18 | fields = ('first_name', 'last_name', 'email') 19 | 20 | def clean_email(self): 21 | email = self.cleaned_data['email'] 22 | # username = email 23 | self.cleaned_data['username'] = email 24 | return email 25 | 26 | def save(self, commit=True): 27 | instance = super(UserAdminCreationForm, self).save(commit=False) 28 | # Salva username = email 29 | instance.username = self.cleaned_data['email'] 30 | if commit: 31 | instance.save() 32 | # Cria Customer 33 | create_customer(instance) 34 | return instance 35 | 36 | 37 | def create_customer(instance): 38 | # Salva slug 39 | fullname = '{} {}'.format( 40 | instance.first_name, 41 | instance.last_name 42 | ) 43 | if fullname.strip(): 44 | slug = slugify(fullname) 45 | else: 46 | slug = slugify(instance.email) 47 | # Cria Customer 48 | customer, _ = Customer.objects.get_or_create( 49 | user=instance, 50 | slug=slug, 51 | person_type='c' 52 | ) 53 | 54 | 55 | class CustomerUpdateForm(forms.ModelForm): 56 | slug = forms.SlugField(disabled=True) 57 | 58 | class Meta: 59 | model = Customer 60 | fields = ( 61 | 'slug', 62 | 'photo', 63 | 'cpf', 64 | 'rg', 65 | 'cnpj', 66 | 'ie', 67 | 'birthday', 68 | 'department', 69 | 'info', 70 | 'occupation', 71 | 'address', 72 | 'address_number', 73 | 'complement', 74 | 'district', 75 | 'city', 76 | 'uf', 77 | 'cep', 78 | ) 79 | -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/js/ie-emulation-modes-warning.js: -------------------------------------------------------------------------------- 1 | // NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT 2 | // IT'S JUST JUNK FOR OUR DOCS! 3 | // ++++++++++++++++++++++++++++++++++++++++++ 4 | /*! 5 | * Copyright 2014-2015 Twitter, Inc. 6 | * 7 | * Licensed under the Creative Commons Attribution 3.0 Unported License. For 8 | * details, see https://creativecommons.org/licenses/by/3.0/. 9 | */ 10 | // Intended to prevent false-positive bug reports about Bootstrap not working properly in old versions of IE due to folks testing using IE's unreliable emulation modes. 11 | (function () { 12 | 'use strict'; 13 | 14 | function emulatedIEMajorVersion() { 15 | var groups = /MSIE ([0-9.]+)/.exec(window.navigator.userAgent) 16 | if (groups === null) { 17 | return null 18 | } 19 | var ieVersionNum = parseInt(groups[1], 10) 20 | var ieMajorVersion = Math.floor(ieVersionNum) 21 | return ieMajorVersion 22 | } 23 | 24 | function actualNonEmulatedIEMajorVersion() { 25 | // Detects the actual version of IE in use, even if it's in an older-IE emulation mode. 26 | // IE JavaScript conditional compilation docs: https://msdn.microsoft.com/library/121hztk3%28v=vs.94%29.aspx 27 | // @cc_on docs: https://msdn.microsoft.com/library/8ka90k2e%28v=vs.94%29.aspx 28 | var jscriptVersion = new Function('/*@cc_on return @_jscript_version; @*/')() // jshint ignore:line 29 | if (jscriptVersion === undefined) { 30 | return 11 // IE11+ not in emulation mode 31 | } 32 | if (jscriptVersion < 9) { 33 | return 8 // IE8 (or lower; haven't tested on IE<8) 34 | } 35 | return jscriptVersion // IE9 or IE10 in any mode, or IE11 in non-IE11 mode 36 | } 37 | 38 | var ua = window.navigator.userAgent 39 | if (ua.indexOf('Opera') > -1 || ua.indexOf('Presto') > -1) { 40 | return // Opera, which might pretend to be IE 41 | } 42 | var emulated = emulatedIEMajorVersion() 43 | if (emulated === null) { 44 | return // Not IE 45 | } 46 | var nonEmulated = actualNonEmulatedIEMajorVersion() 47 | 48 | if (emulated !== nonEmulated) { 49 | window.alert('WARNING: You appear to be using IE' + nonEmulated + ' in IE' + emulated + ' emulation mode.\nIE emulation modes can behave significantly differently from ACTUAL older versions of IE.\nPLEASE DON\'T FILE BOOTSTRAP BUGS based on testing in IE emulation modes!') 50 | } 51 | })(); 52 | -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/css/masonry.css: -------------------------------------------------------------------------------- 1 | /* 2 | A Pen By Jonathan D LaPlante 3 | http://codepen.io/jdlaplan/pen/Aowpj 4 | */ 5 | 6 | 7 | * { 8 | -webkit-box-sizing: border-box; 9 | -moz-box-sizing: border-box; 10 | box-sizing: border-box; 11 | } 12 | 13 | @media (max-width: 480px) { 14 | .masonry { 15 | margin: 3% 0; 16 | } 17 | .masonry .grid-sizer { 18 | width: 100%; 19 | } 20 | .masonry .gutter-sizer { 21 | width: 3%; 22 | } 23 | .masonry .item { 24 | width: 100%; 25 | margin-bottom: 3%; 26 | } 27 | .masonry .item img { 28 | width: 100%; 29 | } 30 | } 31 | @media only screen and (max-width: xxspx) { 32 | .masonry { 33 | margin: 3% 0; 34 | } 35 | .masonry .grid-sizer { 36 | width: 48.5%; 37 | } 38 | .masonry .gutter-sizer { 39 | width: 3%; 40 | } 41 | .masonry .item { 42 | width: 48.5%; 43 | margin-bottom: 3%; 44 | } 45 | .masonry .item img { 46 | width: 100%; 47 | } 48 | } 49 | @media (min-width: 481px) and (max-width: 767px) { 50 | .masonry { 51 | margin: 2.25% 0; 52 | } 53 | .masonry .grid-sizer { 54 | width: 48.87%; 55 | } 56 | .masonry .gutter-sizer { 57 | width: 2.25%; 58 | } 59 | .masonry .item { 60 | width: 48.87%; 61 | margin-bottom: 2.25%; 62 | } 63 | .masonry .item img { 64 | width: 100%; 65 | } 66 | } 67 | @media (min-width: 768px) { 68 | .masonry { 69 | margin: 2% 0; 70 | } 71 | .masonry .grid-sizer { 72 | width: 32%; 73 | } 74 | .masonry .gutter-sizer { 75 | width: 2%; 76 | } 77 | .masonry .item { 78 | width: 32%; 79 | margin-bottom: 2%; 80 | } 81 | .masonry .item img { 82 | width: 100%; 83 | } 84 | } 85 | @media (min-width: 992px) { 86 | .masonry { 87 | margin: 1.875% 0; 88 | } 89 | .masonry .grid-sizer { 90 | width: 32.08%; 91 | } 92 | .masonry .gutter-sizer { 93 | width: 1.875%; 94 | } 95 | .masonry .item { 96 | width: 32.08%; 97 | margin-bottom: 1.875%; 98 | } 99 | .masonry .item img { 100 | width: 100%; 101 | } 102 | } 103 | @media (min-width: 1200px) { 104 | .masonry { 105 | margin: 1.8% 0; 106 | } 107 | .masonry .grid-sizer { 108 | width: 32.13%; 109 | } 110 | .masonry .gutter-sizer { 111 | width: 1.8%; 112 | } 113 | .masonry .item { 114 | width: 32.13%; 115 | margin-bottom: 1.8%; 116 | } 117 | .masonry .item-width2 { 118 | width: 66.06%; 119 | margin-bottom: 1.8%; 120 | } 121 | .masonry .item img, 122 | .masonry .item-width2 img { 123 | width: 100%; 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /myproject/crm/templates/crm/customer_detail.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %} 4 | Clientes 5 | {% endblock title %} 6 | 7 | {% block breadcrumb %} 8 | {% include "includes/breadcrumb_detail.html" %} 9 | {% endblock breadcrumb %} 10 | 11 | {% block content %} 12 | 13 |
14 |
15 |
16 |
17 | Detalhes 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 |
28 | Image cap [100%x180] 30 |
31 |

{{ object.full_name }}

32 | {{ object.user.email }} 33 |
34 |
    35 |
  • RG: {{ object.rg }}
  • 36 |
  • CPF: {{ object.cpf }}
  • 37 |
  • {{ object.address }}
  • 38 |
39 |
40 | Card link 41 | Another link 42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | 50 | {% include "modal/modal_delete.html" %} 51 | 52 | {% endblock content %} 53 | -------------------------------------------------------------------------------- /myproject/accounts/admin.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.contrib import admin 3 | from django.contrib.auth.admin import UserAdmin 4 | from django.contrib.auth.models import User, Group 5 | from .models import UserProfile 6 | 7 | 8 | class UserProfileInline(admin.StackedInline): 9 | model = UserProfile 10 | can_delete = False 11 | verbose_name_plural = 'UserProfile' 12 | fk_name = 'user' 13 | fieldsets = ( 14 | ('', { 15 | 'fields': ( 16 | 'active', 'slug', 17 | ) 18 | }), 19 | ('Documents', { 20 | 'fields': ( 21 | 'cpf', 22 | 'rg', 23 | 'cnpj', 24 | 'ie', 25 | ) 26 | }), 27 | ('Details', { 28 | 'fields': ( 29 | 'photo', 30 | 'birthday', 31 | 'department', 32 | 'info', 33 | 'occupation', 34 | ) 35 | 36 | }), 37 | ('Address', { 38 | 'fields': ('address', 'address_number', 'complement', 'district', 'city', 'uf', 'cep') 39 | }), 40 | ) 41 | 42 | 43 | class CustomUserAdmin(UserAdmin): 44 | inlines = (UserProfileInline, ) 45 | list_display = ('username', 'slug', 'email', 'first_name', 46 | 'last_name', 'is_staff', 'custom_group', 'active') 47 | list_select_related = ('person', ) 48 | actions = None 49 | 50 | if not settings.DEBUG: 51 | def has_delete_permission(self, request, obj=None): 52 | return False 53 | 54 | def custom_group(self, obj): 55 | """ 56 | get group, separate by comma, and display empty string if user has no group 57 | """ 58 | return ','.join([g.name for g in obj.groups.all()]) if obj.groups.count() else '' 59 | custom_group.short_description = 'Grupo' 60 | 61 | def slug(self, obj): 62 | if obj.person.slug: 63 | return obj.person.slug 64 | slug.admin_order_field = 'slug' 65 | slug.short_description = 'slug' 66 | 67 | def active(self, obj): 68 | if obj.person.active: 69 | return obj.person.active 70 | active.admin_order_field = 'active' 71 | active.short_description = 'ativo' 72 | 73 | def get_inline_instances(self, request, obj=None): 74 | if not obj: 75 | return list() 76 | return super(CustomUserAdmin, self).get_inline_instances(request, obj) 77 | 78 | def has_delete_permission(self, request, obj=None): 79 | return False 80 | 81 | admin.site.unregister(User) 82 | admin.site.register(User, CustomUserAdmin) 83 | if not settings.DEBUG: 84 | admin.site.unregister(Group) 85 | -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/css/pushy.css: -------------------------------------------------------------------------------- 1 | /*! Pushy - v0.9.2 - 2014-9-13 2 | * Pushy is a responsive off-canvas navigation menu using CSS transforms & transitions. 3 | * https://github.com/christophery/pushy/ 4 | * by Christopher Yee */ 5 | 6 | /* Menu Appearance */ 7 | 8 | .pushy{ 9 | position: fixed; 10 | width: 200px; 11 | height: 100%; 12 | top: 0; 13 | z-index: 9999; 14 | background: #333332; 15 | font-size: 0.9em; 16 | font-weight: bold; 17 | -webkit-box-shadow: inset -10px 0 6px -9px rgba(0, 0, 0, .7); 18 | -moz-box-shadow: inset -10px 0 6px -9px rgba(0, 0, 0, .7); 19 | box-shadow: inset -10px 0 6px -9px rgba(0, 0, 0, .7); 20 | overflow: auto; 21 | -webkit-overflow-scrolling: touch; /* enables momentum scrolling in iOS overflow elements */ 22 | } 23 | 24 | .pushy a{ 25 | display: block; 26 | color: #b3b3b1; 27 | padding: 15px 30px; 28 | border-bottom: 1px solid rgba(0, 0, 0, .1); 29 | border-top: 1px solid rgba(255, 255, 255, .1); 30 | text-decoration: none; 31 | } 32 | 33 | .pushy a:hover{ 34 | background: #00b4ff; 35 | color: #FFF; 36 | } 37 | 38 | /* Menu Movement */ 39 | 40 | .pushy-left{ 41 | -webkit-transform: translate3d(-200px,0,0); 42 | -moz-transform: translate3d(-200px,0,0); 43 | -ms-transform: translate3d(-200px,0,0); 44 | -o-transform: translate3d(-200px,0,0); 45 | transform: translate3d(-200px,0,0); 46 | } 47 | 48 | .pushy-open{ 49 | -webkit-transform: translate3d(0,0,0); 50 | -moz-transform: translate3d(0,0,0); 51 | -ms-transform: translate3d(0,0,0); 52 | -o-transform: translate3d(0,0,0); 53 | transform: translate3d(0,0,0); 54 | } 55 | 56 | .container-push, .push-push{ 57 | -webkit-transform: translate3d(200px,0,0); 58 | -moz-transform: translate3d(200px,0,0); 59 | -ms-transform: translate3d(200px,0,0); 60 | -o-transform: translate3d(200px,0,0); 61 | transform: translate3d(200px,0,0); 62 | } 63 | 64 | /* Menu Transitions */ 65 | 66 | .pushy, #container, .push{ 67 | -webkit-transition: -webkit-transform .2s cubic-bezier(.16, .68, .43, .99); 68 | -moz-transition: -moz-transform .2s cubic-bezier(.16, .68, .43, .99); 69 | -o-transition: -o-transform .2s cubic-bezier(.16, .68, .43, .99); 70 | transition: transform .2s cubic-bezier(.16, .68, .43, .99); 71 | } 72 | 73 | /* Site Overlay */ 74 | 75 | .site-overlay{ 76 | display: none; 77 | } 78 | 79 | .pushy-active .site-overlay{ 80 | display: block; 81 | position: fixed; 82 | top: 0; 83 | right: 0; 84 | bottom: 0; 85 | left: 0; 86 | z-index: 9998; 87 | background-color: rgba(0,0,0,0.5); 88 | -webkit-animation: fade 500ms; 89 | -moz-animation: fade 500ms; 90 | -o-animation: fade 500ms; 91 | animation: fade 500ms; 92 | } 93 | 94 | @keyframes fade{ 95 | 0% { opacity: 0; } 96 | 100% { opacity: 1; } 97 | } 98 | 99 | @-moz-keyframes fade{ 100 | 0% { opacity: 0; } 101 | 100% { opacity: 1; } 102 | } 103 | 104 | @-webkit-keyframes fade{ 105 | 0% { opacity: 0; } 106 | 100% { opacity: 1; } 107 | } 108 | 109 | @-o-keyframes fade{ 110 | 0% { opacity: 0; } 111 | 100% { opacity: 1; } 112 | } 113 | 114 | /* Example Media Query */ 115 | 116 | @media screen and (max-width: 768px){ 117 | .pushy{ 118 | font-size: 1.0em; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /myproject/core/templates/includes/sidebar.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | -------------------------------------------------------------------------------- /myproject/crm/models.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User 2 | from django.db import models 3 | from django.urls import reverse, reverse_lazy 4 | from myproject.core.models import TimeStampedModel, Address, Document, Active 5 | from myproject.utils.lists import PHONE_TYPE, PERSON_TYPE, DEPARTMENT 6 | from .managers import PersonManager, CustomerManager 7 | 8 | 9 | class People(TimeStampedModel, Address, Document, Active): 10 | ''' Tabela base de pessoas ''' 11 | user = models.OneToOneField(User, on_delete=models.CASCADE) 12 | slug = models.SlugField() 13 | photo = models.ImageField('foto', null=True, blank=True) 14 | birthday = models.DateField('nascimento', null=True, blank=True) 15 | department = models.CharField( 16 | 'departamento', 17 | max_length=3, 18 | choices=DEPARTMENT, 19 | null=True, 20 | blank=True 21 | ) 22 | info = models.TextField('informações', null=True, blank=True) 23 | 24 | class Meta: 25 | abstract = True 26 | ordering = ('user__first_name',) 27 | 28 | def __str__(self): 29 | return self.user.get_full_name() 30 | 31 | full_name = property(__str__) 32 | 33 | 34 | class Person(People): 35 | person_type = models.CharField( 36 | 'usuário, cliente ou fornecedor', 37 | max_length=1, 38 | choices=PERSON_TYPE, 39 | default='u' 40 | ) 41 | occupation = models.ForeignKey( 42 | 'Occupation', 43 | verbose_name='cargo', 44 | related_name='person_occupation', 45 | on_delete=models.CASCADE, 46 | null=True, 47 | blank=True 48 | ) 49 | 50 | objects = PersonManager() 51 | 52 | def get_absolute_url(self): 53 | pass 54 | # return r('crm:person_detail', slug=self.slug) 55 | 56 | 57 | class Phone(models.Model): 58 | phone = models.CharField('telefone', max_length=20, null=True, blank=True) 59 | person = models.ForeignKey( 60 | 'Person', 61 | on_delete=models.CASCADE, 62 | related_name='persons' 63 | ) 64 | phone_type = models.CharField( 65 | 'tipo', 66 | max_length=3, 67 | choices=PHONE_TYPE, 68 | default='pri' 69 | ) 70 | 71 | 72 | class Customer(Person): 73 | objects = CustomerManager() 74 | 75 | class Meta: 76 | proxy = True 77 | verbose_name = 'cliente' 78 | verbose_name_plural = 'clientes' 79 | 80 | def get_absolute_url(self): 81 | return reverse_lazy('crm:customer_detail', kwargs={'pk': self.pk}) 82 | 83 | @property 84 | def list_url(self): 85 | return reverse('crm:customer_list') 86 | 87 | @property 88 | def update_url(self): 89 | if self.pk: 90 | kw = {'pk': self.pk} 91 | return reverse_lazy('crm:customer_update', kwargs=kw) 92 | return None 93 | 94 | @property 95 | def delete_url(self): 96 | if self.pk: 97 | kw = {'pk': self.pk} 98 | return reverse_lazy('crm:customer_delete', kwargs=kw) 99 | return None 100 | 101 | # def save(self, *args, **kwargs): 102 | # # Update person_type 103 | # self.person_type = 'c' 104 | # super(Customer, self).save(*args, **kwargs) 105 | 106 | 107 | class Occupation(models.Model): 108 | occupation = models.CharField('cargo', max_length=50, unique=True) 109 | 110 | class Meta: 111 | ordering = ('occupation',) 112 | verbose_name = 'cargo' 113 | verbose_name_plural = 'cargos' 114 | 115 | def __str__(self): 116 | return self.occupation 117 | -------------------------------------------------------------------------------- /myproject/accounts/templates/accounts/login.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | {% load widget_tweaks %} 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 |
25 |
26 |

Login

27 | 28 |
29 | {% csrf_token %} 30 |
31 |
32 | @ 33 |
34 | {% render_field form.username class='form-control' placeholder='E-mail' %} 35 |
36 |
37 |
38 | 39 | 40 | 41 |
42 | {% render_field form.password class='form-control' placeholder='Senha' %} 43 |
44 |
45 |
46 | 47 |
48 | 51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |

Cadastre-se

59 |

Crie uma nova conta

60 | 61 | 62 | 63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 83 | 84 | -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/css/odometer-theme-default.css: -------------------------------------------------------------------------------- 1 | .odometer.odometer-auto-theme, .odometer.odometer-theme-default { 2 | display: inline-block; 3 | vertical-align: middle; 4 | *vertical-align: auto; 5 | *zoom: 1; 6 | *display: inline; 7 | position: relative; 8 | } 9 | .odometer.odometer-auto-theme .odometer-digit, .odometer.odometer-theme-default .odometer-digit { 10 | display: inline-block; 11 | vertical-align: middle; 12 | *vertical-align: auto; 13 | *zoom: 1; 14 | *display: inline; 15 | position: relative; 16 | } 17 | .odometer.odometer-auto-theme .odometer-digit .odometer-digit-spacer, .odometer.odometer-theme-default .odometer-digit .odometer-digit-spacer { 18 | display: inline-block; 19 | vertical-align: middle; 20 | *vertical-align: auto; 21 | *zoom: 1; 22 | *display: inline; 23 | visibility: hidden; 24 | } 25 | .odometer.odometer-auto-theme .odometer-digit .odometer-digit-inner, .odometer.odometer-theme-default .odometer-digit .odometer-digit-inner { 26 | text-align: left; 27 | display: block; 28 | position: absolute; 29 | top: 0; 30 | left: 0; 31 | right: 0; 32 | bottom: 0; 33 | overflow: hidden; 34 | } 35 | .odometer.odometer-auto-theme .odometer-digit .odometer-ribbon, .odometer.odometer-theme-default .odometer-digit .odometer-ribbon { 36 | display: block; 37 | } 38 | .odometer.odometer-auto-theme .odometer-digit .odometer-ribbon-inner, .odometer.odometer-theme-default .odometer-digit .odometer-ribbon-inner { 39 | display: block; 40 | -webkit-backface-visibility: hidden; 41 | } 42 | .odometer.odometer-auto-theme .odometer-digit .odometer-value, .odometer.odometer-theme-default .odometer-digit .odometer-value { 43 | display: block; 44 | -webkit-transform: translateZ(0); 45 | } 46 | .odometer.odometer-auto-theme .odometer-digit .odometer-value.odometer-last-value, .odometer.odometer-theme-default .odometer-digit .odometer-value.odometer-last-value { 47 | position: absolute; 48 | } 49 | .odometer.odometer-auto-theme.odometer-animating-up .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-up .odometer-ribbon-inner { 50 | -webkit-transition: -webkit-transform 2s; 51 | -moz-transition: -moz-transform 2s; 52 | -ms-transition: -ms-transform 2s; 53 | -o-transition: -o-transform 2s; 54 | transition: transform 2s; 55 | } 56 | .odometer.odometer-auto-theme.odometer-animating-up.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-up.odometer-animating .odometer-ribbon-inner { 57 | -webkit-transform: translateY(-100%); 58 | -moz-transform: translateY(-100%); 59 | -ms-transform: translateY(-100%); 60 | -o-transform: translateY(-100%); 61 | transform: translateY(-100%); 62 | } 63 | .odometer.odometer-auto-theme.odometer-animating-down .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-down .odometer-ribbon-inner { 64 | -webkit-transform: translateY(-100%); 65 | -moz-transform: translateY(-100%); 66 | -ms-transform: translateY(-100%); 67 | -o-transform: translateY(-100%); 68 | transform: translateY(-100%); 69 | } 70 | .odometer.odometer-auto-theme.odometer-animating-down.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-down.odometer-animating .odometer-ribbon-inner { 71 | -webkit-transition: -webkit-transform 2s; 72 | -moz-transition: -moz-transform 2s; 73 | -ms-transition: -ms-transform 2s; 74 | -o-transition: -o-transform 2s; 75 | transition: transform 2s; 76 | -webkit-transform: translateY(0); 77 | -moz-transform: translateY(0); 78 | -ms-transform: translateY(0); 79 | -o-transform: translateY(0); 80 | transform: translateY(0); 81 | } 82 | 83 | .odometer.odometer-auto-theme, .odometer.odometer-theme-default { 84 | font-family: "Helvetica Neue", sans-serif; 85 | line-height: 1.1em; 86 | } 87 | .odometer.odometer-auto-theme .odometer-value, .odometer.odometer-theme-default .odometer-value { 88 | text-align: center; 89 | } 90 | -------------------------------------------------------------------------------- /myproject/settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | from decouple import config, Csv 3 | from dj_database_url import parse as dburl 4 | 5 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 6 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 7 | 8 | 9 | # Quick-start development settings - unsuitable for production 10 | # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ 11 | 12 | # SECURITY WARNING: keep the secret key used in production secret! 13 | SECRET_KEY = config('SECRET_KEY') 14 | 15 | # SECURITY WARNING: don't run with debug turned on in production! 16 | DEBUG = config('DEBUG', default=False, cast=bool) 17 | 18 | ALLOWED_HOSTS = config('ALLOWED_HOSTS', default=[], cast=Csv()) 19 | 20 | 21 | # Application definition 22 | 23 | INSTALLED_APPS = [ 24 | 'django.contrib.admin', 25 | 'django.contrib.auth', 26 | 'django.contrib.contenttypes', 27 | 'django.contrib.sessions', 28 | 'django.contrib.messages', 29 | 'django.contrib.staticfiles', 30 | # Third apps 31 | 'django_extensions', 32 | 'widget_tweaks', 33 | # My apps 34 | 'myproject.accounts.apps.AccountsConfig', 35 | 'myproject.core', 36 | 'myproject.crm.apps.CrmConfig', 37 | ] 38 | 39 | MIDDLEWARE = [ 40 | 'django.middleware.security.SecurityMiddleware', 41 | 'django.contrib.sessions.middleware.SessionMiddleware', 42 | 'django.middleware.common.CommonMiddleware', 43 | 'django.middleware.csrf.CsrfViewMiddleware', 44 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 45 | 'django.contrib.messages.middleware.MessageMiddleware', 46 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 47 | ] 48 | 49 | ROOT_URLCONF = 'myproject.urls' 50 | 51 | TEMPLATES = [ 52 | { 53 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 54 | 'DIRS': [], 55 | 'APP_DIRS': True, 56 | 'OPTIONS': { 57 | 'context_processors': [ 58 | 'django.template.context_processors.debug', 59 | 'django.template.context_processors.request', 60 | 'django.contrib.auth.context_processors.auth', 61 | 'django.contrib.messages.context_processors.messages', 62 | ], 63 | }, 64 | }, 65 | ] 66 | 67 | WSGI_APPLICATION = 'myproject.wsgi.application' 68 | 69 | 70 | # Database 71 | # https://docs.djangoproject.com/en/2.0/ref/settings/#databases 72 | 73 | default_dburl = 'sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3') 74 | DATABASES = { 75 | 'default': config('DATABASE_URL', default=default_dburl, cast=dburl), 76 | } 77 | 78 | 79 | # Password validation 80 | # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators 81 | 82 | AUTH_PASSWORD_VALIDATORS = [ 83 | { 84 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 85 | }, 86 | { 87 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 88 | }, 89 | { 90 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 91 | }, 92 | { 93 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 94 | }, 95 | ] 96 | 97 | 98 | # Internationalization 99 | # https://docs.djangoproject.com/en/2.0/topics/i18n/ 100 | 101 | LANGUAGE_CODE = 'pt-br' 102 | 103 | TIME_ZONE = 'America/Sao_Paulo' 104 | 105 | USE_I18N = True 106 | 107 | USE_L10N = True 108 | 109 | USE_TZ = True 110 | 111 | 112 | # Static files (CSS, JavaScript, Images) 113 | # https://docs.djangoproject.com/en/2.0/howto/static-files/ 114 | 115 | STATIC_URL = '/static/' 116 | STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 117 | 118 | MEDIA_URL = '/media/' 119 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 120 | 121 | # Auth 122 | LOGIN_URL = 'accounts:login' 123 | LOGIN_REDIRECT_URL = 'core:dashboard' 124 | LOGOUT_REDIRECT_URL = 'core:index' 125 | -------------------------------------------------------------------------------- /myproject/core/templates/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | CRM {% block title %}{% endblock title %} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | {% include "includes/nav.html" %} 26 |
27 | {% include "includes/sidebar.html" %} 28 |
29 | 30 | 51 |
52 |
53 | 54 | {% block content %}{% endblock content %} 55 | 56 |
57 | 58 |
59 |
60 | {% include "includes/aside-menu.html" %} 61 |
62 | {% include "includes/footer.html" %} 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | {% block js %}{% endblock %} 81 | 82 | -------------------------------------------------------------------------------- /myproject/core/static/landpage/css/style.css: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | COMMONS CLASSES 3 | \*------------------------------------*/ 4 | 5 | h1, h2, h3, h4, h5, h6 6 | { 7 | font-family: 'Roboto Slab', serif; 8 | } 9 | 10 | h1, h2, h3, h4, h5, h6 11 | { 12 | margin-bottom: 1.1em; 13 | } 14 | 15 | .features, 16 | .blog, 17 | .gallery, 18 | .clients, 19 | .prefooter .container-fluid 20 | { 21 | padding-top: 3.3em; 22 | padding-bottom: 4.2em; 23 | } 24 | 25 | span.typcn::before, i.typcn::before 26 | { 27 | font-size: 2em; 28 | } 29 | 30 | span.x2:before, i.x2:before 31 | { 32 | font-size: 3.4em; 33 | } 34 | 35 | span.x3:before, i.x3:before 36 | { 37 | font-size: 4.4em; 38 | } 39 | 40 | span.x4:before, i.x4:before 41 | { 42 | font-size: 6em; 43 | } 44 | 45 | 46 | /*------------------------------------*\ 47 | HEADER 48 | \*------------------------------------*/ 49 | 50 | header .container-fluid 51 | { 52 | background-image: url('https://unsplash.it/2560/1707?image=961'); 53 | background-repeat: no-repeat; 54 | background-size: cover; 55 | height: 100vh; 56 | padding-top: 36px; 57 | } 58 | 59 | .hamburger 60 | { 61 | font-size: 2.3em; 62 | color: #000; 63 | } 64 | 65 | .hamburger:hover 66 | { 67 | color: #FFF; 68 | cursor: pointer; 69 | } 70 | 71 | 72 | .logo 73 | { 74 | background: none; 75 | border: 0px; 76 | } 77 | 78 | .jumbotron 79 | { 80 | background: none; 81 | text-align: center; 82 | } 83 | 84 | .jumbotron h1, 85 | .jumbotron h2, 86 | .jumbotron h3, 87 | .jumbotron h4, 88 | .jumbotron h5, 89 | .jumbotron h6, 90 | .jumbotron small 91 | { 92 | /*color: #FFFFFF;*/ 93 | color: #235367; 94 | } 95 | 96 | .jumbotron p 97 | { 98 | /*color: #FFFFFF;*/ 99 | color: #235367; 100 | margin-bottom: 5%; 101 | } 102 | 103 | 104 | /*------------------------------------*\ 105 | SECTIONS 106 | \*------------------------------------*/ 107 | 108 | .number .container-fluid 109 | { 110 | background-image: url('https://unsplash.it/3000/2000?image=685'); 111 | background-repeat: no-repeat; 112 | background-size: cover; 113 | background-position: center; 114 | } 115 | 116 | .opaline 117 | { 118 | padding-top: 3em; 119 | padding-bottom: 3em; 120 | background-color: rgba(128, 215, 247, 0.660); 121 | } 122 | 123 | .opaline h1, 124 | .opaline h2, 125 | .opaline h3, 126 | .opaline h4, 127 | .opaline h5, 128 | .opaline h6, 129 | .opaline p 130 | { 131 | color: #FFFFFF; 132 | } 133 | 134 | .opaline .boxes 135 | { 136 | margin-top: 30px; 137 | padding-top: 20px; 138 | padding-bottom: 5px; 139 | border: 1px solid #FFF; 140 | } 141 | 142 | .boxes .odometer.odometer-theme-default 143 | { 144 | font-family: 'Roboto Slab', serif; 145 | } 146 | 147 | .story .container-fluid 148 | { 149 | background-image: url('https://unsplash.it/3000/2000?image=531'); 150 | background-repeat: no-repeat; 151 | background-size: cover; 152 | background-position: center; 153 | } 154 | 155 | .gallery 156 | { 157 | background-color: #dddddd; 158 | } 159 | 160 | .prefooter .container-fluid 161 | { 162 | background: linear-gradient( 163 | rgba(33, 37, 43, 0.6), 164 | rgba(33, 37, 43, 0.6) 165 | ), 166 | 167 | url(https://unsplash.it/4000/3000?image=528); 168 | } 169 | 170 | .prefooter h1, 171 | .prefooter h2, 172 | .prefooter h3, 173 | .prefooter h4, 174 | .prefooter h5, 175 | .prefooter h6, 176 | .prefooter p 177 | { 178 | color: #FFFFFF; 179 | } 180 | 181 | /*------------------------------------*\ 182 | FOOTER 183 | \*------------------------------------*/ 184 | 185 | footer 186 | { 187 | background-color: rgba(36, 50, 59, 1); 188 | padding-top: 2em; 189 | padding-bottom: 1.2em; 190 | } 191 | 192 | footer h1, 193 | footer h2, 194 | footer h3, 195 | footer h4, 196 | footer h5, 197 | footer h6, 198 | footer p 199 | { 200 | color: #FFFFFF; 201 | } 202 | 203 | .social 204 | { 205 | padding-top: 50px; 206 | } 207 | -------------------------------------------------------------------------------- /myproject/core/templates/includes/nav.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | -------------------------------------------------------------------------------- /myproject/core/static/img/brand/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 33 | 41 | 46 | 47 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /myproject/accounts/templates/accounts/register.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | {% load widget_tweaks %} 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 |
25 |

Registrar

26 |

Crie sua conta

27 |
28 | {% csrf_token %} 29 |
30 |
31 | 32 | 33 | 34 |
35 | {% render_field form.first_name class='form-control' placeholder='Nome' %} 36 |
37 | 38 |
39 |
40 | 41 | 42 | 43 |
44 | {% render_field form.last_name class='form-control' placeholder='Sobrenome' %} 45 |
46 | 47 |
48 |
49 | @ 50 |
51 | {% render_field form.email class='form-control' placeholder='E-mail' %} 52 |
53 | 54 |
55 |
56 | 57 | 58 | 59 |
60 | {% render_field form.password1 class='form-control' placeholder='Senha' %} 61 |
62 | 63 |
64 |
65 | 66 | 67 | 68 |
69 | {% render_field form.password2 class='form-control' placeholder='Repetir Senha' %} 70 |
71 | 72 | 73 |
74 |
75 | 89 |
90 |
91 |
92 |
93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /myproject/crm/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.4 on 2018-04-12 00:07 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Occupation', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('occupation', models.CharField(max_length=50, unique=True, verbose_name='cargo')), 22 | ], 23 | options={ 24 | 'verbose_name': 'cargo', 25 | 'ordering': ('occupation',), 26 | 'verbose_name_plural': 'cargos', 27 | }, 28 | ), 29 | migrations.CreateModel( 30 | name='Person', 31 | fields=[ 32 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 33 | ('created', models.DateTimeField(auto_now_add=True, verbose_name='criado em')), 34 | ('modified', models.DateTimeField(auto_now=True, verbose_name='modificado em')), 35 | ('address', models.CharField(blank=True, max_length=100, null=True, verbose_name='endereço')), 36 | ('address_number', models.IntegerField(blank=True, null=True, verbose_name='número')), 37 | ('complement', models.CharField(blank=True, max_length=100, null=True, verbose_name='complemento')), 38 | ('district', models.CharField(blank=True, max_length=100, verbose_name='bairro')), 39 | ('city', models.CharField(blank=True, max_length=100, verbose_name='cidade')), 40 | ('uf', models.CharField(blank=True, choices=[('AC', 'Acre'), ('AL', 'Alagoas'), ('AP', 'Amapá'), ('AM', 'Amazonas'), ('BA', 'Bahia'), ('CE', 'Ceará'), ('DF', 'Distrito Federal'), ('ES', 'Espírito Santo'), ('GO', 'Goiás'), ('MA', 'Maranhão'), ('MT', 'Mato Grosso'), ('MS', 'Mato Grosso do Sul'), ('MG', 'Minas Gerais'), ('PA', 'Pará'), ('PB', 'Paraíba'), ('PR', 'Paraná'), ('PE', 'Pernambuco'), ('PI', 'Piauí'), ('RJ', 'Rio de Janeiro'), ('RN', 'Rio Grande do Norte'), ('RS', 'Rio Grande do Sul'), ('RO', 'Rondônia'), ('RR', 'Roraima'), ('SC', 'Santa Catarina'), ('SP', 'São Paulo'), ('SE', 'Sergipe'), ('TO', 'Tocantins')], max_length=2, verbose_name='UF')), 41 | ('cep', models.CharField(blank=True, max_length=9, null=True, verbose_name='CEP')), 42 | ('cpf', models.CharField(blank=True, max_length=11, null=True, unique=True, verbose_name='CPF')), 43 | ('rg', models.CharField(blank=True, max_length=11, null=True, verbose_name='RG')), 44 | ('cnpj', models.CharField(blank=True, max_length=14, null=True, unique=True, verbose_name='CNPJ')), 45 | ('ie', models.CharField(blank=True, max_length=12, null=True, verbose_name='inscrição estadual')), 46 | ('active', models.BooleanField(default=True, verbose_name='ativo')), 47 | ('slug', models.SlugField()), 48 | ('photo', models.ImageField(blank=True, null=True, upload_to='', verbose_name='foto')), 49 | ('birthday', models.DateField(blank=True, null=True, verbose_name='nascimento')), 50 | ('department', models.CharField(blank=True, choices=[('adm', 'Administrativo'), ('fin', 'Financeiro'), ('jur', 'Jurídico')], max_length=3, null=True, verbose_name='departamento')), 51 | ('info', models.TextField(blank=True, null=True, verbose_name='informações')), 52 | ('occupation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='person_occupation', to='crm.Occupation', verbose_name='cargo')), 53 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 54 | ], 55 | options={ 56 | 'ordering': ('user__first_name',), 57 | 'abstract': False, 58 | }, 59 | ), 60 | migrations.CreateModel( 61 | name='Phone', 62 | fields=[ 63 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 64 | ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='telefone')), 65 | ('phone_type', models.CharField(choices=[('pri', 'principal'), ('com', 'comercial'), ('res', 'residencial'), ('cel', 'celular'), ('cl', 'Claro'), ('oi', 'Oi'), ('t', 'Tim'), ('v', 'Vivo'), ('n', 'Nextel'), ('fax', 'fax'), ('o', 'outros')], default='pri', max_length=3, verbose_name='tipo')), 66 | ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='persons', to='crm.Person')), 67 | ], 68 | ), 69 | ] 70 | -------------------------------------------------------------------------------- /myproject/core/static/css/flag-icon-css/flags/4x3/us.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /myproject/crm/templates/crm/customer_list.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | 4 | {% block title %} 5 | Clientes 6 | {% endblock title %} 7 | 8 | {% block breadcrumb %} 9 | {% include "includes/breadcrumb.html" %} 10 | {% endblock breadcrumb %} 11 | 12 | {% block content %} 13 | 14 |
15 |
16 |
17 |
18 | Clientes 19 |
20 |
21 |
22 |
23 | 29 |
30 | 31 | 32 |
33 |
34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | {% for object in object_list %} 46 | 47 | 48 | 49 | 50 | 51 | 66 | 67 | {% endfor %} 68 | 113 | 114 |
NomeE-mailTelefoneStatus
{{ object.full_name }}{{ object.user.email }}{{ object.phone }} 52 | {% if object.active %} 53 | Ativo 54 | {% else %} 55 | Inativo 56 | {% endif %} 57 | 65 |
115 | 137 |
138 |
139 |
140 |
141 |
142 | 143 | {% include "modal/modal_delete.html" %} 144 | 145 | {% endblock content %} 146 | 147 | {% block js %} 148 | 149 | 150 | 151 | 184 | 185 | {% endblock js %} -------------------------------------------------------------------------------- /myproject/core/static/js/coreui.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * CoreUI v2.0.0-beta.2 (https://coreui.io) 3 | * Copyright 2018 Łukasz Holeczek 4 | * Licensed under MIT (https://coreui.io) 5 | */ 6 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery"),require("perfect-scrollbar")):"function"==typeof define&&define.amd?define(["exports","jquery","perfect-scrollbar"],t):t(e.coreui={},e.jQuery,e.PerfectScrollbar)}(this,function(e,t,r){"use strict";function a(e,t){for(var n=0;n .nav",SIDEBAR:".sidebar",SIDEBAR_MINIMIZER:".sidebar-minimizer",SIDEBAR_TOGGLER:".sidebar-toggler"},V=["sidebar-show","sidebar-sm-show","sidebar-md-show","sidebar-lg-show","sidebar-xl-show"],k=function(){function n(e){this._element=e,this.perfectScrollbar(G.INIT),this.setActiveLink(),this._addEventListeners()}var e=n.prototype;return e.perfectScrollbar=function(e){"undefined"!=typeof r&&(e!==j.INIT||document.body.classList.contains(P)||new r(document.querySelector(G.NAVIGATION_CONTAINER),{suppressScrollX:!0}),e===j.DESTROY&&new r(document.querySelector(G.NAVIGATION_CONTAINER),{suppressScrollX:!0}).destroy(),e===j.TOGGLE&&(document.body.classList.contains(P)?new r(document.querySelector(G.NAVIGATION_CONTAINER),{suppressScrollX:!0}).destroy():new r(document.querySelector(G.NAVIGATION_CONTAINER),{suppressScrollX:!0})))},e.setActiveLink=function(){T(G.NAVIGATION).find(G.NAV_LINK).each(function(e,t){var n=t,r=String(window.location).split("?")[0];"#"===r.substr(r.length-1)&&(r=r.slice(0,-1)),T(T(n))[0].href===r&&T(n).addClass(L).parents(G.NAV_DROPDOWN_ITEMS).add(n).each(function(e,t){T(n=t).parent().addClass(R)})})},e._addEventListeners=function(){var t=this;T(G.BRAND_MINIMIZER).on(j.CLICK,function(e){e.preventDefault(),e.stopPropagation(),T(G.BODY).toggleClass(S)}),T(G.NAV_DROPDOWN_TOGGLE).on(j.CLICK,function(e){e.preventDefault(),e.stopPropagation();var t=e.target;T(t).parent().toggleClass(R)}),T(G.SIDEBAR_MINIMIZER).on(j.CLICK,function(e){e.preventDefault(),e.stopPropagation(),T(G.BODY).toggleClass(P),t.perfectScrollbar(j.TOGGLE)}),T(G.SIDEBAR_TOGGLER).on(j.CLICK,function(e){e.preventDefault(),e.stopPropagation();var t=e.currentTarget.dataset.toggle;x(t,V)})},n._jQueryInterface=function(){return this.each(function(){var e=T(this),t=e.data(D);t||(t=new n(this),e.data(D,t))})},o(n,null,[{key:"VERSION",get:function(){return"2.0.0-beta.2"}}]),n}(),T(window).on(j.LOAD_DATA_API,function(){var e=T(G.SIDEBAR);k._jQueryInterface.call(e)}),T.fn[C]=k._jQueryInterface,T.fn[C].Constructor=k,T.fn[C].noConflict=function(){return T.fn[C]=E,k._jQueryInterface},k);!function(e){if("undefined"==typeof e)throw new TypeError("CoreUI's JavaScript requires jQuery. jQuery must be included before CoreUI's JavaScript.");var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("CoreUI's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(t),window.GetStyle=function(e,t){return void 0===t&&(t=document.body),window.getComputedStyle(t,null).getPropertyValue(e).replace(/^\s/,"")},window.HexToRgb=function(e){var t=e.replace("#","");return"rgba("+parseInt(t.substring(0,2),16)+", "+parseInt(t.substring(2,4),16)+", "+parseInt(t.substring(4,6),16)},window.HexToRgba=function(e,t){void 0===t&&(t=100);var n=e.replace("#","");return"rgba("+parseInt(n.substring(0,2),16)+", "+parseInt(n.substring(2,4),16)+", "+parseInt(n.substring(4,6),16)+", "+t/100},window.RgbToHex=function(e){var t=e.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i),n="0"+parseInt(t[1],10).toString(16),r="0"+parseInt(t[2],10).toString(16),a="0"+parseInt(t[3],10).toString(16);return t&&4===t.length?"#"+n.slice(-2)+r.slice(-2)+a.slice(-2):""},e.AjaxLoad=Q,e.AsideMenu=B,e.Sidebar=M,Object.defineProperty(e,"__esModule",{value:!0})}); 7 | //# sourceMappingURL=coreui.min.js.map -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/js/wow.min.js: -------------------------------------------------------------------------------- 1 | /*! WOW - v1.1.2 - 2015-08-19 2 | * Copyright (c) 2015 Matthieu Aussaguel; Licensed MIT */(function(){var a,b,c,d,e,f=function(a,b){return function(){return a.apply(b,arguments)}},g=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=function(){function a(){}return a.prototype.extend=function(a,b){var c,d;for(c in b)d=b[c],null==a[c]&&(a[c]=d);return a},a.prototype.isMobile=function(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)},a.prototype.createEvent=function(a,b,c,d){var e;return null==b&&(b=!1),null==c&&(c=!1),null==d&&(d=null),null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e},a.prototype.emitEvent=function(a,b){return null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b in(null!=a)?a["on"+b]():void 0},a.prototype.addEvent=function(a,b,c){return null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c},a.prototype.removeEvent=function(a,b,c){return null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]},a.prototype.innerHeight=function(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight},a}(),c=this.WeakMap||this.MozWeakMap||(c=function(){function a(){this.keys=[],this.values=[]}return a.prototype.get=function(a){var b,c,d,e,f;for(f=this.keys,b=d=0,e=f.length;e>d;b=++d)if(c=f[b],c===a)return this.values[b]},a.prototype.set=function(a,b){var c,d,e,f,g;for(g=this.keys,c=e=0,f=g.length;f>e;c=++e)if(d=g[c],d===a)return void(this.values[c]=b);return this.keys.push(a),this.values.push(b)},a}()),a=this.MutationObserver||this.WebkitMutationObserver||this.MozMutationObserver||(a=function(){function a(){"undefined"!=typeof console&&null!==console&&console.warn("MutationObserver is not supported by your browser."),"undefined"!=typeof console&&null!==console&&console.warn("WOW.js cannot detect dom mutations, please call .sync() after loading new content.")}return a.notSupported=!0,a.prototype.observe=function(){},a}()),d=this.getComputedStyle||function(a){return this.getPropertyValue=function(b){var c;return"float"===b&&(b="styleFloat"),e.test(b)&&b.replace(e,function(a,b){return b.toUpperCase()}),(null!=(c=a.currentStyle)?c[b]:void 0)||null},this},e=/(\-([a-z]){1})/g,this.WOW=function(){function e(a){null==a&&(a={}),this.scrollCallback=f(this.scrollCallback,this),this.scrollHandler=f(this.scrollHandler,this),this.resetAnimation=f(this.resetAnimation,this),this.start=f(this.start,this),this.scrolled=!0,this.config=this.util().extend(a,this.defaults),null!=a.scrollContainer&&(this.config.scrollContainer=document.querySelector(a.scrollContainer)),this.animationNameCache=new c,this.wowEvent=this.util().createEvent(this.config.boxClass)}return e.prototype.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0,live:!0,callback:null,scrollContainer:null},e.prototype.init=function(){var a;return this.element=window.document.documentElement,"interactive"===(a=document.readyState)||"complete"===a?this.start():this.util().addEvent(document,"DOMContentLoaded",this.start),this.finished=[]},e.prototype.start=function(){var b,c,d,e;if(this.stopped=!1,this.boxes=function(){var a,c,d,e;for(d=this.element.querySelectorAll("."+this.config.boxClass),e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.all=function(){var a,c,d,e;for(d=this.boxes,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.boxes.length)if(this.disabled())this.resetStyle();else for(e=this.boxes,c=0,d=e.length;d>c;c++)b=e[c],this.applyStyle(b,!0);return this.disabled()||(this.util().addEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().addEvent(window,"resize",this.scrollHandler),this.interval=setInterval(this.scrollCallback,50)),this.config.live?new a(function(a){return function(b){var c,d,e,f,g;for(g=[],c=0,d=b.length;d>c;c++)f=b[c],g.push(function(){var a,b,c,d;for(c=f.addedNodes||[],d=[],a=0,b=c.length;b>a;a++)e=c[a],d.push(this.doSync(e));return d}.call(a));return g}}(this)).observe(document.body,{childList:!0,subtree:!0}):void 0},e.prototype.stop=function(){return this.stopped=!0,this.util().removeEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().removeEvent(window,"resize",this.scrollHandler),null!=this.interval?clearInterval(this.interval):void 0},e.prototype.sync=function(){return a.notSupported?this.doSync(this.element):void 0},e.prototype.doSync=function(a){var b,c,d,e,f;if(null==a&&(a=this.element),1===a.nodeType){for(a=a.parentNode||a,e=a.querySelectorAll("."+this.config.boxClass),f=[],c=0,d=e.length;d>c;c++)b=e[c],g.call(this.all,b)<0?(this.boxes.push(b),this.all.push(b),this.stopped||this.disabled()?this.resetStyle():this.applyStyle(b,!0),f.push(this.scrolled=!0)):f.push(void 0);return f}},e.prototype.show=function(a){return this.applyStyle(a),a.className=a.className+" "+this.config.animateClass,null!=this.config.callback&&this.config.callback(a),this.util().emitEvent(a,this.wowEvent),this.util().addEvent(a,"animationend",this.resetAnimation),this.util().addEvent(a,"oanimationend",this.resetAnimation),this.util().addEvent(a,"webkitAnimationEnd",this.resetAnimation),this.util().addEvent(a,"MSAnimationEnd",this.resetAnimation),a},e.prototype.applyStyle=function(a,b){var c,d,e;return d=a.getAttribute("data-wow-duration"),c=a.getAttribute("data-wow-delay"),e=a.getAttribute("data-wow-iteration"),this.animate(function(f){return function(){return f.customStyle(a,b,d,c,e)}}(this))},e.prototype.animate=function(){return"requestAnimationFrame"in window?function(a){return window.requestAnimationFrame(a)}:function(a){return a()}}(),e.prototype.resetStyle=function(){var a,b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(a.style.visibility="visible");return e},e.prototype.resetAnimation=function(a){var b;return a.type.toLowerCase().indexOf("animationend")>=0?(b=a.target||a.srcElement,b.className=b.className.replace(this.config.animateClass,"").trim()):void 0},e.prototype.customStyle=function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a},e.prototype.vendors=["moz","webkit"],e.prototype.vendorSet=function(a,b){var c,d,e,f;d=[];for(c in b)e=b[c],a[""+c]=e,d.push(function(){var b,d,g,h;for(g=this.vendors,h=[],b=0,d=g.length;d>b;b++)f=g[b],h.push(a[""+f+c.charAt(0).toUpperCase()+c.substr(1)]=e);return h}.call(this));return d},e.prototype.vendorCSS=function(a,b){var c,e,f,g,h,i;for(h=d(a),g=h.getPropertyCSSValue(b),f=this.vendors,c=0,e=f.length;e>c;c++)i=f[c],g=g||h.getPropertyCSSValue("-"+i+"-"+b);return g},e.prototype.animationName=function(a){var b;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=d(a).getPropertyValue("animation-name")}return"none"===b?"":b},e.prototype.cacheAnimationName=function(a){return this.animationNameCache.set(a,this.animationName(a))},e.prototype.cachedAnimationName=function(a){return this.animationNameCache.get(a)},e.prototype.scrollHandler=function(){return this.scrolled=!0},e.prototype.scrollCallback=function(){var a;return!this.scrolled||(this.scrolled=!1,this.boxes=function(){var b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],a&&(this.isVisible(a)?this.show(a):e.push(a));return e}.call(this),this.boxes.length||this.config.live)?void 0:this.stop()},e.prototype.offsetTop=function(a){for(var b;void 0===a.offsetTop;)a=a.parentNode;for(b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop;return b},e.prototype.isVisible=function(a){var b,c,d,e,f;return c=a.getAttribute("data-wow-offset")||this.config.offset,f=this.config.scrollContainer&&this.config.scrollContainer.scrollTop||window.pageYOffset,e=f+Math.min(this.element.clientHeight,this.util().innerHeight())-c,d=this.offsetTop(a),b=d+a.clientHeight,e>=d&&b>=f},e.prototype.util=function(){return null!=this._util?this._util:this._util=new b},e.prototype.disabled=function(){return!this.config.mobile&&this.util().isMobile(navigator.userAgent)},e}()}).call(this); -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/js/holder.min.js: -------------------------------------------------------------------------------- 1 | var Holder=Holder||{};!function(e,t){function n(e,t){var n="complete",i="readystatechange",o=!1,a=o,r=!0,s=e.document,d=s.documentElement,l=s.addEventListener?"addEventListener":"attachEvent",u=s.addEventListener?"removeEventListener":"detachEvent",h=s.addEventListener?"":"on",c=function(r){(r.type!=i||s.readyState==n)&&(("load"==r.type?e:s)[u](h+r.type,c,o),!a&&(a=!0)&&t.call(e,null))},g=function(){try{d.doScroll("left")}catch(e){return setTimeout(g,50),void 0}c("poll")};if(s.readyState==n)t.call(e,"lazy");else{if(s.createEventObject&&d.doScroll){try{r=!e.frameElement}catch(f){}r&&g()}s[l](h+"DOMContentLoaded",c,o),s[l](h+i,c,o),e[l](h+"load",c,o)}}function i(e){e=e.match(/^(\W)?(.*)/);var t=document["getElement"+(e[1]?"#"==e[1]?"ById":"sByClassName":"sByTagName")](e[2]),n=[];return null!==t&&(n=t.length?t:0===t.length?t:[t]),n}function o(e,t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i]);for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);return n}function a(e,t,n){t=parseInt(t,10),e=parseInt(e,10);var i=Math.max(t,e),o=Math.min(t,e),a=1/12,r=Math.min(.75*o,.75*i*a);return{height:Math.round(Math.max(n.size,r))}}function r(e){var t=e.ctx,n=e.dimensions,i=e.template,o=e.ratio,r=e.holder,s="literal"==r.textmode,d="exact"==r.textmode,l=a(n.width,n.height,i),u=l.height,h=n.width*o,c=n.height*o,f=i.font?i.font:"sans-serif";g.width=h,g.height=c,t.textAlign="center",t.textBaseline="middle",t.fillStyle=i.background,t.fillRect(0,0,h,c),t.fillStyle=i.foreground,t.font="bold "+u+"px "+f;var m=i.text?i.text:Math.floor(n.width)+"x"+Math.floor(n.height);if(s){var n=r.dimensions;m=n.width+"x"+n.height}else if(d&&r.exact_dimensions){var n=r.exact_dimensions;m=Math.floor(n.width)+"x"+Math.floor(n.height)}var x=t.measureText(m).width;return x/h>=.75&&(u=Math.floor(.75*u*(h/x))),t.font="bold "+u*o+"px "+f,t.fillText(m,h/2,c/2,h),g.toDataURL("image/png")}function s(e,t,n,i){var a=n.dimensions,s=n.theme,d=n.text?decodeURIComponent(n.text):n.text,u=a.width+"x"+a.height;s=d?o(s,{text:d}):s,s=n.font?o(s,{font:n.font}):s,t.setAttribute("data-src",i),n.theme=s,t.holder_data=n,"image"==e?(t.setAttribute("alt",d?d:s.text?s.text+" ["+u+"]":u),(c||!n.auto)&&(t.style.width=a.width+"px",t.style.height=a.height+"px"),c?t.style.backgroundColor=s.background:(t.setAttribute("src",r({ctx:p,dimensions:a,template:s,ratio:y,holder:n})),n.textmode&&"exact"==n.textmode&&(x.push(t),l(t)))):"background"==e?c||(t.style.backgroundImage="url("+r({ctx:p,dimensions:a,template:s,ratio:y,holder:n})+")",t.style.backgroundSize=a.width+"px "+a.height+"px"):"fluid"==e&&(t.setAttribute("alt",d?d:s.text?s.text+" ["+u+"]":u),t.style.height="%"==a.height.slice(-1)?a.height:a.height+"px",t.style.width="%"==a.width.slice(-1)?a.width:a.width+"px",("inline"==t.style.display||""===t.style.display||"none"==t.style.display)&&(t.style.display="block"),c?t.style.backgroundColor=s.background:(x.push(t),l(t)))}function d(e,t){var n={height:e.clientHeight,width:e.clientWidth};if(!n.height&&!n.width){if(e.hasAttribute("data-holder-invisible"))throw new Error("Holder: placeholder is not visible");return e.setAttribute("data-holder-invisible",!0),setTimeout(function(){t.call(this,e)},1),null}return e.removeAttribute("data-holder-invisible"),n}function l(e){var t;t=null==e.nodeType?x:[e];for(var n in t)if(t.hasOwnProperty(n)){var i=t[n];if(i.holder_data){var o=i.holder_data,a=d(i,l);a&&(o.fluid&&i.setAttribute("src",r({ctx:p,dimensions:a,template:o.theme,ratio:y,holder:o})),o.textmode&&"exact"==o.textmode&&(o.exact_dimensions=a,i.setAttribute("src",r({ctx:p,dimensions:o.dimensions,template:o.theme,ratio:y,holder:o}))))}}}function u(t,n){var i={theme:o(v.themes.gray,{})},a=!1;for(sl=t.length,j=0;sl>j;j++){var r=t[j];e.flags.dimensions.match(r)?(a=!0,i.dimensions=e.flags.dimensions.output(r)):e.flags.fluid.match(r)?(a=!0,i.dimensions=e.flags.fluid.output(r),i.fluid=!0):e.flags.textmode.match(r)?i.textmode=e.flags.textmode.output(r):e.flags.colors.match(r)?i.theme=e.flags.colors.output(r):n.themes[r]?n.themes.hasOwnProperty(r)&&(i.theme=o(n.themes[r],{})):e.flags.font.match(r)?i.font=e.flags.font.output(r):e.flags.auto.match(r)?i.auto=!0:e.flags.text.match(r)&&(i.text=e.flags.text.output(r))}return a?i:!1}var h=!1,c=!1,g=document.createElement("canvas"),f=1,m=1,x=[];if(g.getContext)if(g.toDataURL("image/png").indexOf("data:image/png")<0)c=!0;else var p=g.getContext("2d");else c=!0;c||(f=window.devicePixelRatio||1,m=p.webkitBackingStorePixelRatio||p.mozBackingStorePixelRatio||p.msBackingStorePixelRatio||p.oBackingStorePixelRatio||p.backingStorePixelRatio||1);var y=f/m,v={domain:"holder.js",images:"img",bgnodes:".holderjs",themes:{gray:{background:"#eee",foreground:"#aaa",size:12},social:{background:"#3a5a97",foreground:"#fff",size:12},industrial:{background:"#434A52",foreground:"#C2F200",size:12},sky:{background:"#0D8FDB",foreground:"#fff",size:12},vine:{background:"#39DBAC",foreground:"#1E292C",size:12},lava:{background:"#F8591A",foreground:"#1C2846",size:12}},stylesheet:""};e.flags={dimensions:{regex:/^(\d+)x(\d+)$/,output:function(e){var t=this.regex.exec(e);return{width:+t[1],height:+t[2]}}},fluid:{regex:/^([0-9%]+)x([0-9%]+)$/,output:function(e){var t=this.regex.exec(e);return{width:t[1],height:t[2]}}},colors:{regex:/#([0-9a-f]{3,})\:#([0-9a-f]{3,})/i,output:function(e){var t=this.regex.exec(e);return{size:v.themes.gray.size,foreground:"#"+t[2],background:"#"+t[1]}}},text:{regex:/text\:(.*)/,output:function(e){return this.regex.exec(e)[1]}},font:{regex:/font\:(.*)/,output:function(e){return this.regex.exec(e)[1]}},auto:{regex:/^auto$/},textmode:{regex:/textmode\:(.*)/,output:function(e){return this.regex.exec(e)[1]}}},document.getElementsByClassName||(document.getElementsByClassName=function(e){var t,n,i,o=document,a=[];if(o.querySelectorAll)return o.querySelectorAll("."+e);if(o.evaluate)for(n=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",t=o.evaluate(n,o,null,0,null);i=t.iterateNext();)a.push(i);else for(t=o.getElementsByTagName("*"),n=new RegExp("(^|\\s)"+e+"(\\s|$)"),i=0;ia;a++){var s=document.createElement("img");s.setAttribute("data-src",t),o[a].appendChild(s)}return e},e.run=function(t){h=!0;var n=o(v,t),a=[],r=[],d=[];for("string"==typeof n.images?r=i(n.images):window.NodeList&&n.images instanceof window.NodeList?r=n.images:window.Node&&n.images instanceof window.Node&&(r=[n.images]),"string"==typeof n.bgnodes?d=i(n.bgnodes):window.NodeList&&n.elements instanceof window.NodeList?d=n.bgnodes:window.Node&&n.bgnodes instanceof window.Node&&(d=[n.bgnodes]),f=0,g=r.length;g>f;f++)a.push(r[f]);var l=document.getElementById("holderjs-style");l||(l=document.createElement("style"),l.setAttribute("id","holderjs-style"),l.type="text/css",document.getElementsByTagName("head")[0].appendChild(l)),n.nocss||(l.styleSheet?l.styleSheet.cssText+=n.stylesheet:l.appendChild(document.createTextNode(n.stylesheet)));for(var c=new RegExp(n.domain+'/(.*?)"?\\)'),g=d.length,f=0;g>f;f++){var m=window.getComputedStyle(d[f],null).getPropertyValue("background-image"),x=m.match(c),p=d[f].getAttribute("data-background-src");if(x){var y=u(x[1].split("/"),n);y&&s("background",d[f],y,m)}else if(null!=p){var y=u(p.substr(p.lastIndexOf(n.domain)+n.domain.length+1).split("/"),n);y&&s("background",d[f],y,m)}}for(g=a.length,f=0;g>f;f++){var w,b;b=w=m=null;try{b=a[f].getAttribute("src"),attr_datasrc=a[f].getAttribute("data-src")}catch(k){}if(null==attr_datasrc&&b&&b.indexOf(n.domain)>=0?m=b:attr_datasrc&&attr_datasrc.indexOf(n.domain)>=0&&(m=attr_datasrc),m){var y=u(m.substr(m.lastIndexOf(n.domain)+n.domain.length+1).split("/"),n);y&&(y.fluid?s("fluid",a[f],y,m):s("image",a[f],y,m))}}return e},n(t,function(){window.addEventListener?(window.addEventListener("resize",l,!1),window.addEventListener("orientationchange",l,!1)):window.attachEvent("onresize",l),h||e.run()}),"function"==typeof define&&define.amd&&define([],function(){return e})}(Holder,window); -------------------------------------------------------------------------------- /myproject/core/static/landpage/assets/css/magnific-popup.css: -------------------------------------------------------------------------------- 1 | /* Magnific Popup CSS */ 2 | .mfp-bg { 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | height: 100%; 7 | z-index: 1042; 8 | overflow: hidden; 9 | position: fixed; 10 | background: #0b0b0b; 11 | opacity: 0.8; 12 | filter: alpha(opacity=80); } 13 | 14 | .mfp-wrap { 15 | top: 0; 16 | left: 0; 17 | width: 100%; 18 | height: 100%; 19 | z-index: 1043; 20 | position: fixed; 21 | outline: none !important; 22 | -webkit-backface-visibility: hidden; } 23 | 24 | .mfp-container { 25 | text-align: center; 26 | position: absolute; 27 | width: 100%; 28 | height: 100%; 29 | left: 0; 30 | top: 0; 31 | padding: 0 8px; 32 | -webkit-box-sizing: border-box; 33 | -moz-box-sizing: border-box; 34 | box-sizing: border-box; } 35 | 36 | .mfp-container:before { 37 | content: ''; 38 | display: inline-block; 39 | height: 100%; 40 | vertical-align: middle; } 41 | 42 | .mfp-align-top .mfp-container:before { 43 | display: none; } 44 | 45 | .mfp-content { 46 | position: relative; 47 | display: inline-block; 48 | vertical-align: middle; 49 | margin: 0 auto; 50 | text-align: left; 51 | z-index: 1045; } 52 | 53 | .mfp-inline-holder .mfp-content, 54 | .mfp-ajax-holder .mfp-content { 55 | width: 100%; 56 | cursor: auto; } 57 | 58 | .mfp-ajax-cur { 59 | cursor: progress; } 60 | 61 | .mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { 62 | cursor: -moz-zoom-out; 63 | cursor: -webkit-zoom-out; 64 | cursor: zoom-out; } 65 | 66 | .mfp-zoom { 67 | cursor: pointer; 68 | cursor: -webkit-zoom-in; 69 | cursor: -moz-zoom-in; 70 | cursor: zoom-in; } 71 | 72 | .mfp-auto-cursor .mfp-content { 73 | cursor: auto; } 74 | 75 | .mfp-close, 76 | .mfp-arrow, 77 | .mfp-preloader, 78 | .mfp-counter { 79 | -webkit-user-select: none; 80 | -moz-user-select: none; 81 | user-select: none; } 82 | 83 | .mfp-loading.mfp-figure { 84 | display: none; } 85 | 86 | .mfp-hide { 87 | display: none !important; } 88 | 89 | .mfp-preloader { 90 | color: #CCC; 91 | position: absolute; 92 | top: 50%; 93 | width: auto; 94 | text-align: center; 95 | margin-top: -0.8em; 96 | left: 8px; 97 | right: 8px; 98 | z-index: 1044; } 99 | .mfp-preloader a { 100 | color: #CCC; } 101 | .mfp-preloader a:hover { 102 | color: #FFF; } 103 | 104 | .mfp-s-ready .mfp-preloader { 105 | display: none; } 106 | 107 | .mfp-s-error .mfp-content { 108 | display: none; } 109 | 110 | button.mfp-close, 111 | button.mfp-arrow { 112 | overflow: visible; 113 | cursor: pointer; 114 | background: transparent; 115 | border: 0; 116 | -webkit-appearance: none; 117 | display: block; 118 | outline: none; 119 | padding: 0; 120 | z-index: 1046; 121 | -webkit-box-shadow: none; 122 | box-shadow: none; } 123 | 124 | button::-moz-focus-inner { 125 | padding: 0; 126 | border: 0; } 127 | 128 | .mfp-close { 129 | width: 44px; 130 | height: 44px; 131 | line-height: 44px; 132 | position: absolute; 133 | right: 0; 134 | top: 0; 135 | text-decoration: none; 136 | text-align: center; 137 | opacity: 0.65; 138 | filter: alpha(opacity=65); 139 | padding: 0 0 18px 10px; 140 | color: #FFF; 141 | font-style: normal; 142 | font-size: 28px; 143 | font-family: Arial, Baskerville, monospace; } 144 | .mfp-close:hover, 145 | .mfp-close:focus { 146 | opacity: 1; 147 | filter: alpha(opacity=100); } 148 | .mfp-close:active { 149 | top: 1px; } 150 | 151 | .mfp-close-btn-in .mfp-close { 152 | color: #333; } 153 | 154 | .mfp-image-holder .mfp-close, 155 | .mfp-iframe-holder .mfp-close { 156 | color: #FFF; 157 | right: -6px; 158 | text-align: right; 159 | padding-right: 6px; 160 | width: 100%; } 161 | 162 | .mfp-counter { 163 | position: absolute; 164 | top: 0; 165 | right: 0; 166 | color: #CCC; 167 | font-size: 12px; 168 | line-height: 18px; 169 | white-space: nowrap; } 170 | 171 | .mfp-arrow { 172 | position: absolute; 173 | opacity: 0.65; 174 | filter: alpha(opacity=65); 175 | margin: 0; 176 | top: 50%; 177 | margin-top: -55px; 178 | padding: 0; 179 | width: 90px; 180 | height: 110px; 181 | -webkit-tap-highlight-color: transparent; } 182 | .mfp-arrow:active { 183 | margin-top: -54px; } 184 | .mfp-arrow:hover, 185 | .mfp-arrow:focus { 186 | opacity: 1; 187 | filter: alpha(opacity=100); } 188 | .mfp-arrow:before, 189 | .mfp-arrow:after, 190 | .mfp-arrow .mfp-b, 191 | .mfp-arrow .mfp-a { 192 | content: ''; 193 | display: block; 194 | width: 0; 195 | height: 0; 196 | position: absolute; 197 | left: 0; 198 | top: 0; 199 | margin-top: 35px; 200 | margin-left: 35px; 201 | border: medium inset transparent; } 202 | .mfp-arrow:after, 203 | .mfp-arrow .mfp-a { 204 | border-top-width: 13px; 205 | border-bottom-width: 13px; 206 | top: 8px; } 207 | .mfp-arrow:before, 208 | .mfp-arrow .mfp-b { 209 | border-top-width: 21px; 210 | border-bottom-width: 21px; 211 | opacity: 0.7; } 212 | 213 | .mfp-arrow-left { 214 | left: 0; } 215 | .mfp-arrow-left:after, 216 | .mfp-arrow-left .mfp-a { 217 | border-right: 17px solid #FFF; 218 | margin-left: 31px; } 219 | .mfp-arrow-left:before, 220 | .mfp-arrow-left .mfp-b { 221 | margin-left: 25px; 222 | border-right: 27px solid #3F3F3F; } 223 | 224 | .mfp-arrow-right { 225 | right: 0; } 226 | .mfp-arrow-right:after, 227 | .mfp-arrow-right .mfp-a { 228 | border-left: 17px solid #FFF; 229 | margin-left: 39px; } 230 | .mfp-arrow-right:before, 231 | .mfp-arrow-right .mfp-b { 232 | border-left: 27px solid #3F3F3F; } 233 | 234 | .mfp-iframe-holder { 235 | padding-top: 40px; 236 | padding-bottom: 40px; } 237 | .mfp-iframe-holder .mfp-content { 238 | line-height: 0; 239 | width: 100%; 240 | max-width: 900px; } 241 | .mfp-iframe-holder .mfp-close { 242 | top: -40px; } 243 | 244 | .mfp-iframe-scaler { 245 | width: 100%; 246 | height: 0; 247 | overflow: hidden; 248 | padding-top: 56.25%; } 249 | .mfp-iframe-scaler iframe { 250 | position: absolute; 251 | display: block; 252 | top: 0; 253 | left: 0; 254 | width: 100%; 255 | height: 100%; 256 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); 257 | background: #000; } 258 | 259 | /* Main image in popup */ 260 | img.mfp-img { 261 | width: auto; 262 | max-width: 100%; 263 | height: auto; 264 | display: block; 265 | line-height: 0; 266 | -webkit-box-sizing: border-box; 267 | -moz-box-sizing: border-box; 268 | box-sizing: border-box; 269 | padding: 40px 0 40px; 270 | margin: 0 auto; } 271 | 272 | /* The shadow behind the image */ 273 | .mfp-figure { 274 | line-height: 0; } 275 | .mfp-figure:after { 276 | content: ''; 277 | position: absolute; 278 | left: 0; 279 | top: 40px; 280 | bottom: 40px; 281 | display: block; 282 | right: 0; 283 | width: auto; 284 | height: auto; 285 | z-index: -1; 286 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); 287 | background: #444; } 288 | .mfp-figure small { 289 | color: #BDBDBD; 290 | display: block; 291 | font-size: 12px; 292 | line-height: 14px; } 293 | .mfp-figure figure { 294 | margin: 0; } 295 | 296 | .mfp-bottom-bar { 297 | margin-top: -36px; 298 | position: absolute; 299 | top: 100%; 300 | left: 0; 301 | width: 100%; 302 | cursor: auto; } 303 | 304 | .mfp-title { 305 | text-align: left; 306 | line-height: 18px; 307 | color: #F3F3F3; 308 | word-wrap: break-word; 309 | padding-right: 36px; } 310 | 311 | .mfp-image-holder .mfp-content { 312 | max-width: 100%; } 313 | 314 | .mfp-gallery .mfp-image-holder .mfp-figure { 315 | cursor: pointer; } 316 | 317 | @media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) { 318 | /** 319 | * Remove all paddings around the image on small screen 320 | */ 321 | .mfp-img-mobile .mfp-image-holder { 322 | padding-left: 0; 323 | padding-right: 0; } 324 | .mfp-img-mobile img.mfp-img { 325 | padding: 0; } 326 | .mfp-img-mobile .mfp-figure:after { 327 | top: 0; 328 | bottom: 0; } 329 | .mfp-img-mobile .mfp-figure small { 330 | display: inline; 331 | margin-left: 5px; } 332 | .mfp-img-mobile .mfp-bottom-bar { 333 | background: rgba(0, 0, 0, 0.6); 334 | bottom: 0; 335 | margin: 0; 336 | top: auto; 337 | padding: 3px 5px; 338 | position: fixed; 339 | -webkit-box-sizing: border-box; 340 | -moz-box-sizing: border-box; 341 | box-sizing: border-box; } 342 | .mfp-img-mobile .mfp-bottom-bar:empty { 343 | padding: 0; } 344 | .mfp-img-mobile .mfp-counter { 345 | right: 5px; 346 | top: 3px; } 347 | .mfp-img-mobile .mfp-close { 348 | top: 0; 349 | right: 0; 350 | width: 35px; 351 | height: 35px; 352 | line-height: 35px; 353 | background: rgba(0, 0, 0, 0.6); 354 | position: fixed; 355 | text-align: center; 356 | padding: 0; } } 357 | 358 | @media all and (max-width: 900px) { 359 | .mfp-arrow { 360 | -webkit-transform: scale(0.75); 361 | transform: scale(0.75); } 362 | .mfp-arrow-left { 363 | -webkit-transform-origin: 0; 364 | transform-origin: 0; } 365 | .mfp-arrow-right { 366 | -webkit-transform-origin: 100%; 367 | transform-origin: 100%; } 368 | .mfp-container { 369 | padding-left: 6px; 370 | padding-right: 6px; } } 371 | 372 | .mfp-ie7 .mfp-img { 373 | padding: 0; } 374 | 375 | .mfp-ie7 .mfp-bottom-bar { 376 | width: 600px; 377 | left: 50%; 378 | margin-left: -300px; 379 | margin-top: 5px; 380 | padding-bottom: 5px; } 381 | 382 | .mfp-ie7 .mfp-container { 383 | padding: 0; } 384 | 385 | .mfp-ie7 .mfp-content { 386 | padding-top: 44px; } 387 | 388 | .mfp-ie7 .mfp-close { 389 | top: 0; 390 | right: 0; 391 | padding-top: 0; } 392 | -------------------------------------------------------------------------------- /myproject/core/static/js/main.js: -------------------------------------------------------------------------------- 1 | /* global Chart, GetStyle, HexToRgba */ 2 | 3 | /** 4 | * -------------------------------------------------------------------------- 5 | * CoreUI Free Boostrap Admin Template (v2.0.0-beta.1): main.js 6 | * Licensed under MIT (https://coreui.io/license) 7 | * -------------------------------------------------------------------------- 8 | */ 9 | 10 | /* eslint-disable no-magic-numbers */ 11 | var MainView = function ($) { 12 | // eslint-disable-next-line no-unused-vars 13 | var CardChart1 = new Chart($('#card-chart1'), { 14 | type: 'line', 15 | data: { 16 | labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], 17 | datasets: [{ 18 | label: 'My First dataset', 19 | backgroundColor: GetStyle('--primary'), 20 | borderColor: 'rgba(255,255,255,.55)', 21 | data: [65, 59, 84, 84, 51, 55, 40] 22 | }] 23 | }, 24 | options: { 25 | maintainAspectRatio: false, 26 | legend: { 27 | display: false 28 | }, 29 | scales: { 30 | xAxes: [{ 31 | gridLines: { 32 | color: 'transparent', 33 | zeroLineColor: 'transparent' 34 | }, 35 | ticks: { 36 | fontSize: 2, 37 | fontColor: 'transparent' 38 | } 39 | }], 40 | yAxes: [{ 41 | display: false, 42 | ticks: { 43 | display: false, 44 | min: 35, 45 | max: 89 46 | } 47 | }] 48 | }, 49 | elements: { 50 | line: { 51 | borderWidth: 1 52 | }, 53 | point: { 54 | radius: 4, 55 | hitRadius: 10, 56 | hoverRadius: 4 57 | } 58 | } 59 | } 60 | }); // eslint-disable-next-line no-unused-vars 61 | 62 | var CardChart2 = new Chart($('#card-chart2'), { 63 | type: 'line', 64 | data: { 65 | labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], 66 | datasets: [{ 67 | label: 'My First dataset', 68 | backgroundColor: GetStyle('--info'), 69 | borderColor: 'rgba(255,255,255,.55)', 70 | data: [1, 18, 9, 17, 34, 22, 11] 71 | }] 72 | }, 73 | options: { 74 | maintainAspectRatio: false, 75 | legend: { 76 | display: false 77 | }, 78 | scales: { 79 | xAxes: [{ 80 | gridLines: { 81 | color: 'transparent', 82 | zeroLineColor: 'transparent' 83 | }, 84 | ticks: { 85 | fontSize: 2, 86 | fontColor: 'transparent' 87 | } 88 | }], 89 | yAxes: [{ 90 | display: false, 91 | ticks: { 92 | display: false, 93 | min: -4, 94 | max: 39 95 | } 96 | }] 97 | }, 98 | elements: { 99 | line: { 100 | tension: 0.00001, 101 | borderWidth: 1 102 | }, 103 | point: { 104 | radius: 4, 105 | hitRadius: 10, 106 | hoverRadius: 4 107 | } 108 | } 109 | } 110 | }); // eslint-disable-next-line no-unused-vars 111 | 112 | var CardChart3 = new Chart($('#card-chart3'), { 113 | type: 'line', 114 | data: { 115 | labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], 116 | datasets: [{ 117 | label: 'My First dataset', 118 | backgroundColor: 'rgba(255,255,255,.2)', 119 | borderColor: 'rgba(255,255,255,.55)', 120 | data: [78, 81, 80, 45, 34, 12, 40] 121 | }] 122 | }, 123 | options: { 124 | maintainAspectRatio: false, 125 | legend: { 126 | display: false 127 | }, 128 | scales: { 129 | xAxes: [{ 130 | display: false 131 | }], 132 | yAxes: [{ 133 | display: false 134 | }] 135 | }, 136 | elements: { 137 | line: { 138 | borderWidth: 2 139 | }, 140 | point: { 141 | radius: 0, 142 | hitRadius: 10, 143 | hoverRadius: 4 144 | } 145 | } 146 | } 147 | }); // eslint-disable-next-line no-unused-vars 148 | 149 | var CardChart4 = new Chart($('#card-chart4'), { 150 | type: 'bar', 151 | data: { 152 | labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'January', 'February', 'March', 'April'], 153 | datasets: [{ 154 | label: 'My First dataset', 155 | backgroundColor: 'rgba(255,255,255,.2)', 156 | borderColor: 'rgba(255,255,255,.55)', 157 | data: [78, 81, 80, 45, 34, 12, 40, 85, 65, 23, 12, 98, 34, 84, 67, 82] 158 | }] 159 | }, 160 | options: { 161 | maintainAspectRatio: false, 162 | legend: { 163 | display: false 164 | }, 165 | scales: { 166 | xAxes: [{ 167 | display: false, 168 | barPercentage: 0.6 169 | }], 170 | yAxes: [{ 171 | display: false 172 | }] 173 | } 174 | } 175 | }); // eslint-disable-next-line no-unused-vars 176 | 177 | var MainChart = new Chart($('#main-chart'), { 178 | type: 'line', 179 | data: { 180 | labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S', 'M', 'T', 'W', 'T', 'F', 'S', 'S', 'M', 'T', 'W', 'T', 'F', 'S', 'S', 'M', 'T', 'W', 'T', 'F', 'S', 'S'], 181 | datasets: [{ 182 | label: 'My First dataset', 183 | backgroundColor: HexToRgba(GetStyle('--info'), 10), 184 | borderColor: GetStyle('--info'), 185 | pointHoverBackgroundColor: '#fff', 186 | borderWidth: 2, 187 | data: [165, 180, 70, 69, 77, 57, 125, 165, 172, 91, 173, 138, 155, 89, 50, 161, 65, 163, 160, 103, 114, 185, 125, 196, 183, 64, 137, 95, 112, 175] 188 | }, { 189 | label: 'My Second dataset', 190 | backgroundColor: 'transparent', 191 | borderColor: GetStyle('--success'), 192 | pointHoverBackgroundColor: '#fff', 193 | borderWidth: 2, 194 | data: [92, 97, 80, 100, 86, 97, 83, 98, 87, 98, 93, 83, 87, 98, 96, 84, 91, 97, 88, 86, 94, 86, 95, 91, 98, 91, 92, 80, 83, 82] 195 | }, { 196 | label: 'My Third dataset', 197 | backgroundColor: 'transparent', 198 | borderColor: GetStyle('--danger'), 199 | pointHoverBackgroundColor: '#fff', 200 | borderWidth: 1, 201 | borderDash: [8, 5], 202 | data: [65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65] 203 | }] 204 | }, 205 | options: { 206 | maintainAspectRatio: false, 207 | legend: { 208 | display: false 209 | }, 210 | scales: { 211 | xAxes: [{ 212 | gridLines: { 213 | drawOnChartArea: false 214 | } 215 | }], 216 | yAxes: [{ 217 | ticks: { 218 | beginAtZero: true, 219 | maxTicksLimit: 5, 220 | stepSize: Math.ceil(250 / 5), 221 | max: 250 222 | } 223 | }] 224 | }, 225 | elements: { 226 | point: { 227 | radius: 0, 228 | hitRadius: 10, 229 | hoverRadius: 4, 230 | hoverBorderWidth: 3 231 | } 232 | } 233 | } 234 | }); 235 | var BrandBoxChartLabels = ['January', 'February', 'March', 'April', 'May', 'June', 'July']; 236 | var BrandBoxChartOptions = { 237 | responsive: true, 238 | maintainAspectRatio: false, 239 | legend: { 240 | display: false 241 | }, 242 | scales: { 243 | xAxes: [{ 244 | display: false 245 | }], 246 | yAxes: [{ 247 | display: false 248 | }] 249 | }, 250 | elements: { 251 | point: { 252 | radius: 0, 253 | hitRadius: 10, 254 | hoverRadius: 4, 255 | hoverBorderWidth: 3 256 | } 257 | } // eslint-disable-next-line no-unused-vars 258 | 259 | }; 260 | var BrandBoxChart1 = new Chart($('#social-box-chart-1'), { 261 | type: 'line', 262 | data: { 263 | labels: BrandBoxChartLabels, 264 | datasets: [{ 265 | backgroundColor: 'rgba(255,255,255,.1)', 266 | borderColor: 'rgba(255,255,255,.55)', 267 | pointHoverBackgroundColor: '#fff', 268 | borderWidth: 2, 269 | data: [65, 59, 84, 84, 51, 55, 40] 270 | }] 271 | }, 272 | options: BrandBoxChartOptions 273 | }); // eslint-disable-next-line no-unused-vars 274 | 275 | var BrandBoxChart2 = new Chart($('#social-box-chart-2'), { 276 | type: 'line', 277 | data: { 278 | labels: BrandBoxChartLabels, 279 | datasets: [{ 280 | backgroundColor: 'rgba(255,255,255,.1)', 281 | borderColor: 'rgba(255,255,255,.55)', 282 | pointHoverBackgroundColor: '#fff', 283 | borderWidth: 2, 284 | data: [1, 13, 9, 17, 34, 41, 38] 285 | }] 286 | }, 287 | options: BrandBoxChartOptions 288 | }); // eslint-disable-next-line no-unused-vars 289 | 290 | var BrandBoxChart3 = new Chart($('#social-box-chart-3'), { 291 | type: 'line', 292 | data: { 293 | labels: BrandBoxChartLabels, 294 | datasets: [{ 295 | backgroundColor: 'rgba(255,255,255,.1)', 296 | borderColor: 'rgba(255,255,255,.55)', 297 | pointHoverBackgroundColor: '#fff', 298 | borderWidth: 2, 299 | data: [78, 81, 80, 45, 34, 12, 40] 300 | }] 301 | }, 302 | options: BrandBoxChartOptions 303 | }); // eslint-disable-next-line no-unused-vars 304 | 305 | var BrandBoxChart4 = new Chart($('#social-box-chart-4'), { 306 | type: 'line', 307 | data: { 308 | labels: BrandBoxChartLabels, 309 | datasets: [{ 310 | backgroundColor: 'rgba(255,255,255,.1)', 311 | borderColor: 'rgba(255,255,255,.55)', 312 | pointHoverBackgroundColor: '#fff', 313 | borderWidth: 2, 314 | data: [35, 23, 56, 22, 97, 23, 64] 315 | }] 316 | }, 317 | options: BrandBoxChartOptions 318 | }); 319 | return MainView; 320 | }($); 321 | //# sourceMappingURL=main.js.map -------------------------------------------------------------------------------- /myproject/core/templates/dashboard.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | 4 | {% block breadcrumb %} 5 | {% include "includes/breadcrumb.html" %} 6 | {% endblock breadcrumb %} 7 | 8 | {% block content %} 9 |
10 |
11 |
12 |
13 | Usuários & Clientes 14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | Usuários 22 |
23 | 7 24 |
25 | 26 |
27 |
28 |
29 |
30 | 31 |
32 |
33 | 34 |
35 |
36 |
37 |
38 | Clientes 39 |
40 | 10 41 |
42 | 43 |
44 |
45 |
46 |
47 | 48 |
49 |
50 | 51 |
52 | 53 |
54 |
55 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 71 | 77 | 78 | 79 | 85 | 91 | 92 | 93 | 99 | 105 | 106 | 107 | 113 | 119 | 120 | 121 | 127 | 133 | 134 | 135 | 141 | 147 | 148 | 149 |
UsuáriosCódigo
66 |
Yiorgos Avraamu
67 |
68 | yiorgos@email.com 69 |
70 |
72 | 73 |
74 | 270/18.LO 75 |
76 |
80 |
Avram Tarasios
81 |
82 | avram@email.com 83 |
84 |
86 | 87 |
88 | 250/18.LO 89 |
90 |
94 |
Quintin Ed
95 |
96 | quintin@email.com 97 |
98 |
100 | 101 |
102 | 280/18.LO 103 |
104 |
108 |
Enéas Kwadwo
109 |
110 | eneas@email.com 111 |
112 |
114 | 115 |
116 | 314/18.LO 117 |
118 |
122 |
Agapetus Tadeáš
123 |
124 | agapetus@email.com 125 |
126 |
128 | 129 |
130 | 222/18.LO 131 |
132 |
136 |
Friderik Dávid
137 |
138 | friderik@email.com 139 |
140 |
142 | 143 |
144 | 500/18.LO 145 |
146 |
150 |
151 |
152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 167 | 173 | 174 | 175 | 181 | 187 | 188 | 189 | 195 | 201 | 202 | 203 | 209 | 215 | 216 | 217 | 223 | 229 | 230 | 231 | 237 | 243 | 244 | 245 |
ClienteCódigo
162 |
Yiorgos Avraamu
163 |
164 | yiorgos@email.com 165 |
166 |
168 | 169 |
170 | 27 171 |
172 |
176 |
Avram Tarasios
177 |
178 | avram@email.com 179 |
180 |
182 | 183 |
184 | 50 185 |
186 |
190 |
Quintin Ed
191 |
192 | quintin@email.com 193 |
194 |
196 | 197 |
198 | 8 199 |
200 |
204 |
Enéas Kwadwo
205 |
206 | eneas@email.com 207 |
208 |
210 | 211 |
212 | 12 213 |
214 |
218 |
Agapetus Tadeáš
219 |
220 | agapetus@email.com 221 |
222 |
224 | 225 |
226 | 42 227 |
228 |
232 |
Friderik Dávid
233 |
234 | friderik@email.com 235 |
236 |
238 | 239 |
240 | 12 241 |
242 |
246 |
247 |
248 |
249 |
250 |
251 |
252 | 287 | {% endblock content %} -------------------------------------------------------------------------------- /myproject/core/static/js/pace.min.js: -------------------------------------------------------------------------------- 1 | /*! pace 1.0.2 */ 2 | (function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cQ;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='
\n
\n
\n
',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d="translate3d("+this.progress+"%, 0, 0)",g=["webkitTransform","msTransform","transform"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?c="99":(c=this.progress<10?"0":"",c+=0|this.progress),a.children[0].setAttribute("data-progress",""+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e;e=[];for(d in b.prototype)try{e.push(null==a[d]&&"function"!=typeof b[d]?"function"==typeof Object.defineProperty?Object.defineProperty(a,d,{get:function(){return b.prototype[d]},configurable:!0,enumerable:!0}):a[d]=b.prototype[d]:void 0)}catch(f){c=f}return e},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("ignore"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("track"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a="GET"),"track"===A[0])return"force";if(!A.length&&D.ajax){if("socket"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&"force"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c="socket"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger("stop"),j.running=!1,r.destroy(),s=!0,null!=p&&("function"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger("restart"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger("done"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger("hide")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(".pace")?(j.trigger("start"),j.go()):setTimeout(j.start,50)},"function"==typeof define&&define.amd?define(["pace"],function(){return j}):"object"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this); -------------------------------------------------------------------------------- /myproject/core/static/css/flag-icon-css/flags/4x3/br.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /myproject/core/templates/includes/aside-menu.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | -------------------------------------------------------------------------------- /myproject/core/static/css/simple-line-icons/css/simple-line-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'simple-line-icons'; 3 | src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0'); 4 | src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0#iefix') format('embedded-opentype'), url('../fonts/Simple-Line-Icons.woff2?v=2.4.0') format('woff2'), url('../fonts/Simple-Line-Icons.ttf?v=2.4.0') format('truetype'), url('../fonts/Simple-Line-Icons.woff?v=2.4.0') format('woff'), url('../fonts/Simple-Line-Icons.svg?v=2.4.0#simple-line-icons') format('svg'); 5 | font-weight: normal; 6 | font-style: normal; 7 | } 8 | /* 9 | Use the following CSS code if you want to have a class per icon. 10 | Instead of a list of all class selectors, you can use the generic [class*="icon-"] selector, but it's slower: 11 | */ 12 | .icon-user, 13 | .icon-people, 14 | .icon-user-female, 15 | .icon-user-follow, 16 | .icon-user-following, 17 | .icon-user-unfollow, 18 | .icon-login, 19 | .icon-logout, 20 | .icon-emotsmile, 21 | .icon-phone, 22 | .icon-call-end, 23 | .icon-call-in, 24 | .icon-call-out, 25 | .icon-map, 26 | .icon-location-pin, 27 | .icon-direction, 28 | .icon-directions, 29 | .icon-compass, 30 | .icon-layers, 31 | .icon-menu, 32 | .icon-list, 33 | .icon-options-vertical, 34 | .icon-options, 35 | .icon-arrow-down, 36 | .icon-arrow-left, 37 | .icon-arrow-right, 38 | .icon-arrow-up, 39 | .icon-arrow-up-circle, 40 | .icon-arrow-left-circle, 41 | .icon-arrow-right-circle, 42 | .icon-arrow-down-circle, 43 | .icon-check, 44 | .icon-clock, 45 | .icon-plus, 46 | .icon-minus, 47 | .icon-close, 48 | .icon-event, 49 | .icon-exclamation, 50 | .icon-organization, 51 | .icon-trophy, 52 | .icon-screen-smartphone, 53 | .icon-screen-desktop, 54 | .icon-plane, 55 | .icon-notebook, 56 | .icon-mustache, 57 | .icon-mouse, 58 | .icon-magnet, 59 | .icon-energy, 60 | .icon-disc, 61 | .icon-cursor, 62 | .icon-cursor-move, 63 | .icon-crop, 64 | .icon-chemistry, 65 | .icon-speedometer, 66 | .icon-shield, 67 | .icon-screen-tablet, 68 | .icon-magic-wand, 69 | .icon-hourglass, 70 | .icon-graduation, 71 | .icon-ghost, 72 | .icon-game-controller, 73 | .icon-fire, 74 | .icon-eyeglass, 75 | .icon-envelope-open, 76 | .icon-envelope-letter, 77 | .icon-bell, 78 | .icon-badge, 79 | .icon-anchor, 80 | .icon-wallet, 81 | .icon-vector, 82 | .icon-speech, 83 | .icon-puzzle, 84 | .icon-printer, 85 | .icon-present, 86 | .icon-playlist, 87 | .icon-pin, 88 | .icon-picture, 89 | .icon-handbag, 90 | .icon-globe-alt, 91 | .icon-globe, 92 | .icon-folder-alt, 93 | .icon-folder, 94 | .icon-film, 95 | .icon-feed, 96 | .icon-drop, 97 | .icon-drawer, 98 | .icon-docs, 99 | .icon-doc, 100 | .icon-diamond, 101 | .icon-cup, 102 | .icon-calculator, 103 | .icon-bubbles, 104 | .icon-briefcase, 105 | .icon-book-open, 106 | .icon-basket-loaded, 107 | .icon-basket, 108 | .icon-bag, 109 | .icon-action-undo, 110 | .icon-action-redo, 111 | .icon-wrench, 112 | .icon-umbrella, 113 | .icon-trash, 114 | .icon-tag, 115 | .icon-support, 116 | .icon-frame, 117 | .icon-size-fullscreen, 118 | .icon-size-actual, 119 | .icon-shuffle, 120 | .icon-share-alt, 121 | .icon-share, 122 | .icon-rocket, 123 | .icon-question, 124 | .icon-pie-chart, 125 | .icon-pencil, 126 | .icon-note, 127 | .icon-loop, 128 | .icon-home, 129 | .icon-grid, 130 | .icon-graph, 131 | .icon-microphone, 132 | .icon-music-tone-alt, 133 | .icon-music-tone, 134 | .icon-earphones-alt, 135 | .icon-earphones, 136 | .icon-equalizer, 137 | .icon-like, 138 | .icon-dislike, 139 | .icon-control-start, 140 | .icon-control-rewind, 141 | .icon-control-play, 142 | .icon-control-pause, 143 | .icon-control-forward, 144 | .icon-control-end, 145 | .icon-volume-1, 146 | .icon-volume-2, 147 | .icon-volume-off, 148 | .icon-calendar, 149 | .icon-bulb, 150 | .icon-chart, 151 | .icon-ban, 152 | .icon-bubble, 153 | .icon-camrecorder, 154 | .icon-camera, 155 | .icon-cloud-download, 156 | .icon-cloud-upload, 157 | .icon-envelope, 158 | .icon-eye, 159 | .icon-flag, 160 | .icon-heart, 161 | .icon-info, 162 | .icon-key, 163 | .icon-link, 164 | .icon-lock, 165 | .icon-lock-open, 166 | .icon-magnifier, 167 | .icon-magnifier-add, 168 | .icon-magnifier-remove, 169 | .icon-paper-clip, 170 | .icon-paper-plane, 171 | .icon-power, 172 | .icon-refresh, 173 | .icon-reload, 174 | .icon-settings, 175 | .icon-star, 176 | .icon-symbol-female, 177 | .icon-symbol-male, 178 | .icon-target, 179 | .icon-credit-card, 180 | .icon-paypal, 181 | .icon-social-tumblr, 182 | .icon-social-twitter, 183 | .icon-social-facebook, 184 | .icon-social-instagram, 185 | .icon-social-linkedin, 186 | .icon-social-pinterest, 187 | .icon-social-github, 188 | .icon-social-google, 189 | .icon-social-reddit, 190 | .icon-social-skype, 191 | .icon-social-dribbble, 192 | .icon-social-behance, 193 | .icon-social-foursqare, 194 | .icon-social-soundcloud, 195 | .icon-social-spotify, 196 | .icon-social-stumbleupon, 197 | .icon-social-youtube, 198 | .icon-social-dropbox, 199 | .icon-social-vkontakte, 200 | .icon-social-steam { 201 | font-family: 'simple-line-icons'; 202 | speak: none; 203 | font-style: normal; 204 | font-weight: normal; 205 | font-variant: normal; 206 | text-transform: none; 207 | line-height: 1; 208 | /* Better Font Rendering =========== */ 209 | -webkit-font-smoothing: antialiased; 210 | -moz-osx-font-smoothing: grayscale; 211 | } 212 | .icon-user:before { 213 | content: "\e005"; 214 | } 215 | .icon-people:before { 216 | content: "\e001"; 217 | } 218 | .icon-user-female:before { 219 | content: "\e000"; 220 | } 221 | .icon-user-follow:before { 222 | content: "\e002"; 223 | } 224 | .icon-user-following:before { 225 | content: "\e003"; 226 | } 227 | .icon-user-unfollow:before { 228 | content: "\e004"; 229 | } 230 | .icon-login:before { 231 | content: "\e066"; 232 | } 233 | .icon-logout:before { 234 | content: "\e065"; 235 | } 236 | .icon-emotsmile:before { 237 | content: "\e021"; 238 | } 239 | .icon-phone:before { 240 | content: "\e600"; 241 | } 242 | .icon-call-end:before { 243 | content: "\e048"; 244 | } 245 | .icon-call-in:before { 246 | content: "\e047"; 247 | } 248 | .icon-call-out:before { 249 | content: "\e046"; 250 | } 251 | .icon-map:before { 252 | content: "\e033"; 253 | } 254 | .icon-location-pin:before { 255 | content: "\e096"; 256 | } 257 | .icon-direction:before { 258 | content: "\e042"; 259 | } 260 | .icon-directions:before { 261 | content: "\e041"; 262 | } 263 | .icon-compass:before { 264 | content: "\e045"; 265 | } 266 | .icon-layers:before { 267 | content: "\e034"; 268 | } 269 | .icon-menu:before { 270 | content: "\e601"; 271 | } 272 | .icon-list:before { 273 | content: "\e067"; 274 | } 275 | .icon-options-vertical:before { 276 | content: "\e602"; 277 | } 278 | .icon-options:before { 279 | content: "\e603"; 280 | } 281 | .icon-arrow-down:before { 282 | content: "\e604"; 283 | } 284 | .icon-arrow-left:before { 285 | content: "\e605"; 286 | } 287 | .icon-arrow-right:before { 288 | content: "\e606"; 289 | } 290 | .icon-arrow-up:before { 291 | content: "\e607"; 292 | } 293 | .icon-arrow-up-circle:before { 294 | content: "\e078"; 295 | } 296 | .icon-arrow-left-circle:before { 297 | content: "\e07a"; 298 | } 299 | .icon-arrow-right-circle:before { 300 | content: "\e079"; 301 | } 302 | .icon-arrow-down-circle:before { 303 | content: "\e07b"; 304 | } 305 | .icon-check:before { 306 | content: "\e080"; 307 | } 308 | .icon-clock:before { 309 | content: "\e081"; 310 | } 311 | .icon-plus:before { 312 | content: "\e095"; 313 | } 314 | .icon-minus:before { 315 | content: "\e615"; 316 | } 317 | .icon-close:before { 318 | content: "\e082"; 319 | } 320 | .icon-event:before { 321 | content: "\e619"; 322 | } 323 | .icon-exclamation:before { 324 | content: "\e617"; 325 | } 326 | .icon-organization:before { 327 | content: "\e616"; 328 | } 329 | .icon-trophy:before { 330 | content: "\e006"; 331 | } 332 | .icon-screen-smartphone:before { 333 | content: "\e010"; 334 | } 335 | .icon-screen-desktop:before { 336 | content: "\e011"; 337 | } 338 | .icon-plane:before { 339 | content: "\e012"; 340 | } 341 | .icon-notebook:before { 342 | content: "\e013"; 343 | } 344 | .icon-mustache:before { 345 | content: "\e014"; 346 | } 347 | .icon-mouse:before { 348 | content: "\e015"; 349 | } 350 | .icon-magnet:before { 351 | content: "\e016"; 352 | } 353 | .icon-energy:before { 354 | content: "\e020"; 355 | } 356 | .icon-disc:before { 357 | content: "\e022"; 358 | } 359 | .icon-cursor:before { 360 | content: "\e06e"; 361 | } 362 | .icon-cursor-move:before { 363 | content: "\e023"; 364 | } 365 | .icon-crop:before { 366 | content: "\e024"; 367 | } 368 | .icon-chemistry:before { 369 | content: "\e026"; 370 | } 371 | .icon-speedometer:before { 372 | content: "\e007"; 373 | } 374 | .icon-shield:before { 375 | content: "\e00e"; 376 | } 377 | .icon-screen-tablet:before { 378 | content: "\e00f"; 379 | } 380 | .icon-magic-wand:before { 381 | content: "\e017"; 382 | } 383 | .icon-hourglass:before { 384 | content: "\e018"; 385 | } 386 | .icon-graduation:before { 387 | content: "\e019"; 388 | } 389 | .icon-ghost:before { 390 | content: "\e01a"; 391 | } 392 | .icon-game-controller:before { 393 | content: "\e01b"; 394 | } 395 | .icon-fire:before { 396 | content: "\e01c"; 397 | } 398 | .icon-eyeglass:before { 399 | content: "\e01d"; 400 | } 401 | .icon-envelope-open:before { 402 | content: "\e01e"; 403 | } 404 | .icon-envelope-letter:before { 405 | content: "\e01f"; 406 | } 407 | .icon-bell:before { 408 | content: "\e027"; 409 | } 410 | .icon-badge:before { 411 | content: "\e028"; 412 | } 413 | .icon-anchor:before { 414 | content: "\e029"; 415 | } 416 | .icon-wallet:before { 417 | content: "\e02a"; 418 | } 419 | .icon-vector:before { 420 | content: "\e02b"; 421 | } 422 | .icon-speech:before { 423 | content: "\e02c"; 424 | } 425 | .icon-puzzle:before { 426 | content: "\e02d"; 427 | } 428 | .icon-printer:before { 429 | content: "\e02e"; 430 | } 431 | .icon-present:before { 432 | content: "\e02f"; 433 | } 434 | .icon-playlist:before { 435 | content: "\e030"; 436 | } 437 | .icon-pin:before { 438 | content: "\e031"; 439 | } 440 | .icon-picture:before { 441 | content: "\e032"; 442 | } 443 | .icon-handbag:before { 444 | content: "\e035"; 445 | } 446 | .icon-globe-alt:before { 447 | content: "\e036"; 448 | } 449 | .icon-globe:before { 450 | content: "\e037"; 451 | } 452 | .icon-folder-alt:before { 453 | content: "\e039"; 454 | } 455 | .icon-folder:before { 456 | content: "\e089"; 457 | } 458 | .icon-film:before { 459 | content: "\e03a"; 460 | } 461 | .icon-feed:before { 462 | content: "\e03b"; 463 | } 464 | .icon-drop:before { 465 | content: "\e03e"; 466 | } 467 | .icon-drawer:before { 468 | content: "\e03f"; 469 | } 470 | .icon-docs:before { 471 | content: "\e040"; 472 | } 473 | .icon-doc:before { 474 | content: "\e085"; 475 | } 476 | .icon-diamond:before { 477 | content: "\e043"; 478 | } 479 | .icon-cup:before { 480 | content: "\e044"; 481 | } 482 | .icon-calculator:before { 483 | content: "\e049"; 484 | } 485 | .icon-bubbles:before { 486 | content: "\e04a"; 487 | } 488 | .icon-briefcase:before { 489 | content: "\e04b"; 490 | } 491 | .icon-book-open:before { 492 | content: "\e04c"; 493 | } 494 | .icon-basket-loaded:before { 495 | content: "\e04d"; 496 | } 497 | .icon-basket:before { 498 | content: "\e04e"; 499 | } 500 | .icon-bag:before { 501 | content: "\e04f"; 502 | } 503 | .icon-action-undo:before { 504 | content: "\e050"; 505 | } 506 | .icon-action-redo:before { 507 | content: "\e051"; 508 | } 509 | .icon-wrench:before { 510 | content: "\e052"; 511 | } 512 | .icon-umbrella:before { 513 | content: "\e053"; 514 | } 515 | .icon-trash:before { 516 | content: "\e054"; 517 | } 518 | .icon-tag:before { 519 | content: "\e055"; 520 | } 521 | .icon-support:before { 522 | content: "\e056"; 523 | } 524 | .icon-frame:before { 525 | content: "\e038"; 526 | } 527 | .icon-size-fullscreen:before { 528 | content: "\e057"; 529 | } 530 | .icon-size-actual:before { 531 | content: "\e058"; 532 | } 533 | .icon-shuffle:before { 534 | content: "\e059"; 535 | } 536 | .icon-share-alt:before { 537 | content: "\e05a"; 538 | } 539 | .icon-share:before { 540 | content: "\e05b"; 541 | } 542 | .icon-rocket:before { 543 | content: "\e05c"; 544 | } 545 | .icon-question:before { 546 | content: "\e05d"; 547 | } 548 | .icon-pie-chart:before { 549 | content: "\e05e"; 550 | } 551 | .icon-pencil:before { 552 | content: "\e05f"; 553 | } 554 | .icon-note:before { 555 | content: "\e060"; 556 | } 557 | .icon-loop:before { 558 | content: "\e064"; 559 | } 560 | .icon-home:before { 561 | content: "\e069"; 562 | } 563 | .icon-grid:before { 564 | content: "\e06a"; 565 | } 566 | .icon-graph:before { 567 | content: "\e06b"; 568 | } 569 | .icon-microphone:before { 570 | content: "\e063"; 571 | } 572 | .icon-music-tone-alt:before { 573 | content: "\e061"; 574 | } 575 | .icon-music-tone:before { 576 | content: "\e062"; 577 | } 578 | .icon-earphones-alt:before { 579 | content: "\e03c"; 580 | } 581 | .icon-earphones:before { 582 | content: "\e03d"; 583 | } 584 | .icon-equalizer:before { 585 | content: "\e06c"; 586 | } 587 | .icon-like:before { 588 | content: "\e068"; 589 | } 590 | .icon-dislike:before { 591 | content: "\e06d"; 592 | } 593 | .icon-control-start:before { 594 | content: "\e06f"; 595 | } 596 | .icon-control-rewind:before { 597 | content: "\e070"; 598 | } 599 | .icon-control-play:before { 600 | content: "\e071"; 601 | } 602 | .icon-control-pause:before { 603 | content: "\e072"; 604 | } 605 | .icon-control-forward:before { 606 | content: "\e073"; 607 | } 608 | .icon-control-end:before { 609 | content: "\e074"; 610 | } 611 | .icon-volume-1:before { 612 | content: "\e09f"; 613 | } 614 | .icon-volume-2:before { 615 | content: "\e0a0"; 616 | } 617 | .icon-volume-off:before { 618 | content: "\e0a1"; 619 | } 620 | .icon-calendar:before { 621 | content: "\e075"; 622 | } 623 | .icon-bulb:before { 624 | content: "\e076"; 625 | } 626 | .icon-chart:before { 627 | content: "\e077"; 628 | } 629 | .icon-ban:before { 630 | content: "\e07c"; 631 | } 632 | .icon-bubble:before { 633 | content: "\e07d"; 634 | } 635 | .icon-camrecorder:before { 636 | content: "\e07e"; 637 | } 638 | .icon-camera:before { 639 | content: "\e07f"; 640 | } 641 | .icon-cloud-download:before { 642 | content: "\e083"; 643 | } 644 | .icon-cloud-upload:before { 645 | content: "\e084"; 646 | } 647 | .icon-envelope:before { 648 | content: "\e086"; 649 | } 650 | .icon-eye:before { 651 | content: "\e087"; 652 | } 653 | .icon-flag:before { 654 | content: "\e088"; 655 | } 656 | .icon-heart:before { 657 | content: "\e08a"; 658 | } 659 | .icon-info:before { 660 | content: "\e08b"; 661 | } 662 | .icon-key:before { 663 | content: "\e08c"; 664 | } 665 | .icon-link:before { 666 | content: "\e08d"; 667 | } 668 | .icon-lock:before { 669 | content: "\e08e"; 670 | } 671 | .icon-lock-open:before { 672 | content: "\e08f"; 673 | } 674 | .icon-magnifier:before { 675 | content: "\e090"; 676 | } 677 | .icon-magnifier-add:before { 678 | content: "\e091"; 679 | } 680 | .icon-magnifier-remove:before { 681 | content: "\e092"; 682 | } 683 | .icon-paper-clip:before { 684 | content: "\e093"; 685 | } 686 | .icon-paper-plane:before { 687 | content: "\e094"; 688 | } 689 | .icon-power:before { 690 | content: "\e097"; 691 | } 692 | .icon-refresh:before { 693 | content: "\e098"; 694 | } 695 | .icon-reload:before { 696 | content: "\e099"; 697 | } 698 | .icon-settings:before { 699 | content: "\e09a"; 700 | } 701 | .icon-star:before { 702 | content: "\e09b"; 703 | } 704 | .icon-symbol-female:before { 705 | content: "\e09c"; 706 | } 707 | .icon-symbol-male:before { 708 | content: "\e09d"; 709 | } 710 | .icon-target:before { 711 | content: "\e09e"; 712 | } 713 | .icon-credit-card:before { 714 | content: "\e025"; 715 | } 716 | .icon-paypal:before { 717 | content: "\e608"; 718 | } 719 | .icon-social-tumblr:before { 720 | content: "\e00a"; 721 | } 722 | .icon-social-twitter:before { 723 | content: "\e009"; 724 | } 725 | .icon-social-facebook:before { 726 | content: "\e00b"; 727 | } 728 | .icon-social-instagram:before { 729 | content: "\e609"; 730 | } 731 | .icon-social-linkedin:before { 732 | content: "\e60a"; 733 | } 734 | .icon-social-pinterest:before { 735 | content: "\e60b"; 736 | } 737 | .icon-social-github:before { 738 | content: "\e60c"; 739 | } 740 | .icon-social-google:before { 741 | content: "\e60d"; 742 | } 743 | .icon-social-reddit:before { 744 | content: "\e60e"; 745 | } 746 | .icon-social-skype:before { 747 | content: "\e60f"; 748 | } 749 | .icon-social-dribbble:before { 750 | content: "\e00d"; 751 | } 752 | .icon-social-behance:before { 753 | content: "\e610"; 754 | } 755 | .icon-social-foursqare:before { 756 | content: "\e611"; 757 | } 758 | .icon-social-soundcloud:before { 759 | content: "\e612"; 760 | } 761 | .icon-social-spotify:before { 762 | content: "\e613"; 763 | } 764 | .icon-social-stumbleupon:before { 765 | content: "\e614"; 766 | } 767 | .icon-social-youtube:before { 768 | content: "\e008"; 769 | } 770 | .icon-social-dropbox:before { 771 | content: "\e00c"; 772 | } 773 | .icon-social-vkontakte:before { 774 | content: "\e618"; 775 | } 776 | .icon-social-steam:before { 777 | content: "\e620"; 778 | } 779 | --------------------------------------------------------------------------------