diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b69e321b1da0325aec31b16885a13a0d6f259c92..1937daf05a2e8bb85b01f979193dc46f2464df61 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,9 @@ variables: POSTGRES_USER: $DB_USER POSTGRES_PASSWORD: $DB_PASSWORD POSTGRES_HOST_AUTH_METHOD: $DB_HOST_AUTH_METHOD + AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY + AWS_STORAGE_BUCKET_NAME: $AWS_STORAGE_BUCKET_NAME services: - postgres:12.2-alpine diff --git a/Dockerfile b/Dockerfile index 043521d9765e799814e2d86f46db22fc42253659..8bdb85164f3b6994790405beafa2ed8f1bd99a29 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,15 @@ FROM python:latest -WORKDIR /opt/pplbackend -RUN mkdir -p /opt/pplbackend +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 -ADD . /opt/pplbackend +WORKDIR /app +RUN mkdir -p /app -ENV HTTP_PROXY="http://proxy.cs.ui.ac.id:8080" -ENV http_proxy="http://proxy.cs.ui.ac.id:8080" -ENV HTTPS_PROXY="http://proxy.cs.ui.ac.id:8080" -ENV https_proxy="http://proxy.cs.ui.ac.id:8080" +RUN pip install --upgrade pip +COPY ./requirements.txt /app/ +RUN pip install -r requirements.txt -RUN\ - python3 -m pip install -r requirements.txt --no-cache-dir +COPY .env .env.production -RUN chmod +x /opt/pplbackend/docker_start.sh - -EXPOSE 80 +COPY . /app/ \ No newline at end of file diff --git a/informasi_fasilitas/views.py b/informasi_fasilitas/views.py index 86c452a6b04072316c2595ff158cf99ffa6b5368..30d7ad82a0810907ccdea247d6d64e1fec378b25 100644 --- a/informasi_fasilitas/views.py +++ b/informasi_fasilitas/views.py @@ -200,13 +200,25 @@ def update_fasilitas(request, nama_lokasi, id): user_creator = fasilitas.user desc = fasilitas.deskripsi tag = fasilitas.tag + jumlah = fasilitas.jumlah + image = fasilitas.image + disabilitas = fasilitas.disabilitas if user_creator == request.user: if 'deskripsi' in request.data.keys(): desc = request.data['deskripsi'] if 'tag' in request.data.keys(): tag = request.data['tag'].split() + if 'jumlah' in request.data.keys(): + jumlah = request.data['jumlah'] + if 'image' in request.data.keys(): + image = request.data['image'] + if 'disabilitas' in request.data.keys(): + disabilitas = request.data['disabilitas'] fasilitas.deskripsi = desc fasilitas.tag = tag + fasilitas.jumlah = jumlah + fasilitas.image = image + fasilitas.disabilitas = disabilitas fasilitas.save() return JsonResponse({'response': '{} in fasilitas edited'.format(str(request.data.keys())), }, status=HTTPStatus.ACCEPTED) diff --git a/media/fasilitas/Screen_Shot_2020-12-26_at_20.34.57.png b/media/fasilitas/Screen_Shot_2020-12-26_at_20.34.57.png new file mode 100644 index 0000000000000000000000000000000000000000..8899eddbe1d61a6b5b7eebfd0e00b0b42be09aff Binary files /dev/null and b/media/fasilitas/Screen_Shot_2020-12-26_at_20.34.57.png differ diff --git a/media/lokasi/Screen_Shot_2020-12-29_at_01.48.32.png b/media/lokasi/Screen_Shot_2020-12-29_at_01.48.32.png new file mode 100644 index 0000000000000000000000000000000000000000..e86cecd01b112be4890d34681c33f125c0dfd154 Binary files /dev/null and b/media/lokasi/Screen_Shot_2020-12-29_at_01.48.32.png differ diff --git a/pplbackend/settings.py b/pplbackend/settings.py index ac8ecb9375c08f69d444fef7462e2c49948723a4..f7c2992bf270c98baed451374023615d56cd9039 100644 --- a/pplbackend/settings.py +++ b/pplbackend/settings.py @@ -22,13 +22,14 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ #Security keys -SECRET_KEY = os.getenv('SECRET_KEY', 'akua') +SECRET_KEY = os.getenv("SECRET_KEY", 'akua') # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['localhost','127.0.0.1','poipole-staging.herokuapp.com','34.101.147.63','www.poipole.com'] +ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'poipole-staging.herokuapp.com', + '34.101.147.63', 'www.poipole.com'] # Application definition @@ -67,7 +68,6 @@ MIDDLEWARE = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', ] ROOT_URLCONF = 'pplbackend.urls' @@ -154,14 +154,19 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ -STATIC_ROOT = os.path.join(BASE_DIR, 'static') +AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID") +AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY") +AWS_STORAGE_BUCKET_NAME = os.getenv("AWS_STORAGE_BUCKET_NAME") +AWS_S3_OBJECT_PARAMETERS = { + 'CacheControl': 'max-age=86400', +} +AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % os.getenv("AWS_STORAGE_BUCKET_NAME") +AWS_LOCATION = 'static' -STATIC_URL = '/static/' +STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION) -STATIC_DIRS = [ - os.path.join(BASE_DIR, 'static'), -] -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' +STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' +DEFAULT_FILE_STORAGE = 'pplbackend.storage_backends.MediaStorage' #Rest API Settings SITE_ID = 1 @@ -215,8 +220,6 @@ EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") EMAIL_PORT = 587 EMAIL_USE_TLS = True -MEDIA_URL = '/media/' -MEDIA_ROOT = os.path.join(BASE_DIR, "media") GOOGLE_OAUTH2_CLIENT_ID = os.getenv("GOOGLE_OAUTH2_CLIENT_ID") GOOGLE_OAUTH2_CLIENT_SECRET = os.getenv("GOOGLE_OAUTH_CLIENT_SECRET") diff --git a/pplbackend/storage_backends.py b/pplbackend/storage_backends.py new file mode 100644 index 0000000000000000000000000000000000000000..4325cbff40824d43ef9bfcea51b3537a55587c0c --- /dev/null +++ b/pplbackend/storage_backends.py @@ -0,0 +1,5 @@ +from storages.backends.s3boto3 import S3Boto3Storage + +class MediaStorage(S3Boto3Storage): + location = 'media' + file_overwrite = False \ No newline at end of file diff --git a/pplbackend/urls.py b/pplbackend/urls.py index 07f9a9dd7199deacea0941b9c552f50febc07a39..52c2c5c86c84c324998876dc89b4c94f93b96266 100644 --- a/pplbackend/urls.py +++ b/pplbackend/urls.py @@ -43,4 +43,4 @@ urlpatterns = [ #path('api-token-auth/', views.obtain_auth_token, name='api-token-auth'), path('informasi-fasilitas/', include('informasi_fasilitas.urls')), path('layanan-khusus/', include('layanan_khusus.urls')) -] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +] diff --git a/requirements.txt b/requirements.txt index eb545bb16e5dedde61c4a5b6883f07624a790e63..bb254eb64fea2a92a60ee43eec6e0282be5eff83 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,21 @@ +asgiref==3.3.1 +astroid==2.4.2 +boto3==1.16.36 +botocore==1.19.36 +cachetools==4.1.1 +certifi==2020.11.8 +chardet==3.0.4 coverage==4.4.1 +defusedxml==0.6.0 dj-database-url==0.4.2 -Django==2.1.5 +Django==2.2 django-allauth==0.41.0 django-cors-middleware==1.5.0 django-environ==0.4.4 django-multiselectfield==0.1.12 django-oauth-toolkit==1.3.2 django-rest-auth==0.9.5 +django-storages==1.11.1 djangorestframework==3.11.0 djangorestframework-simplejwt==4.4.0 google-api-python-client==1.7.11 @@ -16,11 +25,11 @@ gunicorn==19.7.1 httplib2==0.17.0 idna==2.6 isort==4.2.15 +jmespath==0.10.0 lazy-object-proxy==1.4.3 mccabe==0.6.1 oauthlib==3.1.0 Pillow==7.0.0 -pip==20.0.2 psycopg2-binary==2.8.5 pyasn1==0.4.8 pyasn1-modules==0.2.8 @@ -28,18 +37,22 @@ pycparser==2.19 PyJWT==1.7.1 pylint==2.5.0 pylint-django==2.0.15 +pylint-plugin-utils==0.6 +python-dateutil==2.8.1 python3-openid==3.1.0 pytz==2017.2 -requests==2.18.4 +requests==2.24.0 requests-oauthlib==1.3.0 rsa==4.0 +s3transfer==0.3.3 selenium==3.5.0 -setuptools==40.8.0 six==1.12.0 social-auth-app-django==3.1.0 social-auth-core==3.2.0 +sqlparse==0.4.1 +toml==0.10.2 typed-ast==1.4.1 uritemplate==3.0.1 -urllib3==1.22 +urllib3==1.25.8 whitenoise==3.3.0 -wrapt==1.12.1 \ No newline at end of file +wrapt==1.12.1