From 07ad396c62040e30e9c433711ed667fda89e103b Mon Sep 17 00:00:00 2001 From: Yair Engel Date: Wed, 3 Feb 2021 20:31:03 +0200 Subject: [PATCH 01/14] Add new table out of office Add js file to handle the radio box Add route to profile.py Add modal to profile.html Add run main for pycharm --- app/database/models.py | 12 +- app/main.py | 7 +- app/routers/profile.py | 68 ++++++- app/static/out_of_office/__init__.py | 0 app/static/out_of_office/out_of_office.js | 12 ++ app/templates/profile.html | 224 +++++++++++++++------- 6 files changed, 243 insertions(+), 80 deletions(-) create mode 100644 app/static/out_of_office/__init__.py create mode 100644 app/static/out_of_office/out_of_office.js diff --git a/app/database/models.py b/app/database/models.py index eb4fd6da..dc63e923 100644 --- a/app/database/models.py +++ b/app/database/models.py @@ -3,7 +3,7 @@ from datetime import datetime from typing import Dict, Any -from sqlalchemy import (DDL, Boolean, Column, DateTime, ForeignKey, Index, +from sqlalchemy import (DDL, Boolean, Column, DateTime, Date, ForeignKey, Index, Integer, String, event, UniqueConstraint) from sqlalchemy.dialects.postgresql import TSVECTOR from sqlalchemy.exc import IntegrityError, SQLAlchemyError @@ -157,3 +157,13 @@ class Quote(Base): id = Column(Integer, primary_key=True, index=True) text = Column(String, nullable=False) author = Column(String) + + +class OutOfOffice(Base): + __tablename__ = "out_of_office" + + id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("users.id")) + start_date = Column(Date, nullable=False) + end_date = Column(Date, nullable=False) + status = Column(String, nullable=False) diff --git a/app/main.py b/app/main.py index fa778725..e6402fc0 100644 --- a/app/main.py +++ b/app/main.py @@ -12,6 +12,7 @@ telegram, whatsapp ) from app.telegram.bot import telegram_bot +import uvicorn def create_tables(engine, psql_environment): @@ -44,7 +45,7 @@ def create_tables(engine, psql_environment): profile.router, search.router, telegram.router, - whatsapp.router, + whatsapp.router ] for router in routers_to_include: @@ -64,3 +65,7 @@ async def home(request: Request, db: Session = Depends(get_db)): "message": "Hello, World!", "quote": quote }) + + +if __name__ == "__main__": + uvicorn.run(app, host="127.0.0.1", port=8000) diff --git a/app/routers/profile.py b/app/routers/profile.py index 7223784e..1e86d638 100644 --- a/app/routers/profile.py +++ b/app/routers/profile.py @@ -4,10 +4,11 @@ from starlette.responses import RedirectResponse from starlette.status import HTTP_302_FOUND from PIL import Image +from datetime import date, datetime from app import config from app.database.database import get_db -from app.database.models import User +from app.database.models import User, OutOfOffice from app.dependencies import MEDIA_PATH, templates PICTURE_EXTENSION = config.PICTURE_EXTENSION @@ -20,6 +21,26 @@ ) +def update_out_of_office_status_to_off_if_the_time_is_pass(out_of_office_data, session): + if out_of_office_data: + if out_of_office_data.status == 'On': + if out_of_office_data.end_date < date.today(): + # update status to off + out_of_office_data.status = 'Off' + session.commit() + return out_of_office_data + + +def get_out_of_office_template(id, user_id, start_date=None, end_date=None, status='Off'): + return OutOfOffice( + id=id, + user_id=user_id, + start_date=start_date, + end_date=end_date, + status=status + ) + + def get_placeholder_user(): return User( username='new_user', @@ -36,7 +57,6 @@ async def profile( request: Request, session=Depends(get_db), new_user=Depends(get_placeholder_user)): - # Get relevant data from database upcoming_events = range(5) user = session.query(User).filter_by(id=1).first() @@ -45,17 +65,20 @@ async def profile( session.commit() user = session.query(User).filter_by(id=1).first() + out_of_office_data = session.query(OutOfOffice).filter_by(id=1).first() + out_of_office_data = update_out_of_office_status_to_off_if_the_time_is_pass(out_of_office_data, session) + return templates.TemplateResponse("profile.html", { "request": request, "user": user, "events": upcoming_events, + "out_of_office_data": out_of_office_data }) @router.post("/update_user_fullname") async def update_user_fullname( request: Request, session=Depends(get_db)): - user = session.query(User).filter_by(id=1).first() data = await request.form() new_fullname = data['fullname'] @@ -71,7 +94,6 @@ async def update_user_fullname( @router.post("/update_user_email") async def update_user_email( request: Request, session=Depends(get_db)): - user = session.query(User).filter_by(id=1).first() data = await request.form() new_email = data['email'] @@ -87,7 +109,6 @@ async def update_user_email( @router.post("/update_user_description") async def update_profile( request: Request, session=Depends(get_db)): - user = session.query(User).filter_by(id=1).first() data = await request.form() new_description = data['description'] @@ -103,7 +124,6 @@ async def update_profile( @router.post("/upload_user_photo") async def upload_user_photo( file: UploadFile = File(...), session=Depends(get_db)): - user = session.query(User).filter_by(id=1).first() pic = await file.read() @@ -120,7 +140,6 @@ async def upload_user_photo( @router.post("/update_telegram_id") async def update_telegram_id( request: Request, session=Depends(get_db)): - user = session.query(User).filter_by(id=1).first() data = await request.form() new_telegram_id = data['telegram_id'] @@ -150,3 +169,38 @@ def get_image_crop_area(width, height): return delta, 0, width - delta, height delta = (height - width) // 2 return 0, delta, width, width + delta + + +@router.post("/out_of_office") +async def out_of_office( + request: Request, session=Depends(get_db)): + activate_out_of_office = '1' + user = session.query(User).filter_by(id=1).first() + # TODO: Check if the user exist + + data = await request.form() + + out_of_office_data = session.query(OutOfOffice).filter_by(id=1).first() + + # insert new out of office + if not out_of_office_data: + if data['outOfOffice'] == activate_out_of_office: + out = get_out_of_office_template(1, + user_id=user.id, + start_date=datetime.strptime(data['start_date'], '%Y-%m-%d'), + end_date=datetime.strptime(data['end_date'], '%Y-%m-%d'), + status='On') + session.add(out) + # update + else: + if data['outOfOffice'] == activate_out_of_office: + out_of_office_data.start_date = datetime.strptime(data['start_date'], '%Y-%m-%d') + out_of_office_data.end_date = datetime.strptime(data['end_date'], '%Y-%m-%d') + out_of_office_data.status = 'On' + else: + out_of_office_data.status = 'Off' + + session.commit() + + url = router.url_path_for("profile") + return RedirectResponse(url=url, status_code=HTTP_302_FOUND) diff --git a/app/static/out_of_office/__init__.py b/app/static/out_of_office/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/static/out_of_office/out_of_office.js b/app/static/out_of_office/out_of_office.js new file mode 100644 index 00000000..df54b45c --- /dev/null +++ b/app/static/out_of_office/out_of_office.js @@ -0,0 +1,12 @@ +function findselected() { + let deactivate = 0; + let result = document.querySelector('input[name="outOfOffice"]:checked').value; + if (result == deactivate) { + document.getElementById("start_date").setAttribute('disabled', true); + document.getElementById("end_date").setAttribute('disabled', true); + } + else { + document.getElementById("start_date").removeAttribute('disabled'); + document.getElementById("end_date").removeAttribute('disabled'); + } +} \ No newline at end of file diff --git a/app/templates/profile.html b/app/templates/profile.html index 2fadafb8..59639e74 100644 --- a/app/templates/profile.html +++ b/app/templates/profile.html @@ -13,38 +13,44 @@
-
- + {% endblock %} \ No newline at end of file From 3603fc643ca93e30d6e73c7e7ec4331ac349cbe1 Mon Sep 17 00:00:00 2001 From: Yair Engel Date: Wed, 10 Feb 2021 19:18:21 +0200 Subject: [PATCH 02/14] Change requirements --- requirements.txt | Bin 3270 -> 3270 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9038c58fb7649471ef5415d5b4bd408489593893..ec10ef9c99205cab919e3d5b116a070ccf88f628 100644 GIT binary patch delta 10 RcmX>mc}$Y&|Gy1KcmNzJ1wH@( delta 11 ScmX>mc}#L6(-9sfE(QP^MgvX& From 7a033523a48489acaa6d557561f54aed04d1261d Mon Sep 17 00:00:00 2001 From: Yair Engel Date: Tue, 16 Feb 2021 17:44:48 +0200 Subject: [PATCH 03/14] Add out of office file --- app/internal/out_of_office.py | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/app/internal/out_of_office.py b/app/internal/out_of_office.py index 28e2b414..1e965ef7 100644 --- a/app/internal/out_of_office.py +++ b/app/internal/out_of_office.py @@ -1,3 +1,4 @@ +from datetime import datetime from sqlalchemy.orm import Session from app.database.models import User, OutOfOffice @@ -18,3 +19,67 @@ def get_who_is_out_of_office(session: Session, OutOfOffice.end_date >= event_start_date).filter( OutOfOffice.status == 'On').all() return out_of_office_users + + +def insert_new_out_of_office(out_of_office_data_from_req, + user, + session): + out = get_out_of_office_template(1, + user_id=user.id, + start_date=datetime.strptime( + out_of_office_data_from_req['start_date'] + ' ' + + out_of_office_data_from_req['start_time'], + '%Y-%m-%d %H:%M'), + end_date=datetime.strptime(out_of_office_data_from_req['end_date'] + ' ' + + out_of_office_data_from_req['end_time'], + '%Y-%m-%d %H:%M'), + status='On') + session.add(out) + + +def get_out_of_office_template(out_of_office_id, user_id, start_date=None, end_date=None, status='Off'): + return OutOfOffice( + id=out_of_office_id, + user_id=user_id, + start_date=start_date, + end_date=end_date, + status=status + ) + + +def update_out_of_office(out_of_office_data_from_req, out_of_office_data_from_db): + activate_out_of_office = 1 + if out_of_office_data_from_req['outOfOffice'] == activate_out_of_office: + out_of_office_data_from_db.start_date = datetime.strptime( + out_of_office_data_from_req['start_date'] + ' ' + out_of_office_data_from_req['start_time'], + '%Y-%m-%d %H:%M') + out_of_office_data_from_db.end_date = datetime.strptime( + out_of_office_data_from_req['end_date'] + ' ' + out_of_office_data_from_req['end_time'], + '%Y-%m-%d %H:%M') + out_of_office_data_from_db.status = 'On' + else: + out_of_office_data_from_db.status = 'Off' + + +def update_out_of_office_status_to_off_if_the_time_is_pass(out_of_office_data, session): + """ + This func check if out of office date passed and changed the status to off + :param out_of_office_data: Out of office data from db + :param session: + :return: out_of_office_data object + """ + if out_of_office_data: + if out_of_office_data.status == 'On': + if out_of_office_data.end_date < datetime.now(): + # update status to off + out_of_office_data.status = 'Off' + session.commit() + return out_of_office_data + + +def get_out_of_office_template(): + return OutOfOffice(id=1, + user_id=1, + start_date='', + end_date='', + status='Off') From 9ff90a721c0cd61d1167e0d0b8bc45d18b00e3d6 Mon Sep 17 00:00:00 2001 From: Yair Engel Date: Tue, 16 Feb 2021 20:03:14 +0200 Subject: [PATCH 04/14] Add out of office.py file --- app/internal/out_of_office.py | 4 +- app/routers/profile.py | 8 +- app/templates/profile.html | 643 ++++++++++++++++++++-------------- 3 files changed, 386 insertions(+), 269 deletions(-) diff --git a/app/internal/out_of_office.py b/app/internal/out_of_office.py index 1e965ef7..45e3e378 100644 --- a/app/internal/out_of_office.py +++ b/app/internal/out_of_office.py @@ -48,7 +48,7 @@ def get_out_of_office_template(out_of_office_id, user_id, start_date=None, end_d def update_out_of_office(out_of_office_data_from_req, out_of_office_data_from_db): - activate_out_of_office = 1 + activate_out_of_office = '1' if out_of_office_data_from_req['outOfOffice'] == activate_out_of_office: out_of_office_data_from_db.start_date = datetime.strptime( out_of_office_data_from_req['start_date'] + ' ' + out_of_office_data_from_req['start_time'], @@ -61,7 +61,7 @@ def update_out_of_office(out_of_office_data_from_req, out_of_office_data_from_db out_of_office_data_from_db.status = 'Off' -def update_out_of_office_status_to_off_if_the_time_is_pass(out_of_office_data, session): +def update_out_of_office_status_to_off_if_time_pass(out_of_office_data, session): """ This func check if out of office date passed and changed the status to off :param out_of_office_data: Out of office data from db diff --git a/app/routers/profile.py b/app/routers/profile.py index c62d9eb2..c8684b27 100644 --- a/app/routers/profile.py +++ b/app/routers/profile.py @@ -1,6 +1,5 @@ import io -from datetime import datetime from loguru import logger from fastapi import APIRouter, Depends, File, Request, UploadFile from PIL import Image @@ -16,8 +15,7 @@ save_holidays_to_db) from app.internal.on_this_day_events import get_on_this_day_events from app.internal.out_of_office import (insert_new_out_of_office, update_out_of_office, - update_out_of_office_status_to_off_if_the_time_is_pass, - get_out_of_office_template) + update_out_of_office_status_to_off_if_time_pass) PICTURE_EXTENSION = config.PICTURE_EXTENSION PICTURE_SIZE = config.AVATAR_SIZE @@ -55,10 +53,8 @@ async def profile( out_of_office_data = session.query(OutOfOffice).filter_by(id=1).first() out_of_office_updated_data = ( - update_out_of_office_status_to_off_if_the_time_is_pass + update_out_of_office_status_to_off_if_time_pass (out_of_office_data, session)) - if out_of_office_data is None: - out_of_office_updated_data = get_out_of_office_template() signs = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', diff --git a/app/templates/profile.html b/app/templates/profile.html index 0c8ae827..301a21d7 100644 --- a/app/templates/profile.html +++ b/app/templates/profile.html @@ -1,349 +1,470 @@ {% extends "base.html" %} {% include "event/partials/text_editor_partial_head.html" %} {% block content %} -
-
- -
- -
+
+
+ +
+ +
- -
-