├── restaurants_rank ├── restaurants_map │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── admin.py │ ├── static │ │ ├── image │ │ │ └── icon.png │ │ └── css │ │ │ ├── secret_dining.css │ │ │ └── restaurants_map.css │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── admin.cpython-37.pyc │ │ ├── forms.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ └── __init__.cpython-37.pyc │ ├── forms.py │ ├── models.py │ ├── urls.py │ ├── views.py │ └── templates │ │ └── restaurants_map │ │ ├── base.html │ │ ├── complete_email.html │ │ ├── input_email.html │ │ ├── category_1_mayor.html │ │ ├── dining_list.html │ │ └── secret_dinings.html ├── restaurants_rank │ ├── __init__.py │ ├── __pycache__ │ │ ├── urls.cpython-35.pyc │ │ ├── urls.cpython-37.pyc │ │ ├── wsgi.cpython-37.pyc │ │ ├── __init__.cpython-35.pyc │ │ ├── __init__.cpython-37.pyc │ │ ├── settings.cpython-35.pyc │ │ └── settings.cpython-37.pyc │ ├── wsgi.py │ ├── urls.py │ └── settings.py ├── .gitignore ├── db.sqlite3 ├── static │ ├── image │ │ └── icon.png │ ├── admin │ │ ├── fonts │ │ │ ├── README.txt │ │ │ ├── Roboto-Bold-webfont.woff │ │ │ ├── Roboto-Light-webfont.woff │ │ │ └── Roboto-Regular-webfont.woff │ │ ├── js │ │ │ ├── cancel.js │ │ │ ├── prepopulate.min.js │ │ │ ├── jquery.init.js │ │ │ ├── prepopulate_init.js │ │ │ ├── popup_response.js │ │ │ ├── vendor │ │ │ │ ├── select2 │ │ │ │ │ ├── i18n │ │ │ │ │ │ ├── zh-TW.js │ │ │ │ │ │ ├── az.js │ │ │ │ │ │ ├── zh-CN.js │ │ │ │ │ │ ├── fi.js │ │ │ │ │ │ ├── ja.js │ │ │ │ │ │ ├── hu.js │ │ │ │ │ │ ├── tr.js │ │ │ │ │ │ ├── th.js │ │ │ │ │ │ ├── ko.js │ │ │ │ │ │ ├── vi.js │ │ │ │ │ │ ├── id.js │ │ │ │ │ │ ├── is.js │ │ │ │ │ │ ├── de.js │ │ │ │ │ │ ├── ar.js │ │ │ │ │ │ ├── et.js │ │ │ │ │ │ ├── sv.js │ │ │ │ │ │ ├── km.js │ │ │ │ │ │ ├── nb.js │ │ │ │ │ │ ├── bg.js │ │ │ │ │ │ ├── ms.js │ │ │ │ │ │ ├── gl.js │ │ │ │ │ │ ├── da.js │ │ │ │ │ │ ├── en.js │ │ │ │ │ │ ├── he.js │ │ │ │ │ │ ├── hi.js │ │ │ │ │ │ ├── fa.js │ │ │ │ │ │ ├── hr.js │ │ │ │ │ │ ├── mk.js │ │ │ │ │ │ ├── eu.js │ │ │ │ │ │ ├── pt-BR.js │ │ │ │ │ │ ├── lv.js │ │ │ │ │ │ ├── pt.js │ │ │ │ │ │ ├── es.js │ │ │ │ │ │ ├── ca.js │ │ │ │ │ │ ├── it.js │ │ │ │ │ │ ├── fr.js │ │ │ │ │ │ ├── nl.js │ │ │ │ │ │ ├── ro.js │ │ │ │ │ │ ├── lt.js │ │ │ │ │ │ ├── pl.js │ │ │ │ │ │ ├── el.js │ │ │ │ │ │ ├── sr.js │ │ │ │ │ │ ├── sr-Cyrl.js │ │ │ │ │ │ ├── uk.js │ │ │ │ │ │ ├── ru.js │ │ │ │ │ │ ├── sk.js │ │ │ │ │ │ └── cs.js │ │ │ │ │ └── LICENSE-SELECT2.md │ │ │ │ ├── xregexp │ │ │ │ │ └── LICENSE-XREGEXP.txt │ │ │ │ └── jquery │ │ │ │ │ └── LICENSE-JQUERY.txt │ │ │ ├── change_form.js │ │ │ ├── collapse.js │ │ │ ├── autocomplete.js │ │ │ ├── collapse.min.js │ │ │ ├── prepopulate.js │ │ │ ├── actions.min.js │ │ │ ├── timeparse.js │ │ │ ├── inlines.min.js │ │ │ ├── SelectBox.js │ │ │ ├── actions.js │ │ │ ├── admin │ │ │ │ └── RelatedObjectLookups.js │ │ │ ├── core.js │ │ │ └── calendar.js │ │ ├── img │ │ │ ├── tooltag-arrowright.svg │ │ │ ├── README.txt │ │ │ ├── icon-addlink.svg │ │ │ ├── tooltag-add.svg │ │ │ ├── icon-changelink.svg │ │ │ ├── icon-deletelink.svg │ │ │ ├── icon-yes.svg │ │ │ ├── search.svg │ │ │ ├── icon-alert.svg │ │ │ ├── icon-no.svg │ │ │ ├── inline-delete.svg │ │ │ ├── icon-unknown.svg │ │ │ ├── icon-unknown-alt.svg │ │ │ ├── icon-clock.svg │ │ │ ├── icon-calendar.svg │ │ │ ├── gis │ │ │ │ ├── move_vertex_off.svg │ │ │ │ └── move_vertex_on.svg │ │ │ ├── calendar-icons.svg │ │ │ ├── LICENSE │ │ │ ├── sorting-icons.svg │ │ │ └── selector-icons.svg │ │ └── css │ │ │ ├── fonts.css │ │ │ ├── dashboard.css │ │ │ ├── vendor │ │ │ └── select2 │ │ │ │ └── LICENSE-SELECT2.md │ │ │ ├── login.css │ │ │ ├── responsive_rtl.css │ │ │ ├── rtl.css │ │ │ └── changelists.css │ └── css │ │ ├── restaurants_map.css │ │ └── restaurant_map.css ├── manage.py └── settings.py ├── .gitignore ├── README.md ├── 공무원지도_피드백.md ├── official_div.json └── report_version.ipynb /restaurants_rank/restaurants_map/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints/* 2 | restaurants_rank/static/admin 3 | PipFile 4 | PipFile.lock 5 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /restaurants_rank/.gitignore: -------------------------------------------------------------------------------- 1 | restaurants_map/__pycache__/* 2 | <<<<<<< HEAD 3 | 4 | ======= 5 | >>>>>>> .gitignore 파일 생성 6 | -------------------------------------------------------------------------------- /restaurants_rank/db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/db.sqlite3 -------------------------------------------------------------------------------- /restaurants_rank/static/image/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/static/image/icon.png -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class RestaurantsMapConfig(AppConfig): 5 | name = 'restaurants_map' 6 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Email 3 | # Register your models here. 4 | 5 | admin.site.register(Email) 6 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/static/image/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/static/image/icon.png -------------------------------------------------------------------------------- /restaurants_rank/static/admin/fonts/README.txt: -------------------------------------------------------------------------------- 1 | Roboto webfont source: https://www.google.com/fonts/specimen/Roboto 2 | Weights used in this project: Light (300), Regular (400), Bold (700) 3 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/static/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /restaurants_rank/static/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/static/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/static/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/static/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/__pycache__/forms.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/__pycache__/forms.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/__pycache__/urls.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_rank/__pycache__/urls.cpython-35.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_rank/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/__pycache__/wsgi.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_rank/__pycache__/wsgi.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/__pycache__/__init__.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_rank/__pycache__/__init__.cpython-35.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_rank/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/__pycache__/settings.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_rank/__pycache__/settings.cpython-35.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/__pycache__/settings.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_rank/__pycache__/settings.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | from .models import Email 4 | 5 | class EmailForm(forms.ModelForm): 6 | class Meta: 7 | model = Email 8 | fields = ('email_addr',) 9 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jy617lee/popular_restaurants_from_officials/HEAD/restaurants_rank/restaurants_map/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/cancel.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | $(function() { 4 | $('.cancel-link').click(function(e) { 5 | e.preventDefault(); 6 | window.history.back(); 7 | }); 8 | }); 9 | })(django.jQuery); 10 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/README.txt: -------------------------------------------------------------------------------- 1 | All icons are taken from Font Awesome (http://fontawesome.io/) project. 2 | The Font Awesome font is licensed under the SIL OFL 1.1: 3 | - http://scripts.sil.org/OFL 4 | 5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG 6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license 7 | in current folder). 8 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/prepopulate.min.js: -------------------------------------------------------------------------------- 1 | (function(c){c.fn.prepopulate=function(e,f,g){return this.each(function(){var a=c(this),b=function(){if(!a.data("_changed")){var b=[];c.each(e,function(a,d){d=c(d);0 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/static/css/secret_dining.css: -------------------------------------------------------------------------------- 1 | .single_dining_box { 2 | width: 500px; 3 | align-items: center; 4 | background-color: #171A3D; 5 | } 6 | h4 .dining_subject{ 7 | font-size: 10rem; 8 | font-family: 'Noto Sans KR'; 9 | color: blue; 10 | } 11 | 12 | h5 { 13 | font-size: 10rem; 14 | font-family: 'Noto Sans KR'; 15 | } 16 | 17 | img { 18 | height: 200px; 19 | width: 200px; 20 | background-color: #171A3D; 21 | } 22 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils import timezone 3 | 4 | # Create your models here. 5 | class Email(models.Model): 6 | email_addr = models.EmailField(max_length=70, blank=True, null=True) 7 | register_date = models.DateTimeField(blank=True, null=True) 8 | 9 | def publish(self): 10 | self.published_date = timezone.now() 11 | self.save() 12 | 13 | def __str__(self): 14 | return self.email_addr 15 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for restaurants_rank 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", "restaurants_rank.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Roboto'; 3 | src: url('../fonts/Roboto-Bold-webfont.woff'); 4 | font-weight: 700; 5 | font-style: normal; 6 | } 7 | 8 | @font-face { 9 | font-family: 'Roboto'; 10 | src: url('../fonts/Roboto-Regular-webfont.woff'); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Roboto'; 17 | src: url('../fonts/Roboto-Light-webfont.woff'); 18 | font-weight: 300; 19 | font-style: normal; 20 | } 21 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | 3 | .dashboard .module table th { 4 | width: 100%; 5 | } 6 | 7 | .dashboard .module table td { 8 | white-space: nowrap; 9 | } 10 | 11 | .dashboard .module table td a { 12 | display: block; 13 | padding-right: .6em; 14 | } 15 | 16 | /* RECENT ACTIONS MODULE */ 17 | 18 | .module ul.actionlist { 19 | margin-left: 0; 20 | } 21 | 22 | ul.actionlist li { 23 | list-style-type: none; 24 | overflow: hidden; 25 | text-overflow: ellipsis; 26 | -o-text-overflow: ellipsis; 27 | } 28 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/prepopulate_init.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | var fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); 4 | $.each(fields, function(index, field) { 5 | $('.empty-form .form-row .field-' + field.name + ', .empty-form.form-row .field-' + field.name).addClass('prepopulated_field'); 6 | $(field.id).data('dependency_list', field.dependency_list).prepopulate( 7 | field.dependency_ids, field.maxLength, field.allowUnicode 8 | ); 9 | }); 10 | })(django.jQuery); 11 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import url 2 | from . import views 3 | 4 | urlpatterns = [ 5 | url(r'^official_jmt$', views.dining_list, name='dining_list'), 6 | url(r'^official_jmt_m$', views.dining_list, name='dining_list'), 7 | url(r'^official_jmt_w$', views.dining_list, name='dining_list'), 8 | url(r'^official_report$', views.official_report, name='official_report'), 9 | url(r'^secret_dinings$', views.secret_dinings, name='secret_dinings'), 10 | url(r'^category_1_mayor$', views.category_1_mayor, name='category_1_mayor'), 11 | ] 12 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/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", "restaurants_rank.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 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/popup_response.js: -------------------------------------------------------------------------------- 1 | /*global opener */ 2 | (function() { 3 | 'use strict'; 4 | var initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); 5 | switch(initData.action) { 6 | case 'change': 7 | opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); 8 | break; 9 | case 'delete': 10 | opener.dismissDeleteRelatedObjectPopup(window, initData.value); 11 | break; 12 | default: 13 | opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); 14 | break; 15 | } 16 | })(); 17 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/zh-TW.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # popular_restaurants_from_officials 2 | 업무추진비를 통해 분석한 공무원 맛집리스트! 3 | 4 | ## ToDo 5 | #### 1. Data Analysys 6 | - 가중치 부여 : 급수/카드사용빈도에 따른 가중치 부여 7 | 8 | #### 2. Web 9 | - 여러 기준으로 sort 10 | - Map 기능 11 | - A/B test 12 | 13 | #### 3. Backend 14 | - FB pixel, GA로 user tracking 기능 15 | - 크롤링 및 데이터 반영 자동화 16 | 17 | #### 4. Busineess 18 | - FB ad로 타겟 / 니즈 테스트 19 | - 유저 타겟 세분화 20 | 21 | ## Done 22 | - 서울시 업무추진비 크롤링 23 | 24 | - 1차 Tidy 작업 완료 25 | - 상위 집행부서 column 추가 26 | - 장소/주소 column 분리 27 | - 방문시간을 년/월/일/시간으로 28 | 29 | - 2차 Tidy 작업 완료 30 | - 프랜차이즈 제외 31 | - 카페/커피/매점 등 키워드 제거 32 | - 부서별 특징 파악 33 | 34 | - 제외 키워드 : 카페/커피/스타벅스/온누리/상품권/시청/격려/우정사업/피자/구매 35 | 36 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/az.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/zh-CN.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/fi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.7 on 2018-07-16 09:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Email', 16 | fields=[ 17 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('email_addr', models.EmailField(blank=True, max_length=70, null=True)), 19 | ('register_date', models.DateTimeField(blank=True, null=True)), 20 | ], 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/ja.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/hu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/tr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/th.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/ko.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/vi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/id.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/is.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/de.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/ar.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="الرجاء حذف "+t+" عناصر";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="الرجاء إضافة "+t+" عناصر";return n},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){var t="تستطيع إختيار "+e.maximum+" بنود فقط";return t},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/et.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/sv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/km.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/nb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/bg.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/ms.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/gl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/change_form.js: -------------------------------------------------------------------------------- 1 | /*global showAddAnotherPopup, showRelatedObjectLookupPopup showRelatedObjectPopup updateRelatedObjectLinks*/ 2 | 3 | (function($) { 4 | 'use strict'; 5 | $(document).ready(function() { 6 | var modelName = $('#django-admin-form-add-constants').data('modelName'); 7 | $('body').on('click', '.add-another', function(e) { 8 | e.preventDefault(); 9 | var event = $.Event('django:add-another-related'); 10 | $(this).trigger(event); 11 | if (!event.isDefaultPrevented()) { 12 | showAddAnotherPopup(this); 13 | } 14 | }); 15 | 16 | if (modelName) { 17 | $('form#' + modelName + '_form :input:visible:enabled:first').focus(); 18 | } 19 | }); 20 | })(django.jQuery); 21 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/da.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/en.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/he.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/hi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/fa.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/hr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/mk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/eu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/pt-BR.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/lv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/pt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/es.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/ca.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/it.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/fr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/nl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/ro.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/lt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/pl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/el.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/sr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/sr-Cyrl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/uk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/ru.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/urls.py: -------------------------------------------------------------------------------- 1 | """restaurants_rank URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/2.0/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path 18 | from django.conf.urls import include 19 | from django.conf.urls import url 20 | from django.conf import settings 21 | from django.conf.urls.static import static 22 | 23 | urlpatterns = [ 24 | path('admin/', admin.site.urls), 25 | url(r'', include('restaurants_map.urls')), 26 | ]+ static(settings.STATIC_URL, 27 | document_root=settings.STATIC_ROOT) 28 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/sk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Code Charm Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/i18n/cs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /restaurants_rank/static/admin/img/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, get_object_or_404 2 | from .forms import EmailForm 3 | from django.utils import timezone 4 | 5 | # Create your views here. 6 | def input_email(request): 7 | if request.method == "POST": 8 | form = EmailForm(request.POST) 9 | if form.is_valid(): 10 | email_text = request.POST['input_email'] 11 | email = form.save(commit=False) 12 | email.email_addr = email_text 13 | email.register_date = timezone.now() 14 | email.save() 15 | return render(request, 'restaurants_map/complete_email.html', {}) 16 | else: 17 | form = EmailForm() 18 | return render(request, 'restaurants_map/input_email.html', {'form': form}) 19 | 20 | def dining_list(request): 21 | return render(request, 'restaurants_map/dining_list.html', {}) 22 | 23 | def official_report(request): 24 | return render(request, 'restaurants_map/official_report.html', {}) 25 | 26 | def secret_dinings(request): 27 | return render(request, 'restaurants_map/secret_dinings.html', {}) 28 | 29 | def category_1_mayor(request): 30 | return render(request, 'restaurants_map/category_1_mayor.html', {}) 31 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2007-2012 Steven Levithan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/css/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/collapse.js: -------------------------------------------------------------------------------- 1 | /*global gettext*/ 2 | (function($) { 3 | 'use strict'; 4 | $(document).ready(function() { 5 | // Add anchor tag for Show/Hide link 6 | $("fieldset.collapse").each(function(i, elem) { 7 | // Don't hide if fields in this fieldset have errors 8 | if ($(elem).find("div.errors").length === 0) { 9 | $(elem).addClass("collapsed").find("h2").first().append(' (' + gettext("Show") + 11 | ')'); 12 | } 13 | }); 14 | // Add toggle to anchor tag 15 | $("fieldset.collapse a.collapse-toggle").click(function(ev) { 16 | if ($(this).closest("fieldset").hasClass("collapsed")) { 17 | // Show 18 | $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]); 19 | } else { 20 | // Hide 21 | $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]); 22 | } 23 | return false; 24 | }); 25 | }); 26 | })(django.jQuery); 27 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/autocomplete.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | var init = function($element, options) { 4 | var settings = $.extend({ 5 | ajax: { 6 | data: function(params) { 7 | return { 8 | term: params.term, 9 | page: params.page 10 | }; 11 | } 12 | } 13 | }, options); 14 | $element.select2(settings); 15 | }; 16 | 17 | $.fn.djangoAdminSelect2 = function(options) { 18 | var settings = $.extend({}, options); 19 | $.each(this, function(i, element) { 20 | var $element = $(element); 21 | init($element, settings); 22 | }); 23 | return this; 24 | }; 25 | 26 | $(function() { 27 | // Initialize all autocomplete widgets except the one in the template 28 | // form used when a new formset is added. 29 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); 30 | }); 31 | 32 | $(document).on('formset:added', (function() { 33 | return function(event, $newFormset) { 34 | return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); 35 | }; 36 | })(this)); 37 | }(django.jQuery)); 38 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/templates/restaurants_map/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 16 | 17 | 18 | 19 | 20 | 21 | 공무원피셜 존맛탱 맛집 22 | 23 | 24 | 25 | {% block content %}{% endblock content %} 26 | 27 | 28 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/templates/restaurants_map/complete_email.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 공무원 맛집 지도 21 | 22 | 23 |
24 |
25 |

