Skip to content

Commit

Permalink
Merge pull request #253 from FroggyTaipei/staging
Browse files Browse the repository at this point in the history
Release 1.0.6 on release
  • Loading branch information
travishen authored Jun 16, 2019
2 parents d8bf4ef + a322ce9 commit 3d5d02e
Show file tree
Hide file tree
Showing 408 changed files with 139 additions and 260,300 deletions.
682 changes: 21 additions & 661 deletions LICENSE.txt

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ $ kubectl delete --all secrets --namespace=app

### Licenses
* Copyright (C) 2019 - 2019 台北市議員邱威傑辦公室. All rights reserved.
* Distributed under the GNU AGPL v3.0
* Distributed under the MIT

Media
* Distributed under the CC0 1.0 Universal
Expand Down
8 changes: 4 additions & 4 deletions backend/apps/cases/charts.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ def months(start_month, start_year, end_month, end_year):
return [(d.month, d.year) for d in rrule(MONTHLY, dtstart=start, until=end)]


def to_unix(datetime):
return int(time.mktime(datetime.timetuple()) * 1000)
def to_unix(dt):
return int(time.mktime(dt.timetuple()) * 1000)


def case_state_pie():
Expand Down Expand Up @@ -149,8 +149,8 @@ def case_content_wordcloud():
words_3 = [word for word in jieba.cut_for_search(content) if len(word) > 2 and word not in stop]
counter_3 = Counter(words_3)

data = [{'name': word, 'weight': weight} for word, weight in counter_2.most_common(50)] + \
[{'name': word, 'weight': weight} for word, weight in counter_3.most_common(50)]
data = [{'name': word, 'weight': weight*1} for word, weight in counter_2.most_common(20)] + \
[{'name': word, 'weight': weight*1.5} for word, weight in counter_3.most_common(30)]

chart = get_highchart_word_cloud(data=data)

Expand Down
2 changes: 1 addition & 1 deletion backend/apps/cases/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ class Meta:

@property
def number(self):
self.case.number
return self.case.number

def __str__(self):
return self.case.number
27 changes: 0 additions & 27 deletions backend/apps/cases/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,30 +106,3 @@ def test_case_delete(self):
self.case.delete()
qs = CaseHistory.objects.filter(case=self.case)
self.assertEqual(qs.count(), 0)

# @tag('api')
# def test_serializer(self):
# from apps.cases.serializers import CaseWriteSerializer
# data = {
# 'uuid': '54eaa9c1-d4de-4717-8738-40991a6cef06',
# 'title': '上班時段計程車過多',
# 'content': 'test',
# 'username': '王大明',
# 'type': 1,
# 'region': 1,
# }
#
# serializer = CaseWriteSerializer(data=data)
# self.assertTrue(serializer.is_valid())
#
# with self.assertRaises(ValidationError):
# Case.objects.create(**serializer.validated_data)
#
# with self.assertRaises(ValidationError):
# serializer.save()
#
# mobile = '0912345678'
# serializer.validated_data['mobile'] = mobile
# case = serializer.save()
#
# self.assertEqual(case.mobile, mobile)
16 changes: 8 additions & 8 deletions backend/apps/files/storages.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,17 @@ def clean_file(self, path, file_list):
else:
self.storage.delete(f'{path}/{i}')

def clean_dir(self, path, dir):
storage_list = self.storage.listdir(f'{path}{dir}/')
self.clean_file(f'{path}{dir}/', storage_list[1])
def clean_dir(self, path, directory):
storage_list = self.storage.listdir(f'{path}{directory}/')
self.clean_file(f'{path}{directory}/', storage_list[1])
for i in storage_list[0]:
self.clean_dir(f'{path}{dir}/', i)
self.clean_dir(f'{path}{directory}/', i)
if path[-1:] is '/':
if self.storage.exists(f'{path}{dir}'):
self.storage.delete(f'{path}{dir}')
if self.storage.exists(f'{path}{directory}'):
self.storage.delete(f'{path}{directory}')
else:
if self.storage.exists(f'{path}{dir}/'):
self.storage.delete(f'{path}{dir}/')
if self.storage.exists(f'{path}{directory}/'):
self.storage.delete(f'{path}{directory}/')

def clean_storage(self, storage):
path = ''
Expand Down
16 changes: 2 additions & 14 deletions backend/apps/users/authentication.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,20 @@
import jwt

from django.contrib.auth import get_user_model
from django.utils.translation import ugettext as _

from rest_framework import exceptions

from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework_jwt.settings import api_settings

from apps.users.models import User

jwt_decode_handler = api_settings.JWT_DECODE_HANDLER


class AccountKitUserAuthentication(JSONWebTokenAuthentication):
"""
"""
www_authenticate_realm = 'api'

def authenticate(self, request):
"""
"""
jwt_value = self.get_jwt_value(request)
if jwt_value is None:
return None
Expand All @@ -37,12 +32,9 @@ def authenticate(self, request):

user = self.authenticate_credentials(payload)

return (user, jwt_value)
return user, jwt_value

def authenticate_credentials(self, payload):
"""
"""
User = get_user_model()
user_id = payload.get('id')

if not user_id:
Expand All @@ -55,8 +47,4 @@ def authenticate_credentials(self, payload):
msg = _('Invalid signature.')
raise exceptions.AuthenticationFailed(msg)

# if not user.is_active:
# msg = _('User account is disabled.')
# raise exceptions.AuthenticationFailed(msg)

return user
42 changes: 42 additions & 0 deletions backend/apps/users/management/commands/init_superuser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import logging
from datetime import datetime
from django.core.management.base import BaseCommand

from apps.users.utils import jwt_encode_handler
from apps.users.models import User


logger = logging.getLogger('raven')


class Command(BaseCommand):
help = 'Create an superuser with JWT token for testing.'

def add_arguments(self, parser):
parser.add_argument('email', type=str, help='User email')
parser.add_argument('password', type=str, help='User password')

def handle(self, *args, **kwargs):
email = kwargs['email']
password = kwargs['password']

if not User.objects.filter(email=email).first():
superuser = User.objects.create_superuser(email=email, password=password,
full_name='Test Superuser')
payload = {
'id': superuser.pk,
'exp': datetime(year=2030, month=1, day=1),
}
token = jwt_encode_handler(payload)
logger.info(f"""
Your initial superuser has been set for testing, use this user to sign in Django admin:
Email: {email}
Password: {password}
Use this token for jwt testing, expired in 2030/01/01:
Authorization: JWT {token}
""")
39 changes: 0 additions & 39 deletions backend/apps/users/tests/initial.py

This file was deleted.

8 changes: 1 addition & 7 deletions backend/apps/users/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,6 @@


class UserModelTestCase(TransactionTestCase):
def test_create_superuser_by_script(self):
"""Load superuser"""
from apps.users.tests import initial
self.superuser = User.objects.first()
self.assertIsNotNone(self.superuser)

def test_create_normal_user(self):
user = User.objects.create_user(email='[email protected]', password='123456', is_staff=True, is_superuser=True)
self.assertTrue(user.is_staff)
Expand All @@ -34,4 +28,4 @@ def test_create_accountkit_use(self):
User.objects.create_accountkit_user(mobile=None, email=None)

with self.assertRaises(ValidationError):
user = User.objects.create_accountkit_user(mobile='0912345679', is_staff=True, is_superuser=True)
User.objects.create_accountkit_user(mobile='0912345679', is_staff=True, is_superuser=True)
15 changes: 13 additions & 2 deletions backend/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
'storages',
'suit_ckeditor',
'fsm_admin',
'rest_framework_swagger',
'drf_yasg',
'rest_framework_jwt',
'django_admin_lightweight_date_hierarchy',
'date_range_filter',
Expand Down Expand Up @@ -418,7 +418,7 @@