종로구 맛집 지도

26 |
27 |
28 |

메일링 리스트에 추가되셨습니다.

29 |
30 |
31 |

8월 1일

32 |

종로구의 공무원들이 가장 자주가는

33 |

진짜 맛집 지도를 보내드립니다.

34 |
35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt: -------------------------------------------------------------------------------- 1 | Copyright jQuery Foundation and other contributors, https://jquery.org/ 2 | 3 | This software consists of voluntary contributions made by many 4 | individuals. For exact contribution history, see the revision history 5 | available at https://github.com/jquery/jquery 6 | 7 | ==== 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining 10 | a copy of this software and associated documentation files (the 11 | "Software"), to deal in the Software without restriction, including 12 | without limitation the rights to use, copy, modify, merge, publish, 13 | distribute, sublicense, and/or sell copies of the Software, and to 14 | permit persons to whom the Software is furnished to do so, subject to 15 | the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be 18 | included in all copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/templates/restaurants_map/input_email.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 공무원 맛집 지도 10 | 11 | 12 |
13 |
14 |

종로구 맛집 지도

15 |
16 | 17 |
18 |

서울시청, 정부종합청사에서 지출된

19 |

업무추진비(판공비)를 분석해

20 |

고위 공무원들이 자주 가는 맛집 지도가

21 |

8월 1일에 공개됩니다

22 |
23 | 24 |
25 |

SNS 홍보가 아닌

26 |

깔끔하고 정갈하고 가격도 적당한

27 |

진짜 맛집을 찾아보세요!

28 |
29 | 30 |
31 | {% csrf_token %} 32 | 35 |
36 | 37 |
38 |
39 | 40 | 41 |
42 | 43 | 44 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | body.login { 4 | background: #f8f8f8; 5 | } 6 | 7 | .login #header { 8 | height: auto; 9 | padding: 5px 16px; 10 | } 11 | 12 | .login #header h1 { 13 | font-size: 18px; 14 | } 15 | 16 | .login #header h1 a { 17 | color: #fff; 18 | } 19 | 20 | .login #content { 21 | padding: 20px 20px 0; 22 | } 23 | 24 | .login #container { 25 | background: #fff; 26 | border: 1px solid #eaeaea; 27 | border-radius: 4px; 28 | overflow: hidden; 29 | width: 28em; 30 | min-width: 300px; 31 | margin: 100px auto; 32 | } 33 | 34 | .login #content-main { 35 | width: 100%; 36 | } 37 | 38 | .login .form-row { 39 | padding: 4px 0; 40 | float: left; 41 | width: 100%; 42 | border-bottom: none; 43 | } 44 | 45 | .login .form-row label { 46 | padding-right: 0.5em; 47 | line-height: 2em; 48 | font-size: 1em; 49 | clear: both; 50 | color: #333; 51 | } 52 | 53 | .login .form-row #id_username, .login .form-row #id_password { 54 | clear: both; 55 | padding: 8px; 56 | width: 100%; 57 | -webkit-box-sizing: border-box; 58 | -moz-box-sizing: border-box; 59 | box-sizing: border-box; 60 | } 61 | 62 | .login span.help { 63 | font-size: 10px; 64 | display: block; 65 | } 66 | 67 | .login .submit-row { 68 | clear: both; 69 | padding: 1em 0 0 9.4em; 70 | margin: 0; 71 | border: none; 72 | background: none; 73 | text-align: left; 74 | } 75 | 76 | .login .password-reset-link { 77 | text-align: center; 78 | } 79 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/collapse.min.js: -------------------------------------------------------------------------------- 1 | var $jscomp={scope:{},findInternal:function(a,c,b){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e'+gettext("Show")+")")});a("fieldset.collapse a.collapse-toggle").click(function(c){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", 5 | [a(this).attr("id")]);return!1})})})(django.jQuery); 6 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/prepopulate.js: -------------------------------------------------------------------------------- 1 | /*global URLify*/ 2 | (function($) { 3 | 'use strict'; 4 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { 5 | /* 6 | Depends on urlify.js 7 | Populates a selected field with the values of the dependent fields, 8 | URLifies and shortens the string. 9 | dependencies - array of dependent fields ids 10 | maxLength - maximum length of the URLify'd string 11 | allowUnicode - Unicode support of the URLify'd string 12 | */ 13 | return this.each(function() { 14 | var prepopulatedField = $(this); 15 | 16 | var populate = function() { 17 | // Bail if the field's value has been changed by the user 18 | if (prepopulatedField.data('_changed')) { 19 | return; 20 | } 21 | 22 | var values = []; 23 | $.each(dependencies, function(i, field) { 24 | field = $(field); 25 | if (field.val().length > 0) { 26 | values.push(field.val()); 27 | } 28 | }); 29 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); 30 | }; 31 | 32 | prepopulatedField.data('_changed', false); 33 | prepopulatedField.change(function() { 34 | prepopulatedField.data('_changed', true); 35 | }); 36 | 37 | if (!prepopulatedField.val()) { 38 | $(dependencies.join(',')).keyup(populate).change(populate).focus(populate); 39 | } 40 | }); 41 | }; 42 | })(django.jQuery); 43 | -------------------------------------------------------------------------------- /공무원지도_피드백.md: -------------------------------------------------------------------------------- 1 | # 공무원 맛집 지도 2 | 3 | #### 40대 남성 피드백 (일반) 4 | 5 | 1. 최근에 가장 맛있다고 느낀 맛집은 어디시고 누구랑 가셨나요? **파워플랜트. 외국인 친구랑 갔습니다. 서교동 과수원** 6 | 2. 맛집 좋아하세요? 좋아하시면 어떻게 맛집을 찾으시나요? **지인 추천으로 주로 갑니다. 아니면 다이닝코드** 7 | 3. 맛집을 모아놓은 리스트나 지도를 직접 찾아보거나 접한 적이 있으신가요? **다이닝코드를 주로 찾습니다.** 8 | 4. SNS로 공유하거나 하기도 하시나요? **아뇨 별로. 단톡방에는 사진 형태로 맛있다고 공유하는 경우가 많은 것 같아요.** 9 | 5. 직접 찾아보셨다면 어떤 상황에서 찾아보셨나요? (데이트, 업체 미팅, ) **혼자 일하는 바람에 요새 많이 찾아요. ** 10 | 6. 맛있는 스콘집만 찾아다니는 분이 있어요. 적극적으로 찾더라구요. 11 | 7. 12 | 13 | #### 선생님 피드백 (기술) 14 | 15 | 1. 랜딩페이지에 CTA가 없어요. 16 | 2. 페이스북 픽셀 17 | 3. 우리가 한 방식에 대한 피드백 18 | 4. 구글애널리틱스, A/B테스트 > positive 지표로 go를 설정하세욧 19 | 5. 연령대 말고 나이로 받고, 얼마나 자주 가시는지? 이런 것은 미리 클러스터하지 말고 주관식으로 받는게 좋지 않을까? 20 | 6. 페이스북 광고를 브로드하게 하고 좁혀가는게 나을거같아요. 21 | 22 | 23 | 24 | #### 컨설팅 피드백 25 | 26 | 1. 콘텐츠는 하나의 가지일뿐 27 | 2. 카드 단말기 회사에서 회식할때 매출이 높지만 단가가 낮은 곳으로 결정함. 28 | 29 | (가격도 싸고 가성비도 좋음) > 서울 시장님이 좋아하는 가성비 갑 식당. 30 | 31 | 3. A/B 테스트는 가장 우리 비즈니스에 사업에 핵심이 되는 것을 고르라. (가설을 쭉 적어 두고 이 중에 가장 핵심을 찾을 것.) 식당 리스트를 주변인에게 보여주고 일주일뒤에 가보았는지 확인할 것. (그리고 간 사람이 있다면 그사람에 대해 자세한 설문을 해볼 것) 32 | 33 | 34 | 35 | **What to do** 36 | 37 | - 비즈니스 목표 38 | - 타겟 갈증(페인포인트) 정의 39 | - A라는 사람들은 B라는 문제를 갖고 있을 것이다. 그 사람들은 여기에 C만큼의 비용을 지불할 의사가 있다. 그리고 우리가 제공할 D는 이 B를 해결해준다. 40 | - 우리의 A : 국회 비서관, 기자, 상견례, 협력 업체 , 접대 / 대기업 회식 41 | - 우리의 B : 42 | - 우리의 C : 43 | - 우리의 D : 44 | - 무료 사업은 빠르게 피드백을 받지 못한다. (돈(수고-이메일)을 지불하게 하는 것이 피드백을 정확히 받는 데 유리하다.) 45 | 46 | **컨설팅 아이디어** 47 | 48 | - 공무원 카드 사용 내역 > 식당 외 사무 용품에 대한 데이터를 뽑는 게 어떤가? 더 좋은 가격에 더 좋은 물품을 사는 데 도움이 되는 항목으로 고민해보자. 49 | - 서울시에서 가장 많이 구매한 USB 제조사는 어디인가? 50 | 51 | 52 | 53 | **설문조사 관련 인사이트** 54 | 55 | - 가장 중요한 것은 우리가 필요한 정보를 얻을 수 있는 질문을 하는 것. 56 | 57 | - 나이/성별 처럼 인..인구통계(?)적인 데이터는 올바른 타겟을 특정하는데 좋은 지표가 아니다. (나이가 많고 여자여도 젊은 남자의 취향을 가질 수도 있잖아?!) 58 | 59 | - 보통 ~~? 으로 시작하는 질문보다는 **과거에**로 시작하는 질문이 더 정확한 답변을 얻을 수 있다. 60 | 61 | 62 | 63 | **Team project** 64 | 65 | - 의사결정방법론 66 | - 다수결을 했을떄 내가 하기 싫은 일을 맡았을때 67 | - 팀원은 대화를 많이 한다. 너가 시도해보고싶은 거 뭐야? 선택권(자율성)이 있는 것처럼 / 우리 팀의 일을한다. > 우리 팀의 진척, 문제, 어떤 의미를 가지고 68 | - 사람의 내재정 동기 자율성, 역량, 소속감 69 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/templates/restaurants_map/category_1_mayor.html: -------------------------------------------------------------------------------- 1 | {% extends "restaurants_map/base.html" %} 2 | 3 | {% block content %} 4 | 64 |
65 |
서울시장 최애맛집
66 |

박원순 시장이 지난 3년간 가장 자주 다닌 맛집 TOP 5

67 |

업무추진비 분석결과, 박원순 시장은 양식보다는 한식과 중식을 즐겨찾는 것으로 나타났다. 68 | 주로 조용하고 정갈한 분위기로, 2만원 후반의 가격대의 식당을 찾는다면 박원순 시장이 즐겨찾는 맛집을 눈여겨보자 69 |

70 |
71 | 72 |
73 |
달개비 자연음식
74 | 75 |

76 | 박원순 시장이 거의 매 달 방문하는 서울 양반집 스타일의 코스요리집. 77 | 유기농 식재료에 인공조미료를 첨가하지 않은, 그야말로 '자연밥상'을 맛볼 수 있다. 78 | 조용한 분위기에서 정갈한 한정식을 맛볼 수 있어 79 | 정무부시장 등 고위직들이 자주 찾는 맛집!
80 |

81 | 82 |

주소 서울시 중구 정동 3-1

83 |

영업시간 12:00 ~ 22:00 (일 휴무)

84 |

가격 한상차림 29,700원, 특선 정식 44,000원

85 |

▶ 식당상세정보

86 | 87 | 88 |
89 | 90 | {% endblock content %} 91 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/css/responsive_rtl.css: -------------------------------------------------------------------------------- 1 | /* TABLETS */ 2 | 3 | @media (max-width: 1024px) { 4 | [dir="rtl"] .colMS { 5 | margin-right: 0; 6 | } 7 | 8 | [dir="rtl"] #user-tools { 9 | text-align: right; 10 | } 11 | 12 | [dir="rtl"] #changelist .actions label { 13 | padding-left: 10px; 14 | padding-right: 0; 15 | } 16 | 17 | [dir="rtl"] #changelist .actions select { 18 | margin-left: 0; 19 | margin-right: 15px; 20 | } 21 | 22 | [dir="rtl"] .change-list .filtered .results, 23 | [dir="rtl"] .change-list .filtered .paginator, 24 | [dir="rtl"] .filtered #toolbar, 25 | [dir="rtl"] .filtered div.xfull, 26 | [dir="rtl"] .filtered .actions { 27 | margin-right: 0; 28 | margin-left: 230px; 29 | } 30 | 31 | [dir="rtl"] .inline-group ul.tools a.add, 32 | [dir="rtl"] .inline-group div.add-row a, 33 | [dir="rtl"] .inline-group .tabular tr.add-row td a { 34 | padding: 8px 26px 8px 10px; 35 | background-position: calc(100% - 8px) 9px; 36 | } 37 | 38 | [dir="rtl"] .related-widget-wrapper-link + .selector { 39 | margin-right: 0; 40 | margin-left: 15px; 41 | } 42 | 43 | [dir="rtl"] .selector .selector-filter label { 44 | margin-right: 0; 45 | margin-left: 8px; 46 | } 47 | 48 | [dir="rtl"] .object-tools li { 49 | float: right; 50 | } 51 | 52 | [dir="rtl"] .object-tools li + li { 53 | margin-left: 0; 54 | margin-right: 15px; 55 | } 56 | 57 | [dir="rtl"] .dashboard .module table td a { 58 | padding-left: 0; 59 | padding-right: 16px; 60 | } 61 | } 62 | 63 | /* MOBILE */ 64 | 65 | @media (max-width: 767px) { 66 | [dir="rtl"] .change-list .filtered .results, 67 | [dir="rtl"] .change-list .filtered .paginator, 68 | [dir="rtl"] .filtered #toolbar, 69 | [dir="rtl"] .filtered div.xfull, 70 | [dir="rtl"] .filtered .actions { 71 | margin-left: 0; 72 | } 73 | 74 | [dir="rtl"] .aligned .add-another, 75 | [dir="rtl"] .aligned .related-lookup, 76 | [dir="rtl"] .aligned .datetimeshortcuts { 77 | margin-left: 0; 78 | margin-right: 15px; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/actions.min.js: -------------------------------------------------------------------------------- 1 | (function(a){var f;a.fn.actions=function(e){var b=a.extend({},a.fn.actions.defaults,e),g=a(this),k=!1,l=function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},n=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},p=function(){n(); 2 | a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)},q=function(c){c?l():n();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length,d=a(".action-counter").data("actionsIcnt");a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:d},!0));a(b.allToggle).prop("checked",function(){var a;c===g.length?(a=!0,l()):(a=!1,p());return a})};a(b.counterContainer).show(); 3 | a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass);h();1===a(b.acrossInput).val()&&m()});a(b.allToggle).show().click(function(){q(a(this).prop("checked"));h()});a("a",b.acrossQuestions).click(function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("a",b.acrossClears).click(function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);p();q(0);h()});f=null;a(g).click(function(c){c||(c=window.event);var d=c.target?c.target:c.srcElement;if(f&& 4 | a.data(f)!==a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(g).each(function(){if(a.data(this)===a.data(f)||a.data(this)===a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").on("change","td:gt(0) :input",function(){k=!0});a('form#changelist-form button[name="index"]').click(function(a){if(k)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))}); 5 | a('form#changelist-form input[name="_save"]').click(function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return k?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")):confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})}; 6 | a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"};a(document).ready(function(){var e=a("tr input.action-select");0 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 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/timeparse.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | var timeParsePatterns = [ 4 | // 9 5 | { 6 | re: /^\d{1,2}$/i, 7 | handler: function(bits) { 8 | if (bits[0].length === 1) { 9 | return '0' + bits[0] + ':00'; 10 | } else { 11 | return bits[0] + ':00'; 12 | } 13 | } 14 | }, 15 | // 13:00 16 | { 17 | re: /^\d{2}[:.]\d{2}$/i, 18 | handler: function(bits) { 19 | return bits[0].replace('.', ':'); 20 | } 21 | }, 22 | // 9:00 23 | { 24 | re: /^\d[:.]\d{2}$/i, 25 | handler: function(bits) { 26 | return '0' + bits[0].replace('.', ':'); 27 | } 28 | }, 29 | // 3 am / 3 a.m. / 3am 30 | { 31 | re: /^(\d+)\s*([ap])(?:.?m.?)?$/i, 32 | handler: function(bits) { 33 | var hour = parseInt(bits[1]); 34 | if (hour === 12) { 35 | hour = 0; 36 | } 37 | if (bits[2].toLowerCase() === 'p') { 38 | if (hour === 12) { 39 | hour = 0; 40 | } 41 | return (hour + 12) + ':00'; 42 | } else { 43 | if (hour < 10) { 44 | return '0' + hour + ':00'; 45 | } else { 46 | return hour + ':00'; 47 | } 48 | } 49 | } 50 | }, 51 | // 3.30 am / 3:15 a.m. / 3.00am 52 | { 53 | re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i, 54 | handler: function(bits) { 55 | var hour = parseInt(bits[1]); 56 | var mins = parseInt(bits[2]); 57 | if (mins < 10) { 58 | mins = '0' + mins; 59 | } 60 | if (hour === 12) { 61 | hour = 0; 62 | } 63 | if (bits[3].toLowerCase() === 'p') { 64 | if (hour === 12) { 65 | hour = 0; 66 | } 67 | return (hour + 12) + ':' + mins; 68 | } else { 69 | if (hour < 10) { 70 | return '0' + hour + ':' + mins; 71 | } else { 72 | return hour + ':' + mins; 73 | } 74 | } 75 | } 76 | }, 77 | // noon 78 | { 79 | re: /^no/i, 80 | handler: function(bits) { 81 | return '12:00'; 82 | } 83 | }, 84 | // midnight 85 | { 86 | re: /^mid/i, 87 | handler: function(bits) { 88 | return '00:00'; 89 | } 90 | } 91 | ]; 92 | 93 | function parseTimeString(s) { 94 | for (var i = 0; i < timeParsePatterns.length; i++) { 95 | var re = timeParsePatterns[i].re; 96 | var handler = timeParsePatterns[i].handler; 97 | var bits = re.exec(s); 98 | if (bits) { 99 | return handler(bits); 100 | } 101 | } 102 | return s; 103 | } 104 | 105 | window.parseTimeString = parseTimeString; 106 | })(); 107 | -------------------------------------------------------------------------------- /official_div.json: -------------------------------------------------------------------------------- 1 | #-*-coding: utf-8 2 | # 시장/ 부시장 직속 부서들만 먼저! 3 | json_hierarchy = [ 4 | { 5 | "div" : "서울특별시장" 6 | }, 7 | { 8 | "div" : "대변인", 9 | "child" : "언론담당관" 10 | }, 11 | { 12 | "div": "감사위원회", 13 | "child": "조사담당관/안전담당관/감사담당관" 14 | }, 15 | { 16 | "div": "시민감사옴부즈만위원회" 17 | }, 18 | { 19 | "div": "서울혁신기획관", 20 | "child": "인권담당관/지역공동체담당관/사회혁신담당관/청년정책담당관/갈등조정담당관/민관협력담당관" 21 | }, 22 | { 23 | "div": "시민소통기획관", 24 | "child": "시민소통담당관/시민봉사담당관/도시브랜드담당관/신속행정담당관/뉴미디어담당관" 25 | }, 26 | { 27 | "div": "행정1부시장" 28 | }, 29 | { 30 | "div": "여성가족정책실", 31 | "child": "가족담당관/외국인다문화담당관/여성정책담당관/보육담당관" 32 | }, 33 | { 34 | "div": "민생사법경찰단" 35 | }, 36 | { 37 | "div": "비상기획관", 38 | "child": "민방위담당관" 39 | }, 40 | { 41 | "div": "정보기획관", 42 | "child": "통계데이터담당관/정보기획담당관/정보통신보안담당관/공간정보담당관/정보시스템담당관" 43 | }, 44 | { 45 | "div": "일자리노동정책관", 46 | "child": "사회적경제담당관/노동정책담당관/일자리정책담당관" 47 | }, 48 | { 49 | "div": "행정2부시장" 50 | }, 51 | { 52 | "div": "도시공간개선단" 53 | }, 54 | { 55 | "div": "기술심사담당관" 56 | }, 57 | { 58 | "div": "정무부시장" 59 | }, 60 | { 61 | "div": "기획조정실", 62 | "child": [ 63 | { 64 | "div": "국제교류담당관" 65 | }, 66 | { 67 | "div": "정책기획관", 68 | "child": "기획담당관/법률지원담당관/대외협력담당관/조직담당관/법무담당관/평가담당관" 69 | }, 70 | { 71 | "div": "해외도시협력담당관" 72 | }, 73 | { 74 | "div": "재정기획관", 75 | "child": "예산담당관/시민참여예산과/공기업담당관/재정관리담당관/시민참여예산담당관" 76 | } 77 | ] 78 | }, 79 | { 80 | "div": "경제진흥본부", 81 | "child": { 82 | "div": "창조경제기획관", 83 | "child": "도시농업과/경제정책과/민생경제과/화융합경제과/디지털창업과/투자유치과/소상공인지원과" 84 | } 85 | }, 86 | { 87 | "div": "복지본부", 88 | "child":"자활지원과/어르신복지과/희망복지지원과/복지정책과/장애인복지정책과/인생이모작지원과/장애인자립지원과" 89 | }, 90 | 91 | { 92 | "div": "문화본부", 93 | "child":[ 94 | { 95 | "div": "문화정책과" 96 | }, 97 | { 98 | "div": "한양도성도감" 99 | }, 100 | { 101 | "div": "문화시설추진단", 102 | "child": "문화시설과/박물관" 103 | }, 104 | { 105 | "div": "역사문화재과" 106 | }, 107 | { 108 | "div": "디자인정책과" 109 | }, 110 | { 111 | "div": "문화예술과" 112 | } 113 | ] 114 | }, 115 | { 116 | "div": "기후환경본부", 117 | "child":"자원순환과/대기정책과/기후대기과/에너지시민협력과/녹색에너지과/생활환경과/대기관리과/환경정책과/기후변화대응과" 118 | }, 119 | { 120 | "div": "행정국", 121 | "child":"인사과/인력개발과/정보공개정책과/총무과/자치행정과" 122 | }, 123 | { 124 | "div": "재무국", 125 | "child": "38세금징수과/계약심사과/재무과/세무과/자산관리과/세제과" 126 | }, 127 | { 128 | "div": "평생교육국", 129 | "child": "평생교육과/청소년정책과/교육정책과/친환경급식" 130 | }, 131 | { 132 | "div": "관광체육국", 133 | "child": "관광정책과/체육진흥과/체육정책과/관광사업과" 134 | }, 135 | { 136 | "div": "시민건강국", 137 | "child": "식품안전과/생활보건과/식품정책과/건강증진과/동물보호과/보건의료정책과" 138 | }, 139 | { 140 | "div": "안전총괄본부", 141 | "child":[ 142 | { 143 | "div":"서울역일대종합발전기획단" 144 | }, 145 | { 146 | "div":"안전총괄관", 147 | "child": "안전총괄과/시설안전과/도로관리과/교량안전과/도로시설과/도로계획과/보도환경개선과/상황대응과" 148 | } 149 | ] 150 | }, 151 | ] 152 | -------------------------------------------------------------------------------- /restaurants_rank/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for restaurants_rank project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.0.7. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.0/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'h8)e)4j3a4yhi*9mpbh%+u$7zhgoy=r+^$f(a=%dk-&2np8$(l' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [ 29 | '127.0.0.1', 30 | 'localhost', 31 | '.ap-northeast-2.compute.amazonaws.com', 32 | 'http://13.209.26.216', 33 | ] 34 | 35 | 36 | # Application definition 37 | 38 | INSTALLED_APPS = [ 39 | 'django.contrib.admin', 40 | 'django.contrib.auth', 41 | 'django.contrib.contenttypes', 42 | 'django.contrib.sessions', 43 | 'django.contrib.messages', 44 | 'django.contrib.staticfiles', 45 | 'restaurants_map', 46 | ] 47 | 48 | MIDDLEWARE = [ 49 | 'django.middleware.security.SecurityMiddleware', 50 | 'django.contrib.sessions.middleware.SessionMiddleware', 51 | 'django.middleware.common.CommonMiddleware', 52 | 'django.middleware.csrf.CsrfViewMiddleware', 53 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 54 | 'django.contrib.messages.middleware.MessageMiddleware', 55 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 56 | ] 57 | 58 | ROOT_URLCONF = 'restaurants_rank.urls' 59 | 60 | TEMPLATES = [ 61 | { 62 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 63 | 'DIRS': [], 64 | 'APP_DIRS': True, 65 | 'OPTIONS': { 66 | 'context_processors': [ 67 | 'django.template.context_processors.debug', 68 | 'django.template.context_processors.request', 69 | 'django.contrib.auth.context_processors.auth', 70 | 'django.contrib.messages.context_processors.messages', 71 | ], 72 | }, 73 | }, 74 | ] 75 | 76 | WSGI_APPLICATION = 'restaurants_rank.wsgi.application' 77 | 78 | 79 | # Database 80 | # https://docs.djangoproject.com/en/2.0/ref/settings/#databases 81 | 82 | DATABASES = { 83 | 'default': { 84 | 'ENGINE': 'django.db.backends.sqlite3', 85 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 86 | } 87 | } 88 | 89 | 90 | # Password validation 91 | # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators 92 | 93 | AUTH_PASSWORD_VALIDATORS = [ 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 102 | }, 103 | { 104 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 105 | }, 106 | ] 107 | 108 | 109 | # Internationalization 110 | # https://docs.djangoproject.com/en/2.0/topics/i18n/ 111 | 112 | LANGUAGE_CODE = 'en-us' 113 | 114 | TIME_ZONE = 'Asia/Seoul' 115 | 116 | USE_I18N = True 117 | 118 | USE_L10N = True 119 | 120 | USE_TZ = True 121 | 122 | 123 | # Static files (CSS, JavaScript, Images) 124 | # https://docs.djangoproject.com/en/2.0/howto/static-files/ 125 | 126 | STATIC_URL = '/static/' 127 | STATIC_ROOT = os.path.join(BASE_DIR, 'static') 128 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_rank/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for restaurants_rank project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.0.7. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.0/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'h8)e)4j3a4yhi*9mpbh%+u$7zhgoy=r+^$f(a=%dk-&2np8$(l' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [ 29 | '127.0.0.1', 30 | 'localhost', 31 | '.ap-northeast-2.compute.amazonaws.com', 32 | '13.209.26.216' 33 | ] 34 | 35 | 36 | # Application definition 37 | 38 | INSTALLED_APPS = [ 39 | 'django.contrib.admin', 40 | 'django.contrib.auth', 41 | 'django.contrib.contenttypes', 42 | 'django.contrib.sessions', 43 | 'django.contrib.messages', 44 | 'django.contrib.staticfiles', 45 | 'restaurants_map', 46 | ] 47 | 48 | MIDDLEWARE = [ 49 | 'django.middleware.security.SecurityMiddleware', 50 | 'django.contrib.sessions.middleware.SessionMiddleware', 51 | 'django.middleware.common.CommonMiddleware', 52 | 'django.middleware.csrf.CsrfViewMiddleware', 53 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 54 | 'django.contrib.messages.middleware.MessageMiddleware', 55 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 56 | ] 57 | 58 | ROOT_URLCONF = 'restaurants_rank.urls' 59 | 60 | TEMPLATES = [ 61 | { 62 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 63 | 'DIRS': [], 64 | 'APP_DIRS': True, 65 | 'OPTIONS': { 66 | 'context_processors': [ 67 | 'django.template.context_processors.debug', 68 | 'django.template.context_processors.request', 69 | 'django.contrib.auth.context_processors.auth', 70 | 'django.contrib.messages.context_processors.messages', 71 | ], 72 | }, 73 | }, 74 | ] 75 | 76 | WSGI_APPLICATION = 'restaurants_rank.wsgi.application' 77 | 78 | 79 | # Database 80 | # https://docs.djangoproject.com/en/2.0/ref/settings/#databases 81 | 82 | DATABASES = { 83 | 'default': { 84 | 'ENGINE': 'django.db.backends.sqlite3', 85 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 86 | } 87 | } 88 | 89 | 90 | # Password validation 91 | # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators 92 | 93 | AUTH_PASSWORD_VALIDATORS = [ 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 102 | }, 103 | { 104 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 105 | }, 106 | ] 107 | 108 | 109 | # Internationalization 110 | # https://docs.djangoproject.com/en/2.0/topics/i18n/ 111 | 112 | LANGUAGE_CODE = 'en-us' 113 | 114 | TIME_ZONE = 'Asia/Seoul' 115 | 116 | USE_I18N = True 117 | 118 | USE_L10N = True 119 | 120 | USE_TZ = True 121 | 122 | 123 | # Static files (CSS, JavaScript, Images) 124 | # https://docs.djangoproject.com/en/2.0/howto/static-files/ 125 | 126 | STATIC_URL = '/static/' 127 | STATIC_ROOT = os.path.join(BASE_DIR, 'static') 128 | STATICFILES_DIRS = [ 129 | os.path.join(BASE_DIR, 'assets'), # Here you tell django to look for a folder named 'assets' 130 | ] 131 | -------------------------------------------------------------------------------- /restaurants_rank/static/css/restaurants_map.css: -------------------------------------------------------------------------------- 1 | 2 | .container { 3 | display: flex; 4 | align-items: center; 5 | justify-content: center; 6 | flex-direction: column; 7 | align-items: center; 8 | height: 100% 9 | overflow:scroll; 10 | } 11 | 12 | body { 13 | height:100%; 14 | background-position:center; 15 | background-color: #171A3D; 16 | } 17 | 18 | html { 19 | height:100%; 20 | } 21 | 22 | .price p{ 23 | font-size: 10rem; 24 | width: 800px; 25 | font-family: 'Noto Sans KR'; 26 | text-align: center; 27 | color: #18C2C0; 28 | font-weight: bold; 29 | } 30 | 31 | .info { 32 | display: inline-block; 33 | max-width: 800px; 34 | width: 300px; 35 | background-color: transparent; 36 | font-family: "Source Code Pro"; 37 | border: none; 38 | outline: none; 39 | margin-left: 50px; 40 | color: white; 41 | } 42 | 43 | .desc p{ 44 | font-size: 5rem; 45 | width: 800px; 46 | font-family: 'Noto Sans KR'; 47 | color:#aaaaaa; 48 | margin-top:0px; 49 | margin-bottom: 0px; 50 | text-align: center; 51 | } 52 | 53 | .subtitle p{ 54 | width: 800px; 55 | font-family: 'Noto Sans KR'; 56 | font-size: 5rem; 57 | font-weight: bold; 58 | text-align: left; 59 | color:#bbbbbb; 60 | margin-bottom: 20px 61 | } 62 | 63 | .title p{ 64 | font-weight: bold; 65 | font-size: 10rem; 66 | width: 800px; 67 | font-family: 'Noto Sans KR'; 68 | text-align: center; 69 | color: #18C2C0; 70 | margin-bottom:20px; 71 | } 72 | 73 | .desc { 74 | margin-bottom: 20px; 75 | } 76 | 77 | p{ 78 | font-family: 'Noto Sans KR'; 79 | font-size: 4rem; 80 | text-align: center; 81 | color: #ffffff 82 | } 83 | 84 | .button button { 85 | font-size: 5rem; 86 | font-weight: 400; 87 | font-family:'Noto Sans KR'; 88 | letter-spacing: 1px; 89 | width: 800px; 90 | background-color: #18C2C0; 91 | border: none; 92 | color: #fff; 93 | padding: 18px; 94 | border-radius: 5px; 95 | outline: none; 96 | transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1); 97 | } 98 | .button button:hover { 99 | background-color: #15aeac; 100 | } 101 | .button button:active { 102 | background-color: #139b99; 103 | } 104 | .button button i { 105 | font-size: 1.2rem; 106 | margin-right: 5px; 107 | } 108 | 109 | .email input{ 110 | font-family:'Noto Sans KR'; 111 | font-size: 5.1rem; 112 | font-weight: 400; 113 | letter-spacing: 1px; 114 | width: 800px; 115 | background-color: #656565; 116 | border: none; 117 | color: #E0E0E0; 118 | padding: 18px; 119 | border-radius: 5px; 120 | outline: none; 121 | transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1); 122 | margin-bottom: 25px; 123 | margin-top: 50px; 124 | } 125 | 126 | .zui-table { 127 | border: solid 1px #DDEEEE; 128 | border-collapse: collapse; 129 | border-spacing: 0; 130 | font: normal 13px Arial, sans-serif; 131 | } 132 | 133 | .zui-table thead th { 134 | font-size: 4rem; 135 | width: 150px; 136 | text-align: center; 137 | font-family: 'Noto Sans KR'; 138 | background-color: #171a3d; 139 | border: solid 1px #171a3d; 140 | color: #336B6B; 141 | padding: 10px; 142 | text-align: left; 143 | text-shadow: 1px 1px 1px #fff; 144 | } 145 | 146 | .zui-table .dining thead th { 147 | font-size: 4rem; 148 | width: 500px; 149 | font-family: 'Noto Sans KR'; 150 | background-color: #DDEFEF; 151 | border: solid 1px #171a3d; 152 | color: #171a3d; 153 | padding: 10px; 154 | text-align: left; 155 | text-shadow: 1px 1px 1px #fff; 156 | } 157 | 158 | .zui-table tbody td { 159 | font-size: 4rem; 160 | font-family: 'Noto Sans KR'; 161 | border: solid 1px #171a3d; 162 | color: #333; 163 | padding: 10px; 164 | text-shadow: 1px 1px 1px #fff; 165 | } 166 | 167 | .zui-table-rounded { 168 | border: none; 169 | margin-bottom: 45px; 170 | } 171 | 172 | .zui-table-rounded thead th { 173 | background-color: #92d1cb; 174 | border: none; 175 | text-shadow: 1px 1px 1px #ccc; 176 | color: #333; 177 | } 178 | .zui-table-rounded thead th:first-child { 179 | border-radius: 10px 0 0 0; 180 | } 181 | .zui-table-rounded thead th:last-child { 182 | border-radius: 0 10px 0 0; 183 | } 184 | .zui-table-rounded tbody td { 185 | border: none; 186 | border-top: solid 1px #171a3d; 187 | background-color: #eafcf9; 188 | } 189 | .zui-table-rounded tbody tr:last-child td:first-child { 190 | border-radius: 0 0 0 10px; 191 | } 192 | .zui-table-rounded tbody tr:last-child td:last-child { 193 | border-radius: 0 0 10px 0; 194 | } 195 | 196 | .zui-table .num { 197 | width: 150px; 198 | margin-left: 10px; 199 | padding-left: 30px; 200 | } 201 | 202 | .dining { 203 | width: 350px; 204 | font-weight: bold; 205 | color: #171a3d; 206 | } 207 | 208 | .kind { 209 | width:250px; 210 | color: #171a3d; 211 | } 212 | 213 | .top10 { 214 | font-size: 6rem; 215 | width: 600px; 216 | margin-bottom: 20px; 217 | margin-top: 80px; 218 | color: #18C2C0; 219 | } 220 | -------------------------------------------------------------------------------- /restaurants_rank/static/css/restaurant_map.css: -------------------------------------------------------------------------------- 1 | 2 | .container { 3 | display: flex; 4 | align-items: center; 5 | justify-content: center; 6 | height: 100vh; 7 | flex-direction: column; 8 | align-items: center; 9 | height: 100% 10 | } 11 | 12 | body { 13 | height:100%; 14 | background-position:center; 15 | background-color: #171A3D; 16 | overflow:scroll; 17 | } 18 | 19 | html { 20 | height:100%; 21 | } 22 | 23 | .price p{ 24 | font-size: 10rem; 25 | width: 800px; 26 | font-family: 'Noto Sans KR'; 27 | text-align: center; 28 | color: #18C2C0; 29 | font-weight: bold; 30 | } 31 | 32 | .info { 33 | display: inline-block; 34 | max-width: 800px; 35 | width: 300px; 36 | background-color: transparent; 37 | font-family: "Source Code Pro"; 38 | border: none; 39 | outline: none; 40 | margin-left: 50px; 41 | color: white; 42 | } 43 | 44 | .desc p{ 45 | font-size: 5rem; 46 | width: 800px; 47 | font-family: 'Noto Sans KR'; 48 | color:#aaaaaa; 49 | margin-top:0px; 50 | margin-bottom: 0px; 51 | text-align: center; 52 | } 53 | 54 | .subtitle p{ 55 | width: 800px; 56 | font-family: 'Noto Sans KR'; 57 | font-size: 5rem; 58 | font-weight: bold; 59 | text-align: left; 60 | color:#bbbbbb; 61 | margin-bottom: 20px 62 | } 63 | 64 | .title p{ 65 | font-weight: bold; 66 | font-size: 10rem; 67 | width: 800px; 68 | font-family: 'Noto Sans KR'; 69 | text-align: center; 70 | color: #18C2C0; 71 | margin-top:1000px; 72 | margin-bottom:20px; 73 | } 74 | 75 | .desc { 76 | margin-bottom: 20px; 77 | } 78 | 79 | p{ 80 | font-family: 'Noto Sans KR'; 81 | font-size: 4rem; 82 | text-align: center; 83 | color: #ffffff 84 | } 85 | 86 | .button button { 87 | font-size: 5rem; 88 | font-weight: 400; 89 | font-family:'Noto Sans KR'; 90 | letter-spacing: 1px; 91 | width: 800px; 92 | background-color: #18C2C0; 93 | border: none; 94 | color: #fff; 95 | padding: 18px; 96 | border-radius: 5px; 97 | outline: none; 98 | transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1); 99 | } 100 | .button button:hover { 101 | background-color: #15aeac; 102 | } 103 | .button button:active { 104 | background-color: #139b99; 105 | } 106 | .button button i { 107 | font-size: 1.2rem; 108 | margin-right: 5px; 109 | } 110 | 111 | .email input{ 112 | font-family:'Noto Sans KR'; 113 | font-size: 5.1rem; 114 | font-weight: 400; 115 | letter-spacing: 1px; 116 | width: 800px; 117 | background-color: #656565; 118 | border: none; 119 | color: #E0E0E0; 120 | padding: 18px; 121 | border-radius: 5px; 122 | outline: none; 123 | transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1); 124 | margin-bottom: 25px; 125 | margin-top: 50px; 126 | } 127 | 128 | .zui-table { 129 | border: solid 1px #DDEEEE; 130 | border-collapse: collapse; 131 | border-spacing: 0; 132 | font: normal 13px Arial, sans-serif; 133 | } 134 | 135 | .zui-table thead th { 136 | font-size: 4rem; 137 | width: 150px; 138 | text-align: center; 139 | font-family: 'Noto Sans KR'; 140 | background-color: #171a3d; 141 | border: solid 1px #171a3d; 142 | color: #336B6B; 143 | padding: 10px; 144 | text-align: left; 145 | text-shadow: 1px 1px 1px #fff; 146 | } 147 | 148 | .zui-table .dining thead th { 149 | font-size: 4rem; 150 | width: 500px; 151 | font-family: 'Noto Sans KR'; 152 | background-color: #DDEFEF; 153 | border: solid 1px #171a3d; 154 | color: #171a3d; 155 | padding: 10px; 156 | text-align: left; 157 | text-shadow: 1px 1px 1px #fff; 158 | } 159 | 160 | .zui-table tbody td { 161 | font-size: 4rem; 162 | font-family: 'Noto Sans KR'; 163 | border: solid 1px #171a3d; 164 | color: #333; 165 | padding: 10px; 166 | text-shadow: 1px 1px 1px #fff; 167 | } 168 | 169 | .zui-table-rounded { 170 | border: none; 171 | margin-bottom: 45px; 172 | } 173 | 174 | .zui-table-rounded thead th { 175 | background-color: #92d1cb; 176 | border: none; 177 | text-shadow: 1px 1px 1px #ccc; 178 | color: #333; 179 | } 180 | .zui-table-rounded thead th:first-child { 181 | border-radius: 10px 0 0 0; 182 | } 183 | .zui-table-rounded thead th:last-child { 184 | border-radius: 0 10px 0 0; 185 | } 186 | .zui-table-rounded tbody td { 187 | border: none; 188 | border-top: solid 1px #171a3d; 189 | background-color: #eafcf9; 190 | } 191 | .zui-table-rounded tbody tr:last-child td:first-child { 192 | border-radius: 0 0 0 10px; 193 | } 194 | .zui-table-rounded tbody tr:last-child td:last-child { 195 | border-radius: 0 0 10px 0; 196 | } 197 | 198 | .zui-table .num { 199 | width: 150px; 200 | margin-left: 10px; 201 | padding-left: 30px; 202 | } 203 | 204 | .dining { 205 | width: 350px; 206 | font-weight: bold; 207 | color: #171a3d; 208 | } 209 | 210 | .kind { 211 | width:250px; 212 | color: #171a3d; 213 | } 214 | 215 | .top10 { 216 | font-size: 6rem; 217 | width: 600px; 218 | margin-bottom: 20px; 219 | margin-top: 80px; 220 | color: #18C2C0; 221 | } 222 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/static/css/restaurants_map.css: -------------------------------------------------------------------------------- 1 | 2 | .container { 3 | display: flex; 4 | align-items: center; 5 | justify-content: center; 6 | flex-direction: column; 7 | align-items: center; 8 | height: 100% 9 | overflow:scroll; 10 | } 11 | 12 | body { 13 | height:100%; 14 | background-position:center; 15 | background-color: #171A3D; 16 | } 17 | 18 | html { 19 | height:100%; 20 | } 21 | 22 | .price p{ 23 | font-size: 10rem; 24 | width: 800px; 25 | font-family: 'Noto Sans KR'; 26 | text-align: center; 27 | color: #18C2C0; 28 | font-weight: bold; 29 | } 30 | 31 | .info { 32 | display: inline-block; 33 | max-width: 800px; 34 | width: 300px; 35 | background-color: transparent; 36 | font-family: "Source Code Pro"; 37 | border: none; 38 | outline: none; 39 | margin-left: 50px; 40 | color: white; 41 | } 42 | 43 | .desc p{ 44 | font-size: 5rem; 45 | width: 800px; 46 | font-family: 'Noto Sans KR'; 47 | color:#aaaaaa; 48 | margin-top:0px; 49 | margin-bottom: 0px; 50 | text-align: center; 51 | } 52 | 53 | .subtitle p{ 54 | width: 800px; 55 | font-family: 'Noto Sans KR'; 56 | font-size: 5rem; 57 | font-weight: bold; 58 | text-align: left; 59 | color:#bbbbbb; 60 | margin-bottom: 20px 61 | } 62 | 63 | .title p{ 64 | font-weight: bold; 65 | font-size: 10rem; 66 | width: 800px; 67 | font-family: 'Noto Sans KR'; 68 | text-align: center; 69 | color: #18C2C0; 70 | margin-bottom:20px; 71 | margin-top:100px; 72 | } 73 | 74 | .desc { 75 | margin-bottom: 20px; 76 | } 77 | 78 | p{ 79 | font-family: 'Noto Sans KR'; 80 | font-size: 4rem; 81 | text-align: center; 82 | color: #ffffff 83 | } 84 | 85 | .button button { 86 | font-size: 5rem; 87 | font-weight: 400; 88 | font-family:'Noto Sans KR'; 89 | letter-spacing: 1px; 90 | width: 800px; 91 | background-color: #18C2C0; 92 | border: none; 93 | color: #fff; 94 | padding: 18px; 95 | border-radius: 5px; 96 | outline: none; 97 | transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1); 98 | } 99 | .button button:hover { 100 | background-color: #15aeac; 101 | } 102 | .button button:active { 103 | background-color: #139b99; 104 | } 105 | .button button i { 106 | font-size: 1.2rem; 107 | margin-right: 5px; 108 | } 109 | 110 | .email input{ 111 | font-family:'Noto Sans KR'; 112 | font-size: 5.1rem; 113 | font-weight: 400; 114 | letter-spacing: 1px; 115 | width: 800px; 116 | background-color: #656565; 117 | border: none; 118 | color: #E0E0E0; 119 | padding: 18px; 120 | border-radius: 5px; 121 | outline: none; 122 | transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1); 123 | margin-bottom: 25px; 124 | margin-top: 50px; 125 | } 126 | 127 | .zui-table { 128 | border: solid 1px #DDEEEE; 129 | border-collapse: collapse; 130 | border-spacing: 0; 131 | font: normal 13px Arial, sans-serif; 132 | } 133 | 134 | .zui-table thead th { 135 | font-size: 4rem; 136 | width: 150px; 137 | text-align: center; 138 | font-family: 'Noto Sans KR'; 139 | background-color: #171a3d; 140 | border: solid 1px #171a3d; 141 | color: #336B6B; 142 | padding: 10px; 143 | text-align: left; 144 | text-shadow: 1px 1px 1px #fff; 145 | } 146 | 147 | .zui-table .dining thead th { 148 | font-size: 4rem; 149 | width: 500px; 150 | font-family: 'Noto Sans KR'; 151 | background-color: #DDEFEF; 152 | border: solid 1px #171a3d; 153 | color: #171a3d; 154 | padding: 10px; 155 | text-align: left; 156 | text-shadow: 1px 1px 1px #fff; 157 | } 158 | 159 | .zui-table tbody td { 160 | font-size: 4rem; 161 | font-family: 'Noto Sans KR'; 162 | border: solid 1px #171a3d; 163 | color: #333; 164 | padding: 10px; 165 | text-shadow: 1px 1px 1px #fff; 166 | } 167 | 168 | .zui-table-rounded { 169 | border: none; 170 | margin-bottom: 45px; 171 | } 172 | 173 | .zui-table-rounded thead th { 174 | background-color: #92d1cb; 175 | border: none; 176 | text-shadow: 1px 1px 1px #ccc; 177 | color: #333; 178 | } 179 | .zui-table-rounded thead th:first-child { 180 | border-radius: 10px 0 0 0; 181 | } 182 | .zui-table-rounded thead th:last-child { 183 | border-radius: 0 10px 0 0; 184 | } 185 | .zui-table-rounded tbody td { 186 | border: none; 187 | border-top: solid 1px #171a3d; 188 | background-color: #eafcf9; 189 | } 190 | .zui-table-rounded tbody tr:last-child td:first-child { 191 | border-radius: 0 0 0 10px; 192 | } 193 | .zui-table-rounded tbody tr:last-child td:last-child { 194 | border-radius: 0 0 10px 0; 195 | } 196 | 197 | .zui-table .num { 198 | width: 150px; 199 | margin-left: 10px; 200 | padding-left: 30px; 201 | } 202 | 203 | .dining { 204 | width: 330px; 205 | font-weight: bold; 206 | color: #171a3d; 207 | } 208 | 209 | .kind { 210 | width:200px; 211 | color: #171a3d; 212 | padding-right: 30px; 213 | } 214 | 215 | .top10 { 216 | font-size: 6rem; 217 | width: 600px; 218 | margin-bottom: 20px; 219 | margin-top: 80px; 220 | color: #18C2C0; 221 | } 222 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/css/rtl.css: -------------------------------------------------------------------------------- 1 | body { 2 | direction: rtl; 3 | } 4 | 5 | /* LOGIN */ 6 | 7 | .login .form-row { 8 | float: right; 9 | } 10 | 11 | .login .form-row label { 12 | float: right; 13 | padding-left: 0.5em; 14 | padding-right: 0; 15 | text-align: left; 16 | } 17 | 18 | .login .submit-row { 19 | clear: both; 20 | padding: 1em 9.4em 0 0; 21 | } 22 | 23 | /* GLOBAL */ 24 | 25 | th { 26 | text-align: right; 27 | } 28 | 29 | .module h2, .module caption { 30 | text-align: right; 31 | } 32 | 33 | .module ul, .module ol { 34 | margin-left: 0; 35 | margin-right: 1.5em; 36 | } 37 | 38 | .addlink, .changelink { 39 | padding-left: 0; 40 | padding-right: 16px; 41 | background-position: 100% 1px; 42 | } 43 | 44 | .deletelink { 45 | padding-left: 0; 46 | padding-right: 16px; 47 | background-position: 100% 1px; 48 | } 49 | 50 | .object-tools { 51 | float: left; 52 | } 53 | 54 | thead th:first-child, 55 | tfoot td:first-child { 56 | border-left: none; 57 | } 58 | 59 | /* LAYOUT */ 60 | 61 | #user-tools { 62 | right: auto; 63 | left: 0; 64 | text-align: left; 65 | } 66 | 67 | div.breadcrumbs { 68 | text-align: right; 69 | } 70 | 71 | #content-main { 72 | float: right; 73 | } 74 | 75 | #content-related { 76 | float: left; 77 | margin-left: -300px; 78 | margin-right: auto; 79 | } 80 | 81 | .colMS { 82 | margin-left: 300px; 83 | margin-right: 0; 84 | } 85 | 86 | /* SORTABLE TABLES */ 87 | 88 | table thead th.sorted .sortoptions { 89 | float: left; 90 | } 91 | 92 | thead th.sorted .text { 93 | padding-right: 0; 94 | padding-left: 42px; 95 | } 96 | 97 | /* dashboard styles */ 98 | 99 | .dashboard .module table td a { 100 | padding-left: .6em; 101 | padding-right: 16px; 102 | } 103 | 104 | /* changelists styles */ 105 | 106 | .change-list .filtered table { 107 | border-left: none; 108 | border-right: 0px none; 109 | } 110 | 111 | #changelist-filter { 112 | right: auto; 113 | left: 0; 114 | border-left: none; 115 | border-right: none; 116 | } 117 | 118 | .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { 119 | margin-right: 0; 120 | margin-left: 280px; 121 | } 122 | 123 | #changelist-filter li.selected { 124 | border-left: none; 125 | padding-left: 10px; 126 | margin-left: 0; 127 | border-right: 5px solid #eaeaea; 128 | padding-right: 10px; 129 | margin-right: -15px; 130 | } 131 | 132 | .filtered .actions { 133 | margin-left: 280px; 134 | margin-right: 0; 135 | } 136 | 137 | #changelist table tbody td:first-child, #changelist table tbody th:first-child { 138 | border-right: none; 139 | border-left: none; 140 | } 141 | 142 | /* FORMS */ 143 | 144 | .aligned label { 145 | padding: 0 0 3px 1em; 146 | float: right; 147 | } 148 | 149 | .submit-row { 150 | text-align: left 151 | } 152 | 153 | .submit-row p.deletelink-box { 154 | float: right; 155 | } 156 | 157 | .submit-row input.default { 158 | margin-left: 0; 159 | } 160 | 161 | .vDateField, .vTimeField { 162 | margin-left: 2px; 163 | } 164 | 165 | .aligned .form-row input { 166 | margin-left: 5px; 167 | } 168 | 169 | form .aligned p.help, form .aligned div.help { 170 | clear: right; 171 | } 172 | 173 | form ul.inline li { 174 | float: right; 175 | padding-right: 0; 176 | padding-left: 7px; 177 | } 178 | 179 | input[type=submit].default, .submit-row input.default { 180 | float: left; 181 | } 182 | 183 | fieldset .field-box { 184 | float: right; 185 | margin-left: 20px; 186 | margin-right: 0; 187 | } 188 | 189 | .errorlist li { 190 | background-position: 100% 12px; 191 | padding: 0; 192 | } 193 | 194 | .errornote { 195 | background-position: 100% 12px; 196 | padding: 10px 12px; 197 | } 198 | 199 | /* WIDGETS */ 200 | 201 | .calendarnav-previous { 202 | top: 0; 203 | left: auto; 204 | right: 10px; 205 | } 206 | 207 | .calendarnav-next { 208 | top: 0; 209 | right: auto; 210 | left: 10px; 211 | } 212 | 213 | .calendar caption, .calendarbox h2 { 214 | text-align: center; 215 | } 216 | 217 | .selector { 218 | float: right; 219 | } 220 | 221 | .selector .selector-filter { 222 | text-align: right; 223 | } 224 | 225 | .inline-deletelink { 226 | float: left; 227 | } 228 | 229 | form .form-row p.datetime { 230 | overflow: hidden; 231 | } 232 | 233 | .related-widget-wrapper { 234 | float: right; 235 | } 236 | 237 | /* MISC */ 238 | 239 | .inline-related h2, .inline-group h2 { 240 | text-align: right 241 | } 242 | 243 | .inline-related h3 span.delete { 244 | padding-right: 20px; 245 | padding-left: inherit; 246 | left: 10px; 247 | right: inherit; 248 | float:left; 249 | } 250 | 251 | .inline-related h3 span.delete label { 252 | margin-left: inherit; 253 | margin-right: 2px; 254 | } 255 | 256 | /* IE7 specific bug fixes */ 257 | 258 | div.colM { 259 | position: relative; 260 | } 261 | 262 | .submit-row input { 263 | float: left; 264 | } 265 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/inlines.min.js: -------------------------------------------------------------------------------- 1 | var $jscomp={scope:{},findInternal:function(b,c,a){b instanceof String&&(b=String(b));for(var d=b.length,e=0;e'+a.addText+""),k=c.find("tr:last a")):(d.filter(":last").after('"),k=d.filter(":last").next().find("a")));k.click(function(c){c.preventDefault();c=b("#"+a.prefix+"-empty"); 6 | var d=c.clone(!0);d.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+l);d.is("tr")?d.children(":last").append('"):d.is("ul")||d.is("ol")?d.append('
  • '+a.deleteText+"
  • "):d.children(":first").append(''+a.deleteText+"");d.find("*").each(function(){e(this,a.prefix,f.val())});d.insertBefore(b(c)); 7 | b(f).val(parseInt(f.val(),10)+1);l+=1;""!==h.val()&&0>=h.val()-f.val()&&k.parent().hide();d.find("a."+a.deleteCssClass).click(function(c){c.preventDefault();d.remove();--l;a.removed&&a.removed(d);b(document).trigger("formset:removed",[d,a.prefix]);c=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(c.length);(""===h.val()||0 tr").tabularFormset(a.options)}})})})(django.jQuery); 14 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/templates/restaurants_map/dining_list.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 17 | 18 | 19 | 20 | 21 | 22 | 공무원피셜 존맛탱 맛집 23 | 24 | 25 | 26 |
    27 |
    28 |

    공무원피셜 JMT

    29 |
    30 |
    31 |

    서울시 고위 공무원들의 법카 사용내역

    32 |

    21,260건을 분석한 진짜 맛집 리스트!

    33 |
    34 |

    가장 자주 간 맛집

    35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 |
    순위식당방문횟수
    1우도일식307회
    2참숯골261회
    3구이구이248회
    61 |

    가장 돈을 많이 쓴 맛집

    62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 |
    순위식당집행금액
    1우도일식4180만원
    2참숯골3393만원
    3동해일식2945만원
    88 |

    가장 비싸게 먹은 맛집

    89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 |
    순위식당인당 지출방문 횟수
    1한미리26,598원33회
    2더테이블한정식26,430원87회
    3다한우26,290원49회
    ............
    100완산골명가10,513원26회
    131 |

    회식용 맛집

    132 |

    10명 이상의 단체 손님을 데리고 가장 많이 간 식당!

    133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 |
    순위식당방문 횟수평균 인원
    1열빈65회13명
    2더미62회12명
    3송학30회10명
    163 |
    164 | 165 | 166 | -------------------------------------------------------------------------------- /restaurants_rank/restaurants_map/templates/restaurants_map/secret_dinings.html: -------------------------------------------------------------------------------- 1 | {% extends "restaurants_map/base.html" %} 2 | 3 | {% block content %} 4 | 64 |
    65 |
    공무원피셜 존맛탱 맛집
    66 |

    업무추진비 51,456건을 분석해 알아낸 진짜 맛집 6곳

    67 |

    블로그, 인스타그램 보고 찾아갔는데 실망했던 사람들 모여라!
    68 | 서울시 업무추진비 51,456을 분석해 알아낸 진짜 맛집 6곳을 소개한다. 69 |

    70 |
    71 | 72 |
    73 |

    박원순 시장의 최애맛집

    74 |
    달개비 자연음식
    75 | 76 |

    77 | 박원순 시장이 거의 매 달 방문하는 서울 양반집 스타일의 코스요리집. 78 | 유기농 식재료에 인공조미료를 첨가하지 않은, 그야말로 '자연밥상'을 맛볼 수 있다. 79 | 조용한 분위기에서 정갈한 한정식을 맛볼 수 있어 80 | 정무부시장 등 고위직들이 자주 찾는 맛집!
    81 |

    82 | 83 |

    주소 서울시 중구 정동 3-1

    84 |

    영업시간 12:00 ~ 22:00 (일 휴무)

    85 |

    가격 한상차림 29,700원, 특선 정식 44,000원

    86 |

    ▶ 식당상세정보

    87 | ▶ 서울시장맛집 더보기 88 |
    89 | 90 |
    91 |

    서울시 공무원의 최애맛집

    92 |
    참숯골
    93 | 94 |

    95 | 양질의 한우를 업소 내의 푸줏간에서 해체작업을 하는 소고기집. 96 | 서울시 공무원들이 한 해 평균 273회 방문하는 인기 맛집으로, 97 | 지난 3년간 서울시의 업무추진비가 가장 자주, 많이 쓰인 식당이기도 하다. 98 | 가족단위, 단체연회 등 다양한 규모의 객실이 구비되어 있다. 99 |

    100 |

    주소 서울 중구 무교로 16

    101 |

    영업시간 11:00 - 22:00 (명절 휴무)

    102 |

    가격 솥비빔밥 12,000원, 꽃등심 53,900원

    103 |

    104 | 105 | ▶ 식당상세정보 106 | 107 |

    108 |

    ▶ 서울시 공무원 맛집 더보기

    109 |
    110 | 111 |
    112 |

    서울시 공무원들이 단체손님 모시고 가는 맛집

    113 |
    만복림
    114 | 115 |

    116 | 서울시 공무원들이 단체손님을 모시고 2018년에만 117번 방문한 만복림. 117 | 작은 룸들이 다양하게 마련되어 있어 회식 장소로 인기이다. 118 | 인기메뉴는 단연 바삭하고 매콤한 새우칠리소스! 119 | 식사류도 깔끔하고, 달지 않다는 평. 120 |

    121 |

    서울 중구 후암로 98

    122 |

    영업시간 11:30 - 22:00 (명절 휴무)

    123 |

    가격 굴짬뽕 9,000원, 새우칠리 소 28,000원

    124 |

    125 | 126 | ▶ 식당상세정보 127 | 128 |

    129 |

    ▶ 서울시 단체손님 맛집 더보기

    130 |
    131 | 132 | 133 |
    134 |

    서울시 공무원들의 가성비 맛집

    135 |
    원주추어탕
    136 | 137 |

    138 | 정동길에서 줄서서 먹는 추어탕집 139 | 국내산 미꾸라지를 사용하여 매일 새로 끓인다. 140 | 서울시 공무원들이 가장 자주 방문한 맛집 중 가장 저렴한 맛집으로 141 | 지난 3년간 164회의 방문 횟수를 기록했다. 142 |

    143 |

    서울 중구 무교로 17-27

    144 |

    영업시간 09:00 - 22:00

    145 |

    가격 추어탕 9,000원

    146 |

    147 | 148 | ▶ 식당상세정보 149 | 150 |

    151 |

    ▶ 가성비 맛집 더보기

    152 |
    153 | 154 |
    155 |

    회식 1위, 행정국의 최애맛집

    156 |
    동해수산
    157 | 158 |

    159 | 서울시 행정국은 3년간 업무추진비 사용횟수와 금액 면에서 압도적인 1위를 기록했다. 160 |
    (32개월간 업무추진비 사용 2388회, 금액 2억9769천만원) 161 |
    자주, 많이 간담회를 가지는 행정국이 가장 사랑한 맛집은 바로 동해수산! 162 | 쫀득한 회와 된장 베이스의 매운탕, 신선한 과메기까지 163 | 코스의 모든 음식이 평이 좋고, 가격도 부담스럽지 않은 맛집! 164 |

    165 |

    서울특별시 중구 북창동 18-12

    166 |

    영업시간 10:00 - 22:00 (일요일 휴무)

    167 |

    가격 특정식 25,000원, 생우럭탕 15,000원

    168 |

    169 | 170 | ▶ 식당상세정보 171 | 172 |

    173 |

    ▶ 행정국 맛집 더보기

    174 |
    175 | 176 |
    177 |

    기자들과 자주 간담회를 가지는 대변인의 맛집

    178 |
    남산집
    179 | 180 |

    181 | 업무 특성상 기자들과의 간담회 자리가 많은 대변인은 182 | 30년 전통의 복어요리 전문점인 남산집을 자주 찾았다. 183 | (지난 2년 반동안 29회, 384만원 지출) 184 | 무교동 3대 복집 중 하나로, 깔끔하고 시원한 복지리를 먹을 수 있다. 185 |

    186 |

    서울 중구 무교로 32 효령빌딩

    187 |

    영업시간 11:00~22:00 (일요일 휴무)

    188 |

    가격 복지리(식사포함) 25,000

    189 |

    190 | 191 | ▶ 식당상세정보 192 | 193 |

    194 |

    ▶ 대변인 맛집 더보기

    195 |
    196 | {% endblock content %} 197 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/SelectBox.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | var SelectBox = { 4 | cache: {}, 5 | init: function(id) { 6 | var box = document.getElementById(id); 7 | var node; 8 | SelectBox.cache[id] = []; 9 | var cache = SelectBox.cache[id]; 10 | var boxOptions = box.options; 11 | var boxOptionsLength = boxOptions.length; 12 | for (var i = 0, j = boxOptionsLength; i < j; i++) { 13 | node = boxOptions[i]; 14 | cache.push({value: node.value, text: node.text, displayed: 1}); 15 | } 16 | }, 17 | redisplay: function(id) { 18 | // Repopulate HTML select box from cache 19 | var box = document.getElementById(id); 20 | var node; 21 | $(box).empty(); // clear all options 22 | var new_options = box.outerHTML.slice(0, -9); // grab just the opening tag 23 | var cache = SelectBox.cache[id]; 24 | for (var i = 0, j = cache.length; i < j; i++) { 25 | node = cache[i]; 26 | if (node.displayed) { 27 | var new_option = new Option(node.text, node.value, false, false); 28 | // Shows a tooltip when hovering over the option 29 | new_option.setAttribute("title", node.text); 30 | new_options += new_option.outerHTML; 31 | } 32 | } 33 | new_options += ''; 34 | box.outerHTML = new_options; 35 | }, 36 | filter: function(id, text) { 37 | // Redisplay the HTML select box, displaying only the choices containing ALL 38 | // the words in text. (It's an AND search.) 39 | var tokens = text.toLowerCase().split(/\s+/); 40 | var node, token; 41 | var cache = SelectBox.cache[id]; 42 | for (var i = 0, j = cache.length; i < j; i++) { 43 | node = cache[i]; 44 | node.displayed = 1; 45 | var node_text = node.text.toLowerCase(); 46 | var numTokens = tokens.length; 47 | for (var k = 0; k < numTokens; k++) { 48 | token = tokens[k]; 49 | if (node_text.indexOf(token) === -1) { 50 | node.displayed = 0; 51 | break; // Once the first token isn't found we're done 52 | } 53 | } 54 | } 55 | SelectBox.redisplay(id); 56 | }, 57 | delete_from_cache: function(id, value) { 58 | var node, delete_index = null; 59 | var cache = SelectBox.cache[id]; 60 | for (var i = 0, j = cache.length; i < j; i++) { 61 | node = cache[i]; 62 | if (node.value === value) { 63 | delete_index = i; 64 | break; 65 | } 66 | } 67 | cache.splice(delete_index, 1); 68 | }, 69 | add_to_cache: function(id, option) { 70 | SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); 71 | }, 72 | cache_contains: function(id, value) { 73 | // Check if an item is contained in the cache 74 | var node; 75 | var cache = SelectBox.cache[id]; 76 | for (var i = 0, j = cache.length; i < j; i++) { 77 | node = cache[i]; 78 | if (node.value === value) { 79 | return true; 80 | } 81 | } 82 | return false; 83 | }, 84 | move: function(from, to) { 85 | var from_box = document.getElementById(from); 86 | var option; 87 | var boxOptions = from_box.options; 88 | var boxOptionsLength = boxOptions.length; 89 | for (var i = 0, j = boxOptionsLength; i < j; i++) { 90 | option = boxOptions[i]; 91 | var option_value = option.value; 92 | if (option.selected && SelectBox.cache_contains(from, option_value)) { 93 | SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); 94 | SelectBox.delete_from_cache(from, option_value); 95 | } 96 | } 97 | SelectBox.redisplay(from); 98 | SelectBox.redisplay(to); 99 | }, 100 | move_all: function(from, to) { 101 | var from_box = document.getElementById(from); 102 | var option; 103 | var boxOptions = from_box.options; 104 | var boxOptionsLength = boxOptions.length; 105 | for (var i = 0, j = boxOptionsLength; i < j; i++) { 106 | option = boxOptions[i]; 107 | var option_value = option.value; 108 | if (SelectBox.cache_contains(from, option_value)) { 109 | SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); 110 | SelectBox.delete_from_cache(from, option_value); 111 | } 112 | } 113 | SelectBox.redisplay(from); 114 | SelectBox.redisplay(to); 115 | }, 116 | sort: function(id) { 117 | SelectBox.cache[id].sort(function(a, b) { 118 | a = a.text.toLowerCase(); 119 | b = b.text.toLowerCase(); 120 | try { 121 | if (a > b) { 122 | return 1; 123 | } 124 | if (a < b) { 125 | return -1; 126 | } 127 | } 128 | catch (e) { 129 | // silently fail on IE 'unknown' exception 130 | } 131 | return 0; 132 | } ); 133 | }, 134 | select_all: function(id) { 135 | var box = document.getElementById(id); 136 | var boxOptions = box.options; 137 | var boxOptionsLength = boxOptions.length; 138 | for (var i = 0; i < boxOptionsLength; i++) { 139 | boxOptions[i].selected = 'selected'; 140 | } 141 | } 142 | }; 143 | window.SelectBox = SelectBox; 144 | })(django.jQuery); 145 | -------------------------------------------------------------------------------- /report_version.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 공무원피셜 진짜맛집 프로젝트\n", 8 | "\n", 9 | "공무원피셜 진짜맛집 프로젝트는 [서울시의 업무추진비](https://opengov.seoul.go.kr/expense)를 분석하여 4급 이상 고위공무원들이 실제로 가는 진짜 맛집을 알아보는 프로젝트 입니다. \n", 10 | "\n", 11 | "데잇걸즈2의 [이지윤](https://github.com/jy617lee)이 데이터 분석을 진행했고, 분석 결과를 바탕으로 [공무원피셜 진짜맛집](http://13.125.206.64:8080/offial_dinings) 이라는 서비스를 운영하고 있습니다. (디자인 : [강채원](), 마케팅 : [김지영]()) \n", 12 | "\n", 13 | "데이터 분석 과정에서 [뉴로어소시에이츠]()의 [김윤이]() 대표에게 조언을 받았습니다. \n", 14 | "\n", 15 | "데잇걸즈2는 과학기술정보통신부와 한국정보화진흥원이 주관하는 SW여성인재 빅데이터 분석 교육과정으로, 상세한 소개는 [페이스북 페이지](https://ko-kr.facebook.com/dataitgirls/)를 참조 부탁 드립니다." 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## 0. 데이터 소스\n", 23 | "\n", 24 | "2016년 1월부터 2018년 8월까지의 서울시 업무추진비 51,456건을 분석하였습니다. 매달 31일에 새롭게 업데이트 된 업무추진비 내역이 추가하여 분석 결과를 업데이트 할 예정입니다. \n", 25 | "\n", 26 | "'맛집 찾기'라는 목적에 충실하기 위해 프랜차이즈명, 매점, 구매, 상품권 등 35개 키워드를 포함한 업무추진비 집행 내역을 제외하였습니다. " 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## 1. 업무추진비 사용 경향 분석" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "### 1) 연도별 사용 경향\n", 41 | "\n", 42 | "전체 업무추진비는 시간이 지날 수록 집행횟수, 집행금액이 증가하는 경향을 보입니다. 2018년의 경우, 8월까지의 업무추진비 집행의 평균을 9월부터 12월까지의 업무추진비로 상정하였습니다. \n", 43 | "\n", 44 | "<그림1 : 서울시 업무추진비 연도별 집행횟수, 집행 금액>\n", 45 | "\n", 46 | "이에 비해 업무추진비의 인당 집행금액은 2016년 이후 감소 추세를 보입니다. \n", 47 | "\n", 48 | "<그림2 : 서울시 업무추진비 연도별 인당 집행금액>\n", 49 | "\n", 50 | "분기별로는 ??사분기의 지출이 가장 많았고 ??사분기의 지출이 가장 적었으나 전반적으로 비슷한 모양을 보였습니다. \n", 51 | "\n", 52 | "<그림3 : 서울시 업무추진비 분기별 집행금액>" 53 | ] 54 | }, 55 | { 56 | "attachments": {}, 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "### 2) 업무추진비 사용 내역 분석\n", 61 | "\n", 62 | "업무추진비 사용 내역에서 가장 많이 사용되는 워딩을 워드클라우드를 그려보면 아래와 같습니다. \n", 63 | "\n", 64 | "<그림4 : 서울시 업무추진비 사용내역 순위>\n", 65 | "\n", 66 | "가장 많은 사용 내역으로는 **현안업무 추진직원 격려 간담회 개최비용 지급**이 226회를 기록했고 **시정 운영 관련 유관부서 업무협의 간담회**가 137회로 2위에 올랐습니다. **시정 홍보 강화를 위한 언론 기관 간담회**도 97회로 3위를 기록했습니다. \n", 67 | "\n", 68 | "<표1 : 서울시 업무추진비 사용내역 순위>" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": {}, 74 | "source": [ 75 | "### 3) 부서별 사용 경향\n", 76 | "\n", 77 | "#### (1) 업무추진비 사용 빈도수가 높은 부서\n", 78 | "업무추진비를 가장 자주 사용한 부서는 **행정국**으로 총 2388회의 사용 빈도를 보입니다. 행정국은 2016년 395회로 사용빈도수 2위, 2017년과 2018년에는 각각 1,280회, 692회로 사용빈도수 1위를 기록했습니다. \n", 79 | "\n", 80 | "<표2 : 서울시 업무추진비 연도별 사용빈도수 top3>\n", 81 | "\n", 82 | "#### (2) 업무추진비 사용 금액이 높은 부서\n", 83 | "업무추진비를 가장 많이 지출한 부서 역시 **행정국**이 차지했습니다. 2016년 46,919,300원으로 5위, 2017년 154,039,840원으로 2위, 2018년 95,344,355원으로 1위를 기록하며 해를 거듭할 수록 지출 금액 순위가 올라가는 경향을 보이고 있습니다. \n", 84 | "\n", 85 | "<표3 : 서울시 업무추진비 연도별 사용금액 top3>\n", 86 | "\n", 87 | "#### (3) 인당집행금액이 가장 높은 부서\n", 88 | "업무추진비의 **인당집행금액**은 집행금액과 집행 시 대상인원을 통해 추산하였고, 이 항목을 간담회 시 **비싼 것을 먹는 부서**로 해석하였습니다. \n", 89 | "\n", 90 | "이 지표에 따르면, 가장 비싼 것을 먹는 고위공무원은 **정무부시장**입니다. 2016년 정무부시장의 인당집행금액은27,795원으로 1위, 2017년에는 23,509원으로 2위, 2018년에는 24,782원으로 다시 1위를 기록하는 등 3년간 최상위권을 유지합니다. 집행회수에 비해 인당집행금액이 확연이 높음을 알 수 있습니다. \n", 91 | "\n", 92 | "<표4 : 서울시 업무추진비 연도별 인당집행금액 top3>\n", 93 | "\n", 94 | "#### (4) 업무추진비 사용 금액이 높은 부서\n", 95 | "반대로 가장 저렴한 것을 주로 먹는 부서는 **기후환경본부**입니다. 2016년 기후환경본부의 인당집행금액은 11,842원으로 1위인 정무부시장의 27,795원과 비교하여 두 배 이상 차이가 남을 알 수 있습니다. \n", 96 | "\n", 97 | "그러나 2017년 14,015원(뒤에서 2위), 2018년 17,045원(뒤에서 10위)으로 기후환경본부의 인당집행금액은 점점 늘어나고 있는 추세입니다. \n", 98 | "\n", 99 | "<표5 : 서울시 업무추진비 연도별 인당집행금액 bottom3>" 100 | ] 101 | }, 102 | { 103 | "cell_type": "markdown", 104 | "metadata": {}, 105 | "source": [ 106 | "### 4) 서울 시장 사용 경향\n", 107 | "\n", 108 | "박원순 시장은 " 109 | ] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "metadata": {}, 114 | "source": [ 115 | "## 2. 업무추진비 분석을 통한 맛집 추정" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": {}, 121 | "source": [ 122 | "업무추진비를 통한 맛집을 추정한 결과는 [공무원피셜 진짜맛집](http://13.125.206.64:8080/offial_dinings) 에서 더욱 자세하게 확인할 수 있습니다. 본 보고서에서는 서비스의 근간이 되는 raw data들을 공개합니다. " 123 | ] 124 | }, 125 | { 126 | "cell_type": "markdown", 127 | "metadata": {}, 128 | "source": [ 129 | "### 1) 서울시장의 맛집 Top5\n", 130 | "\n", 131 | "박원순 서울시장이 가장 자주 업무추진비를 사용한 곳은 의외로 서울시청의 **구내식당**과 **배달 피자**였습니다. 그러나 구내식당과 배달피자의 경우, 목적이 '우수 부서 격려'이고, 대상 인원에 '시장'이 포함되지 않은 경우가 많았습니다. 우수 부서 격려 시 시장님의 업무추진비 카드를 부서에 전달하고, 부서에서는 알아서 적정한 가격대의 회식을 하는 것으로 추정됩니다. \n", 132 | "\n", 133 | "이에 '구내식당, 매점, 피자' 키워드를 제외하면 서울시장의 지난 3년간 가장 자주 업무추진비를 사용한 식당들은 아래와 같습니다. 주로 한식을 좋아하시는군요!" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "### 2) 서울시 공무원의 맛집Top5\n", 141 | "\n", 142 | "업무추진비 사용내역 전체에서 가장 자주 방문한 식당들의 리스트입니다. **참숯골**이 압도적 1위를 기록합니다. 참숯골은 2018년에 업무추진비만으로31,645,400의 매출을 올렸네요. " 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "### 3) 단체손님용 맛집 Top5\n", 150 | "30회 이상 방문한 식당들 중 평균 방문인원이 8명 이상인 곳을 '단체손님을 접대하는 맛집'으로 보았습니다. 단체손님용 맛집 top5는 아래와 같습니다. " 151 | ] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "metadata": {}, 156 | "source": [ 157 | "### 4) 가성비 맛집 Top5\n", 158 | "1만 5천원 이하의 인당집행금액을 기록한 식당들 중 100번 이상 방문한 식당을 '저렴하면서도 자주 가게 되는 가성비 맛집'으로 보았습니다." 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "### 5) 회식 1위, 행정국이 사랑한 맛집" 166 | ] 167 | }, 168 | { 169 | "cell_type": "markdown", 170 | "metadata": {}, 171 | "source": [ 172 | "### 6) 대변인의 맛집 Top5" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": null, 178 | "metadata": {}, 179 | "outputs": [], 180 | "source": [] 181 | } 182 | ], 183 | "metadata": { 184 | "kernelspec": { 185 | "display_name": "Python 3", 186 | "language": "python", 187 | "name": "python3" 188 | }, 189 | "language_info": { 190 | "codemirror_mode": { 191 | "name": "ipython", 192 | "version": 3 193 | }, 194 | "file_extension": ".py", 195 | "mimetype": "text/x-python", 196 | "name": "python", 197 | "nbconvert_exporter": "python", 198 | "pygments_lexer": "ipython3", 199 | "version": "3.6.5" 200 | } 201 | }, 202 | "nbformat": 4, 203 | "nbformat_minor": 2 204 | } 205 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/actions.js: -------------------------------------------------------------------------------- 1 | /*global gettext, interpolate, ngettext*/ 2 | (function($) { 3 | 'use strict'; 4 | var lastChecked; 5 | 6 | $.fn.actions = function(opts) { 7 | var options = $.extend({}, $.fn.actions.defaults, opts); 8 | var actionCheckboxes = $(this); 9 | var list_editable_changed = false; 10 | var showQuestion = function() { 11 | $(options.acrossClears).hide(); 12 | $(options.acrossQuestions).show(); 13 | $(options.allContainer).hide(); 14 | }, 15 | showClear = function() { 16 | $(options.acrossClears).show(); 17 | $(options.acrossQuestions).hide(); 18 | $(options.actionContainer).toggleClass(options.selectedClass); 19 | $(options.allContainer).show(); 20 | $(options.counterContainer).hide(); 21 | }, 22 | reset = function() { 23 | $(options.acrossClears).hide(); 24 | $(options.acrossQuestions).hide(); 25 | $(options.allContainer).hide(); 26 | $(options.counterContainer).show(); 27 | }, 28 | clearAcross = function() { 29 | reset(); 30 | $(options.acrossInput).val(0); 31 | $(options.actionContainer).removeClass(options.selectedClass); 32 | }, 33 | checker = function(checked) { 34 | if (checked) { 35 | showQuestion(); 36 | } else { 37 | reset(); 38 | } 39 | $(actionCheckboxes).prop("checked", checked) 40 | .parent().parent().toggleClass(options.selectedClass, checked); 41 | }, 42 | updateCounter = function() { 43 | var sel = $(actionCheckboxes).filter(":checked").length; 44 | // data-actions-icnt is defined in the generated HTML 45 | // and contains the total amount of objects in the queryset 46 | var actions_icnt = $('.action-counter').data('actionsIcnt'); 47 | $(options.counterContainer).html(interpolate( 48 | ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { 49 | sel: sel, 50 | cnt: actions_icnt 51 | }, true)); 52 | $(options.allToggle).prop("checked", function() { 53 | var value; 54 | if (sel === actionCheckboxes.length) { 55 | value = true; 56 | showQuestion(); 57 | } else { 58 | value = false; 59 | clearAcross(); 60 | } 61 | return value; 62 | }); 63 | }; 64 | // Show counter by default 65 | $(options.counterContainer).show(); 66 | // Check state of checkboxes and reinit state if needed 67 | $(this).filter(":checked").each(function(i) { 68 | $(this).parent().parent().toggleClass(options.selectedClass); 69 | updateCounter(); 70 | if ($(options.acrossInput).val() === 1) { 71 | showClear(); 72 | } 73 | }); 74 | $(options.allToggle).show().click(function() { 75 | checker($(this).prop("checked")); 76 | updateCounter(); 77 | }); 78 | $("a", options.acrossQuestions).click(function(event) { 79 | event.preventDefault(); 80 | $(options.acrossInput).val(1); 81 | showClear(); 82 | }); 83 | $("a", options.acrossClears).click(function(event) { 84 | event.preventDefault(); 85 | $(options.allToggle).prop("checked", false); 86 | clearAcross(); 87 | checker(0); 88 | updateCounter(); 89 | }); 90 | lastChecked = null; 91 | $(actionCheckboxes).click(function(event) { 92 | if (!event) { event = window.event; } 93 | var target = event.target ? event.target : event.srcElement; 94 | if (lastChecked && $.data(lastChecked) !== $.data(target) && event.shiftKey === true) { 95 | var inrange = false; 96 | $(lastChecked).prop("checked", target.checked) 97 | .parent().parent().toggleClass(options.selectedClass, target.checked); 98 | $(actionCheckboxes).each(function() { 99 | if ($.data(this) === $.data(lastChecked) || $.data(this) === $.data(target)) { 100 | inrange = (inrange) ? false : true; 101 | } 102 | if (inrange) { 103 | $(this).prop("checked", target.checked) 104 | .parent().parent().toggleClass(options.selectedClass, target.checked); 105 | } 106 | }); 107 | } 108 | $(target).parent().parent().toggleClass(options.selectedClass, target.checked); 109 | lastChecked = target; 110 | updateCounter(); 111 | }); 112 | $('form#changelist-form table#result_list tr').on('change', 'td:gt(0) :input', function() { 113 | list_editable_changed = true; 114 | }); 115 | $('form#changelist-form button[name="index"]').click(function(event) { 116 | if (list_editable_changed) { 117 | return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); 118 | } 119 | }); 120 | $('form#changelist-form input[name="_save"]').click(function(event) { 121 | var action_changed = false; 122 | $('select option:selected', options.actionContainer).each(function() { 123 | if ($(this).val()) { 124 | action_changed = true; 125 | } 126 | }); 127 | if (action_changed) { 128 | if (list_editable_changed) { 129 | return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")); 130 | } else { 131 | return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button.")); 132 | } 133 | } 134 | }); 135 | }; 136 | /* Setup plugin defaults */ 137 | $.fn.actions.defaults = { 138 | actionContainer: "div.actions", 139 | counterContainer: "span.action-counter", 140 | allContainer: "div.actions span.all", 141 | acrossInput: "div.actions input.select-across", 142 | acrossQuestions: "div.actions span.question", 143 | acrossClears: "div.actions span.clear", 144 | allToggle: "#action-toggle", 145 | selectedClass: "selected" 146 | }; 147 | $(document).ready(function() { 148 | var $actionsEls = $('tr input.action-select'); 149 | if ($actionsEls.length > 0) { 150 | $actionsEls.actions(); 151 | } 152 | }); 153 | })(django.jQuery); 154 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/admin/RelatedObjectLookups.js: -------------------------------------------------------------------------------- 1 | /*global SelectBox, interpolate*/ 2 | // Handles related-objects functionality: lookup link for raw_id_fields 3 | // and Add Another links. 4 | 5 | (function($) { 6 | 'use strict'; 7 | 8 | // IE doesn't accept periods or dashes in the window name, but the element IDs 9 | // we use to generate popup window names may contain them, therefore we map them 10 | // to allowed characters in a reversible way so that we can locate the correct 11 | // element when the popup window is dismissed. 12 | function id_to_windowname(text) { 13 | text = text.replace(/\./g, '__dot__'); 14 | text = text.replace(/\-/g, '__dash__'); 15 | return text; 16 | } 17 | 18 | function windowname_to_id(text) { 19 | text = text.replace(/__dot__/g, '.'); 20 | text = text.replace(/__dash__/g, '-'); 21 | return text; 22 | } 23 | 24 | function showAdminPopup(triggeringLink, name_regexp, add_popup) { 25 | var name = triggeringLink.id.replace(name_regexp, ''); 26 | name = id_to_windowname(name); 27 | var href = triggeringLink.href; 28 | if (add_popup) { 29 | if (href.indexOf('?') === -1) { 30 | href += '?_popup=1'; 31 | } else { 32 | href += '&_popup=1'; 33 | } 34 | } 35 | var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); 36 | win.focus(); 37 | return false; 38 | } 39 | 40 | function showRelatedObjectLookupPopup(triggeringLink) { 41 | return showAdminPopup(triggeringLink, /^lookup_/, true); 42 | } 43 | 44 | function dismissRelatedLookupPopup(win, chosenId) { 45 | var name = windowname_to_id(win.name); 46 | var elem = document.getElementById(name); 47 | if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) { 48 | elem.value += ',' + chosenId; 49 | } else { 50 | document.getElementById(name).value = chosenId; 51 | } 52 | win.close(); 53 | } 54 | 55 | function showRelatedObjectPopup(triggeringLink) { 56 | return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); 57 | } 58 | 59 | function updateRelatedObjectLinks(triggeringLink) { 60 | var $this = $(triggeringLink); 61 | var siblings = $this.nextAll('.change-related, .delete-related'); 62 | if (!siblings.length) { 63 | return; 64 | } 65 | var value = $this.val(); 66 | if (value) { 67 | siblings.each(function() { 68 | var elm = $(this); 69 | elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); 70 | }); 71 | } else { 72 | siblings.removeAttr('href'); 73 | } 74 | } 75 | 76 | function dismissAddRelatedObjectPopup(win, newId, newRepr) { 77 | var name = windowname_to_id(win.name); 78 | var elem = document.getElementById(name); 79 | if (elem) { 80 | var elemName = elem.nodeName.toUpperCase(); 81 | if (elemName === 'SELECT') { 82 | elem.options[elem.options.length] = new Option(newRepr, newId, true, true); 83 | } else if (elemName === 'INPUT') { 84 | if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) { 85 | elem.value += ',' + newId; 86 | } else { 87 | elem.value = newId; 88 | } 89 | } 90 | // Trigger a change event to update related links if required. 91 | $(elem).trigger('change'); 92 | } else { 93 | var toId = name + "_to"; 94 | var o = new Option(newRepr, newId); 95 | SelectBox.add_to_cache(toId, o); 96 | SelectBox.redisplay(toId); 97 | } 98 | win.close(); 99 | } 100 | 101 | function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { 102 | var id = windowname_to_id(win.name).replace(/^edit_/, ''); 103 | var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); 104 | var selects = $(selectsSelector); 105 | selects.find('option').each(function() { 106 | if (this.value === objId) { 107 | this.textContent = newRepr; 108 | this.value = newId; 109 | } 110 | }); 111 | selects.next().find('.select2-selection__rendered').each(function() { 112 | // The element can have a clear button as a child. 113 | // Use the lastChild to modify only the displayed value. 114 | this.lastChild.textContent = newRepr; 115 | this.title = newRepr; 116 | }); 117 | win.close(); 118 | } 119 | 120 | function dismissDeleteRelatedObjectPopup(win, objId) { 121 | var id = windowname_to_id(win.name).replace(/^delete_/, ''); 122 | var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); 123 | var selects = $(selectsSelector); 124 | selects.find('option').each(function() { 125 | if (this.value === objId) { 126 | $(this).remove(); 127 | } 128 | }).trigger('change'); 129 | win.close(); 130 | } 131 | 132 | // Global for testing purposes 133 | window.id_to_windowname = id_to_windowname; 134 | window.windowname_to_id = windowname_to_id; 135 | 136 | window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; 137 | window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; 138 | window.showRelatedObjectPopup = showRelatedObjectPopup; 139 | window.updateRelatedObjectLinks = updateRelatedObjectLinks; 140 | window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; 141 | window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; 142 | window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; 143 | 144 | // Kept for backward compatibility 145 | window.showAddAnotherPopup = showRelatedObjectPopup; 146 | window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; 147 | 148 | $(document).ready(function() { 149 | $("a[data-popup-opener]").click(function(event) { 150 | event.preventDefault(); 151 | opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); 152 | }); 153 | $('body').on('click', '.related-widget-wrapper-link', function(e) { 154 | e.preventDefault(); 155 | if (this.href) { 156 | var event = $.Event('django:show-related', {href: this.href}); 157 | $(this).trigger(event); 158 | if (!event.isDefaultPrevented()) { 159 | showRelatedObjectPopup(this); 160 | } 161 | } 162 | }); 163 | $('body').on('change', '.related-widget-wrapper select', function(e) { 164 | var event = $.Event('django:update-related'); 165 | $(this).trigger(event); 166 | if (!event.isDefaultPrevented()) { 167 | updateRelatedObjectLinks(this); 168 | } 169 | }); 170 | $('.related-widget-wrapper select').trigger('change'); 171 | $('body').on('click', '.related-lookup', function(e) { 172 | e.preventDefault(); 173 | var event = $.Event('django:lookup-related'); 174 | $(this).trigger(event); 175 | if (!event.isDefaultPrevented()) { 176 | showRelatedObjectLookupPopup(this); 177 | } 178 | }); 179 | }); 180 | 181 | })(django.jQuery); 182 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/css/changelists.css: -------------------------------------------------------------------------------- 1 | /* CHANGELISTS */ 2 | 3 | #changelist { 4 | position: relative; 5 | width: 100%; 6 | } 7 | 8 | #changelist table { 9 | width: 100%; 10 | } 11 | 12 | .change-list .hiddenfields { display:none; } 13 | 14 | .change-list .filtered table { 15 | border-right: none; 16 | } 17 | 18 | .change-list .filtered { 19 | min-height: 400px; 20 | } 21 | 22 | .change-list .filtered .results, .change-list .filtered .paginator, 23 | .filtered #toolbar, .filtered div.xfull { 24 | margin-right: 280px; 25 | width: auto; 26 | } 27 | 28 | .change-list .filtered table tbody th { 29 | padding-right: 1em; 30 | } 31 | 32 | #changelist-form .results { 33 | overflow-x: auto; 34 | } 35 | 36 | #changelist .toplinks { 37 | border-bottom: 1px solid #ddd; 38 | } 39 | 40 | #changelist .paginator { 41 | color: #666; 42 | border-bottom: 1px solid #eee; 43 | background: #fff; 44 | overflow: hidden; 45 | } 46 | 47 | /* CHANGELIST TABLES */ 48 | 49 | #changelist table thead th { 50 | padding: 0; 51 | white-space: nowrap; 52 | vertical-align: middle; 53 | } 54 | 55 | #changelist table thead th.action-checkbox-column { 56 | width: 1.5em; 57 | text-align: center; 58 | } 59 | 60 | #changelist table tbody td.action-checkbox { 61 | text-align: center; 62 | } 63 | 64 | #changelist table tfoot { 65 | color: #666; 66 | } 67 | 68 | /* TOOLBAR */ 69 | 70 | #changelist #toolbar { 71 | padding: 8px 10px; 72 | margin-bottom: 15px; 73 | border-top: 1px solid #eee; 74 | border-bottom: 1px solid #eee; 75 | background: #f8f8f8; 76 | color: #666; 77 | } 78 | 79 | #changelist #toolbar form input { 80 | border-radius: 4px; 81 | font-size: 14px; 82 | padding: 5px; 83 | color: #333; 84 | } 85 | 86 | #changelist #toolbar form #searchbar { 87 | height: 19px; 88 | border: 1px solid #ccc; 89 | padding: 2px 5px; 90 | margin: 0; 91 | vertical-align: top; 92 | font-size: 13px; 93 | } 94 | 95 | #changelist #toolbar form #searchbar:focus { 96 | border-color: #999; 97 | } 98 | 99 | #changelist #toolbar form input[type="submit"] { 100 | border: 1px solid #ccc; 101 | padding: 2px 10px; 102 | margin: 0; 103 | vertical-align: middle; 104 | background: #fff; 105 | box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; 106 | cursor: pointer; 107 | color: #333; 108 | } 109 | 110 | #changelist #toolbar form input[type="submit"]:focus, 111 | #changelist #toolbar form input[type="submit"]:hover { 112 | border-color: #999; 113 | } 114 | 115 | #changelist #changelist-search img { 116 | vertical-align: middle; 117 | margin-right: 4px; 118 | } 119 | 120 | /* FILTER COLUMN */ 121 | 122 | #changelist-filter { 123 | position: absolute; 124 | top: 0; 125 | right: 0; 126 | z-index: 1000; 127 | width: 240px; 128 | background: #f8f8f8; 129 | border-left: none; 130 | margin: 0; 131 | } 132 | 133 | #changelist-filter h2 { 134 | font-size: 14px; 135 | text-transform: uppercase; 136 | letter-spacing: 0.5px; 137 | padding: 5px 15px; 138 | margin-bottom: 12px; 139 | border-bottom: none; 140 | } 141 | 142 | #changelist-filter h3 { 143 | font-weight: 400; 144 | font-size: 14px; 145 | padding: 0 15px; 146 | margin-bottom: 10px; 147 | } 148 | 149 | #changelist-filter ul { 150 | margin: 5px 0; 151 | padding: 0 15px 15px; 152 | border-bottom: 1px solid #eaeaea; 153 | } 154 | 155 | #changelist-filter ul:last-child { 156 | border-bottom: none; 157 | padding-bottom: none; 158 | } 159 | 160 | #changelist-filter li { 161 | list-style-type: none; 162 | margin-left: 0; 163 | padding-left: 0; 164 | } 165 | 166 | #changelist-filter a { 167 | display: block; 168 | color: #999; 169 | text-overflow: ellipsis; 170 | overflow-x: hidden; 171 | } 172 | 173 | #changelist-filter li.selected { 174 | border-left: 5px solid #eaeaea; 175 | padding-left: 10px; 176 | margin-left: -15px; 177 | } 178 | 179 | #changelist-filter li.selected a { 180 | color: #5b80b2; 181 | } 182 | 183 | #changelist-filter a:focus, #changelist-filter a:hover, 184 | #changelist-filter li.selected a:focus, 185 | #changelist-filter li.selected a:hover { 186 | color: #036; 187 | } 188 | 189 | /* DATE DRILLDOWN */ 190 | 191 | .change-list ul.toplinks { 192 | display: block; 193 | float: left; 194 | padding: 0; 195 | margin: 0; 196 | width: 100%; 197 | } 198 | 199 | .change-list ul.toplinks li { 200 | padding: 3px 6px; 201 | font-weight: bold; 202 | list-style-type: none; 203 | display: inline-block; 204 | } 205 | 206 | .change-list ul.toplinks .date-back a { 207 | color: #999; 208 | } 209 | 210 | .change-list ul.toplinks .date-back a:focus, 211 | .change-list ul.toplinks .date-back a:hover { 212 | color: #036; 213 | } 214 | 215 | /* PAGINATOR */ 216 | 217 | .paginator { 218 | font-size: 13px; 219 | padding-top: 10px; 220 | padding-bottom: 10px; 221 | line-height: 22px; 222 | margin: 0; 223 | border-top: 1px solid #ddd; 224 | } 225 | 226 | .paginator a:link, .paginator a:visited { 227 | padding: 2px 6px; 228 | background: #79aec8; 229 | text-decoration: none; 230 | color: #fff; 231 | } 232 | 233 | .paginator a.showall { 234 | padding: 0; 235 | border: none; 236 | background: none; 237 | color: #5b80b2; 238 | } 239 | 240 | .paginator a.showall:focus, .paginator a.showall:hover { 241 | background: none; 242 | color: #036; 243 | } 244 | 245 | .paginator .end { 246 | margin-right: 6px; 247 | } 248 | 249 | .paginator .this-page { 250 | padding: 2px 6px; 251 | font-weight: bold; 252 | font-size: 13px; 253 | vertical-align: top; 254 | } 255 | 256 | .paginator a:focus, .paginator a:hover { 257 | color: white; 258 | background: #036; 259 | } 260 | 261 | /* ACTIONS */ 262 | 263 | .filtered .actions { 264 | margin-right: 280px; 265 | border-right: none; 266 | } 267 | 268 | #changelist table input { 269 | margin: 0; 270 | vertical-align: baseline; 271 | } 272 | 273 | #changelist table tbody tr.selected { 274 | background-color: #FFFFCC; 275 | } 276 | 277 | #changelist .actions { 278 | padding: 10px; 279 | background: #fff; 280 | border-top: none; 281 | border-bottom: none; 282 | line-height: 24px; 283 | color: #999; 284 | } 285 | 286 | #changelist .actions.selected { 287 | background: #fffccf; 288 | border-top: 1px solid #fffee8; 289 | border-bottom: 1px solid #edecd6; 290 | } 291 | 292 | #changelist .actions span.all, 293 | #changelist .actions span.action-counter, 294 | #changelist .actions span.clear, 295 | #changelist .actions span.question { 296 | font-size: 13px; 297 | margin: 0 0.5em; 298 | display: none; 299 | } 300 | 301 | #changelist .actions:last-child { 302 | border-bottom: none; 303 | } 304 | 305 | #changelist .actions select { 306 | vertical-align: top; 307 | height: 24px; 308 | background: none; 309 | color: #000; 310 | border: 1px solid #ccc; 311 | border-radius: 4px; 312 | font-size: 14px; 313 | padding: 0 0 0 4px; 314 | margin: 0; 315 | margin-left: 10px; 316 | } 317 | 318 | #changelist .actions select:focus { 319 | border-color: #999; 320 | } 321 | 322 | #changelist .actions label { 323 | display: inline-block; 324 | vertical-align: middle; 325 | font-size: 13px; 326 | } 327 | 328 | #changelist .actions .button { 329 | font-size: 13px; 330 | border: 1px solid #ccc; 331 | border-radius: 4px; 332 | background: #fff; 333 | box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; 334 | cursor: pointer; 335 | height: 24px; 336 | line-height: 1; 337 | padding: 4px 8px; 338 | margin: 0; 339 | color: #333; 340 | } 341 | 342 | #changelist .actions .button:focus, #changelist .actions .button:hover { 343 | border-color: #999; 344 | } 345 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/core.js: -------------------------------------------------------------------------------- 1 | // Core javascript helper functions 2 | 3 | // basic browser identification & version 4 | var isOpera = (navigator.userAgent.indexOf("Opera") >= 0) && parseFloat(navigator.appVersion); 5 | var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]); 6 | 7 | // quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); 8 | function quickElement() { 9 | 'use strict'; 10 | var obj = document.createElement(arguments[0]); 11 | if (arguments[2]) { 12 | var textNode = document.createTextNode(arguments[2]); 13 | obj.appendChild(textNode); 14 | } 15 | var len = arguments.length; 16 | for (var i = 3; i < len; i += 2) { 17 | obj.setAttribute(arguments[i], arguments[i + 1]); 18 | } 19 | arguments[1].appendChild(obj); 20 | return obj; 21 | } 22 | 23 | // "a" is reference to an object 24 | function removeChildren(a) { 25 | 'use strict'; 26 | while (a.hasChildNodes()) { 27 | a.removeChild(a.lastChild); 28 | } 29 | } 30 | 31 | // ---------------------------------------------------------------------------- 32 | // Find-position functions by PPK 33 | // See http://www.quirksmode.org/js/findpos.html 34 | // ---------------------------------------------------------------------------- 35 | function findPosX(obj) { 36 | 'use strict'; 37 | var curleft = 0; 38 | if (obj.offsetParent) { 39 | while (obj.offsetParent) { 40 | curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft); 41 | obj = obj.offsetParent; 42 | } 43 | // IE offsetParent does not include the top-level 44 | if (isIE && obj.parentElement) { 45 | curleft += obj.offsetLeft - obj.scrollLeft; 46 | } 47 | } else if (obj.x) { 48 | curleft += obj.x; 49 | } 50 | return curleft; 51 | } 52 | 53 | function findPosY(obj) { 54 | 'use strict'; 55 | var curtop = 0; 56 | if (obj.offsetParent) { 57 | while (obj.offsetParent) { 58 | curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop); 59 | obj = obj.offsetParent; 60 | } 61 | // IE offsetParent does not include the top-level 62 | if (isIE && obj.parentElement) { 63 | curtop += obj.offsetTop - obj.scrollTop; 64 | } 65 | } else if (obj.y) { 66 | curtop += obj.y; 67 | } 68 | return curtop; 69 | } 70 | 71 | //----------------------------------------------------------------------------- 72 | // Date object extensions 73 | // ---------------------------------------------------------------------------- 74 | (function() { 75 | 'use strict'; 76 | Date.prototype.getTwelveHours = function() { 77 | var hours = this.getHours(); 78 | if (hours === 0) { 79 | return 12; 80 | } 81 | else { 82 | return hours <= 12 ? hours : hours - 12; 83 | } 84 | }; 85 | 86 | Date.prototype.getTwoDigitMonth = function() { 87 | return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); 88 | }; 89 | 90 | Date.prototype.getTwoDigitDate = function() { 91 | return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); 92 | }; 93 | 94 | Date.prototype.getTwoDigitTwelveHour = function() { 95 | return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); 96 | }; 97 | 98 | Date.prototype.getTwoDigitHour = function() { 99 | return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); 100 | }; 101 | 102 | Date.prototype.getTwoDigitMinute = function() { 103 | return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); 104 | }; 105 | 106 | Date.prototype.getTwoDigitSecond = function() { 107 | return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); 108 | }; 109 | 110 | Date.prototype.getHourMinute = function() { 111 | return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute(); 112 | }; 113 | 114 | Date.prototype.getHourMinuteSecond = function() { 115 | return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond(); 116 | }; 117 | 118 | Date.prototype.getFullMonthName = function() { 119 | return typeof window.CalendarNamespace === "undefined" 120 | ? this.getTwoDigitMonth() 121 | : window.CalendarNamespace.monthsOfYear[this.getMonth()]; 122 | }; 123 | 124 | Date.prototype.strftime = function(format) { 125 | var fields = { 126 | B: this.getFullMonthName(), 127 | c: this.toString(), 128 | d: this.getTwoDigitDate(), 129 | H: this.getTwoDigitHour(), 130 | I: this.getTwoDigitTwelveHour(), 131 | m: this.getTwoDigitMonth(), 132 | M: this.getTwoDigitMinute(), 133 | p: (this.getHours() >= 12) ? 'PM' : 'AM', 134 | S: this.getTwoDigitSecond(), 135 | w: '0' + this.getDay(), 136 | x: this.toLocaleDateString(), 137 | X: this.toLocaleTimeString(), 138 | y: ('' + this.getFullYear()).substr(2, 4), 139 | Y: '' + this.getFullYear(), 140 | '%': '%' 141 | }; 142 | var result = '', i = 0; 143 | while (i < format.length) { 144 | if (format.charAt(i) === '%') { 145 | result = result + fields[format.charAt(i + 1)]; 146 | ++i; 147 | } 148 | else { 149 | result = result + format.charAt(i); 150 | } 151 | ++i; 152 | } 153 | return result; 154 | }; 155 | 156 | // ---------------------------------------------------------------------------- 157 | // String object extensions 158 | // ---------------------------------------------------------------------------- 159 | String.prototype.pad_left = function(pad_length, pad_string) { 160 | var new_string = this; 161 | for (var i = 0; new_string.length < pad_length; i++) { 162 | new_string = pad_string + new_string; 163 | } 164 | return new_string; 165 | }; 166 | 167 | String.prototype.strptime = function(format) { 168 | var split_format = format.split(/[.\-/]/); 169 | var date = this.split(/[.\-/]/); 170 | var i = 0; 171 | var day, month, year; 172 | while (i < split_format.length) { 173 | switch (split_format[i]) { 174 | case "%d": 175 | day = date[i]; 176 | break; 177 | case "%m": 178 | month = date[i] - 1; 179 | break; 180 | case "%Y": 181 | year = date[i]; 182 | break; 183 | case "%y": 184 | year = date[i]; 185 | break; 186 | } 187 | ++i; 188 | } 189 | // Create Date object from UTC since the parsed value is supposed to be 190 | // in UTC, not local time. Also, the calendar uses UTC functions for 191 | // date extraction. 192 | return new Date(Date.UTC(year, month, day)); 193 | }; 194 | 195 | })(); 196 | // ---------------------------------------------------------------------------- 197 | // Get the computed style for and element 198 | // ---------------------------------------------------------------------------- 199 | function getStyle(oElm, strCssRule) { 200 | 'use strict'; 201 | var strValue = ""; 202 | if(document.defaultView && document.defaultView.getComputedStyle) { 203 | strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); 204 | } 205 | else if(oElm.currentStyle) { 206 | strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) { 207 | return p1.toUpperCase(); 208 | }); 209 | strValue = oElm.currentStyle[strCssRule]; 210 | } 211 | return strValue; 212 | } 213 | -------------------------------------------------------------------------------- /restaurants_rank/static/admin/js/calendar.js: -------------------------------------------------------------------------------- 1 | /*global gettext, pgettext, get_format, quickElement, removeChildren*/ 2 | /* 3 | calendar.js - Calendar functions by Adrian Holovaty 4 | depends on core.js for utility functions like removeChildren or quickElement 5 | */ 6 | 7 | (function() { 8 | 'use strict'; 9 | // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions 10 | var CalendarNamespace = { 11 | monthsOfYear: [ 12 | gettext('January'), 13 | gettext('February'), 14 | gettext('March'), 15 | gettext('April'), 16 | gettext('May'), 17 | gettext('June'), 18 | gettext('July'), 19 | gettext('August'), 20 | gettext('September'), 21 | gettext('October'), 22 | gettext('November'), 23 | gettext('December') 24 | ], 25 | daysOfWeek: [ 26 | pgettext('one letter Sunday', 'S'), 27 | pgettext('one letter Monday', 'M'), 28 | pgettext('one letter Tuesday', 'T'), 29 | pgettext('one letter Wednesday', 'W'), 30 | pgettext('one letter Thursday', 'T'), 31 | pgettext('one letter Friday', 'F'), 32 | pgettext('one letter Saturday', 'S') 33 | ], 34 | firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), 35 | isLeapYear: function(year) { 36 | return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); 37 | }, 38 | getDaysInMonth: function(month, year) { 39 | var days; 40 | if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { 41 | days = 31; 42 | } 43 | else if (month === 4 || month === 6 || month === 9 || month === 11) { 44 | days = 30; 45 | } 46 | else if (month === 2 && CalendarNamespace.isLeapYear(year)) { 47 | days = 29; 48 | } 49 | else { 50 | days = 28; 51 | } 52 | return days; 53 | }, 54 | draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 55 | var today = new Date(); 56 | var todayDay = today.getDate(); 57 | var todayMonth = today.getMonth() + 1; 58 | var todayYear = today.getFullYear(); 59 | var todayClass = ''; 60 | 61 | // Use UTC functions here because the date field does not contain time 62 | // and using the UTC function variants prevent the local time offset 63 | // from altering the date, specifically the day field. For example: 64 | // 65 | // ``` 66 | // var x = new Date('2013-10-02'); 67 | // var day = x.getDate(); 68 | // ``` 69 | // 70 | // The day variable above will be 1 instead of 2 in, say, US Pacific time 71 | // zone. 72 | var isSelectedMonth = false; 73 | if (typeof selected !== 'undefined') { 74 | isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); 75 | } 76 | 77 | month = parseInt(month); 78 | year = parseInt(year); 79 | var calDiv = document.getElementById(div_id); 80 | removeChildren(calDiv); 81 | var calTable = document.createElement('table'); 82 | quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); 83 | var tableBody = quickElement('tbody', calTable); 84 | 85 | // Draw days-of-week header 86 | var tableRow = quickElement('tr', tableBody); 87 | for (var i = 0; i < 7; i++) { 88 | quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]); 89 | } 90 | 91 | var startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); 92 | var days = CalendarNamespace.getDaysInMonth(month, year); 93 | 94 | var nonDayCell; 95 | 96 | // Draw blanks before first of month 97 | tableRow = quickElement('tr', tableBody); 98 | for (i = 0; i < startingPos; i++) { 99 | nonDayCell = quickElement('td', tableRow, ' '); 100 | nonDayCell.className = "nonday"; 101 | } 102 | 103 | function calendarMonth(y, m) { 104 | function onClick(e) { 105 | e.preventDefault(); 106 | callback(y, m, this.textContent); 107 | } 108 | return onClick; 109 | } 110 | 111 | // Draw days of month 112 | var currentDay = 1; 113 | for (i = startingPos; currentDay <= days; i++) { 114 | if (i % 7 === 0 && currentDay !== 1) { 115 | tableRow = quickElement('tr', tableBody); 116 | } 117 | if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { 118 | todayClass = 'today'; 119 | } else { 120 | todayClass = ''; 121 | } 122 | 123 | // use UTC function; see above for explanation. 124 | if (isSelectedMonth && currentDay === selected.getUTCDate()) { 125 | if (todayClass !== '') { 126 | todayClass += " "; 127 | } 128 | todayClass += "selected"; 129 | } 130 | 131 | var cell = quickElement('td', tableRow, '', 'class', todayClass); 132 | var link = quickElement('a', cell, currentDay, 'href', '#'); 133 | link.addEventListener('click', calendarMonth(year, month)); 134 | currentDay++; 135 | } 136 | 137 | // Draw blanks after end of month (optional, but makes for valid code) 138 | while (tableRow.childNodes.length < 7) { 139 | nonDayCell = quickElement('td', tableRow, ' '); 140 | nonDayCell.className = "nonday"; 141 | } 142 | 143 | calDiv.appendChild(calTable); 144 | } 145 | }; 146 | 147 | // Calendar -- A calendar instance 148 | function Calendar(div_id, callback, selected) { 149 | // div_id (string) is the ID of the element in which the calendar will 150 | // be displayed 151 | // callback (string) is the name of a JavaScript function that will be 152 | // called with the parameters (year, month, day) when a day in the 153 | // calendar is clicked 154 | this.div_id = div_id; 155 | this.callback = callback; 156 | this.today = new Date(); 157 | this.currentMonth = this.today.getMonth() + 1; 158 | this.currentYear = this.today.getFullYear(); 159 | if (typeof selected !== 'undefined') { 160 | this.selected = selected; 161 | } 162 | } 163 | Calendar.prototype = { 164 | drawCurrent: function() { 165 | CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); 166 | }, 167 | drawDate: function(month, year, selected) { 168 | this.currentMonth = month; 169 | this.currentYear = year; 170 | 171 | if(selected) { 172 | this.selected = selected; 173 | } 174 | 175 | this.drawCurrent(); 176 | }, 177 | drawPreviousMonth: function() { 178 | if (this.currentMonth === 1) { 179 | this.currentMonth = 12; 180 | this.currentYear--; 181 | } 182 | else { 183 | this.currentMonth--; 184 | } 185 | this.drawCurrent(); 186 | }, 187 | drawNextMonth: function() { 188 | if (this.currentMonth === 12) { 189 | this.currentMonth = 1; 190 | this.currentYear++; 191 | } 192 | else { 193 | this.currentMonth++; 194 | } 195 | this.drawCurrent(); 196 | }, 197 | drawPreviousYear: function() { 198 | this.currentYear--; 199 | this.drawCurrent(); 200 | }, 201 | drawNextYear: function() { 202 | this.currentYear++; 203 | this.drawCurrent(); 204 | } 205 | }; 206 | window.Calendar = Calendar; 207 | window.CalendarNamespace = CalendarNamespace; 208 | })(); 209 | --------------------------------------------------------------------------------