# SWAGGER
# ------------------------------------------------------------------------------
# See: https://marcgibbons.com/django-rest-swagger/settings/
# See: https://drf-yasg.readthedocs.io/en/stable/settings.html
SWAGGER_SETTINGS = {
'USE_SESSION_AUTH': False,
'SECURITY_DEFINITIONS': {
Expand All @@ -428,8 +428,19 @@
'in': 'header',
},
},
'DEFAULT_FIELD_INSPECTORS': [
'drf_yasg.inspectors.CamelCaseJSONFilter',
'drf_yasg.inspectors.InlineSerializerInspector',
'drf_yasg.inspectors.RelatedFieldInspector',
'drf_yasg.inspectors.ChoiceFieldInspector',
'drf_yasg.inspectors.FileFieldInspector',
'drf_yasg.inspectors.DictFieldInspector',
'drf_yasg.inspectors.SimpleFieldInspector',
'drf_yasg.inspectors.StringDefaultFieldInspector',
],
}


# SESSIONS
# ------------------------------------------------------------------------------
# See: https://docs.djangoproject.com/en/dev/ref/settings/#sessions
Expand Down
18 changes: 14 additions & 4 deletions backend/config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
from django.urls import path
from django.contrib import admin
from django.conf.urls import include

from rest_framework_swagger.views import get_swagger_view
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

from config.api import api

Expand All @@ -15,14 +16,23 @@
admin.sites.site = admin.site
admin.autodiscover()

schema_view = get_swagger_view(title='Froggy Service API')
schema_view = get_schema_view(
openapi.Info(
title="Froggy's Service API",
default_version='v1',
contact=openapi.Contact(email=settings.SERVER_EMAIL),
license=openapi.License(name="MIT License"),
),
public=False,
permission_classes=(permissions.AllowAny,),
)

urlpatterns = [
# All Kubernetes services must serve a 200 page on '/', set admin page as index
path('', admin.site.urls, name='admin'),
path('api/', include(api.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('api/swagger/', schema_view),
path('api/swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger'),
path('api/csrftoken/', get_token),
]

Expand Down
46 changes: 6 additions & 40 deletions backend/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,49 +1,15 @@
autopep8==1.4
attrs==18.2.0
backcall==0.1.0
certifi==2018.8.24
chardet==3.0.4
decorator==4.3.0
Django>=2.1.2
Django==2.2.2
django-environ==0.4.5
django-extensions==2.1.2
django-redis==4.9.0
django-extensions==2.1.6
flake8==3.5.0
flake8-commas==2.0.0
flake8-mypy==17.8.0
gevent==1.3.6
greenlet==0.4.14
gunicorn==19.9.0
idna==2.7
ipython==6.5.0
ipython-genutils==0.2.0
jedi==0.12.1
mccabe==0.6.1
mypy==0.620
parso==0.3.1
pexpect==4.6.0
pickleshare==0.7.4
Pillow==5.0.0
prompt-toolkit==1.0.15
psycopg2-binary==2.7.5
ptyprocess==0.6.0
pycodestyle==2.3.1
pyflakes==1.6.0
Pygments==2.2.0
pytz==2018.5
redis==2.10.6
requests>=2.20.0
rope==0.11.0
simplegeneric==0.8.1
six==1.11.0
traitlets==4.3.2
typed-ast==1.1.0
urllib3==1.23
wcwidth==0.1.7
Werkzeug==0.14.1
requests==2.20.0
raven==6.9.0
PyYAML>=4.2b1
djangorestframework==3.8.2
PyYAML==5.1.1
djangorestframework==3.9.4
django-ckeditor==5.6.1
django-storages==1.7.1
boto3==1.9.71
Expand All @@ -54,7 +20,7 @@ django-fsm-admin==1.2.4
sendgrid==5.6.0
django-sendgrid-v5==0.7.0
beautifulsoup4==4.7.1
django-rest-swagger==2.2.0
drf-yasg==1.16.0
djangorestframework-jwt==1.11.0
django-admin-lightweight-date-hierarchy==0.3.0
django-suit-daterange-filter==0.0.6
Expand Down
3 changes: 2 additions & 1 deletion backend/scripts/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ python manage.py collectstatic --noinput --verbosity 0

python manage.py loaddata region type site sendgrid-template.yaml
python manage.py loaddata cases.test.yaml arranges.test.yaml
echo "from apps.users.tests import initial" | python manage.py shell

python manage.py init_superuser [email protected] 123456

python manage.py runserver_plus 0.0.0.0:8000
Loading

0 comments on commit 3d5d02e

Please sign in to comment.