fully working slide crud

This commit is contained in:
jr-k 2024-02-26 22:17:46 +01:00
parent bf5a67a05f
commit 74af0cba16
7 changed files with 77 additions and 25 deletions

View File

@ -90,14 +90,16 @@ jQuery(document).ready(function ($) {
$(document).on('click', '.slide-add', function () { $(document).on('click', '.slide-add', function () {
showModal('modal-slide-add'); showModal('modal-slide-add');
$('.modal-slide-add input:eq(0)').focus().select();
}); });
$(document).on('click', '.slide-edit', function () { $(document).on('click', '.slide-edit', function () {
var slide = JSON.parse($(this).parents('tr:eq(0)').attr('data-entity')); var slide = JSON.parse($(this).parents('tr:eq(0)').attr('data-entity'));
console.log(slide)
showModal('modal-slide-edit'); showModal('modal-slide-edit');
$('.modal-slide-edit input:visible:eq(0)').focus().select();
$('#slide-edit-name').val(slide.name); $('#slide-edit-name').val(slide.name);
$('#slide-edit-type').val(slide.type); $('#slide-edit-type').val(slide.type);
$('#slide-edit-location').val(slide.location);
$('#slide-edit-duration').val(slide.duration); $('#slide-edit-duration').val(slide.duration);
$('#slide-edit-id').val(slide.id); $('#slide-edit-id').val(slide.id);
}); });

View File

@ -6,10 +6,16 @@ import shutil
import subprocess import subprocess
import sys import sys
from enum import Enum from enum import Enum
from flask import Flask, render_template, redirect, request, url_for, send_from_directory, jsonify from flask import Flask, render_template, redirect, request, url_for, send_from_directory, jsonify
from werkzeug.utils import secure_filename
from config import config from config import config
from src.SlideManager import SlideManager from src.SlideManager import SlideManager
from src.model.Slide import Slide
from src.model.SlideType import SlideType
from src.utils import str_to_enum
# <config> # <config>
@ -31,9 +37,12 @@ if config['reverse_proxy_mode']:
# <server> # <server>
app = Flask(__name__, template_folder='views', static_folder='data') app = Flask(__name__, template_folder='views', static_folder='data')
app.config['UPLOAD_FOLDER'] = 'data/uploads'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB
if config['debug']: if config['debug']:
app.config['TEMPLATES_AUTO_RELOAD'] = True app.config['TEMPLATES_AUTO_RELOAD'] = True
# </server> # </server>
# <xenv> # <xenv>
@ -95,13 +104,34 @@ def manage():
disabled_slides=slide_manager.get_disabled_slides() disabled_slides=slide_manager.get_disabled_slides()
) )
@app.route('/manage/slide/add', methods=['POST']) @app.route('/manage/slide/add', methods=['GET', 'POST'])
def manage_slide_add(): def manage_slide_add():
name = request.form['name'] slide = Slide(
print(name) name=request.form['name'],
print(request.form) type=str_to_enum(request.form['type'], SlideType),
response = {'message': f'Bonjour {name}, votre formulaire a été reçu !'} duration=request.form['duration'],
return jsonify(response) )
if slide.has_file():
if 'object' not in request.files:
return redirect(request.url)
object = request.files['object']
if object.filename == '':
return redirect(request.url)
if object:
object_name = secure_filename(object.filename)
object_path = os.path.join(app.config['UPLOAD_FOLDER'], object_name)
object.save(object_path)
slide.location = object_path
else:
slide.location = request.form['object']
slide_manager.add_form(slide)
return redirect(url_for('manage'))
@app.route('/manage/slide/edit', methods=['POST']) @app.route('/manage/slide/edit', methods=['POST'])
def manage_slide_edit(): def manage_slide_edit():
@ -132,5 +162,9 @@ def not_found(e):
# </web> # </web>
if __name__ == '__main__': if __name__ == '__main__':
app.run(host=config['bind'] if 'bind' in config else '0.0.0.0', port=config['port']) app.run(
host=config['bind'] if 'bind' in config else '0.0.0.0',
port=config['port'],
debug=config['debug']
)

View File

@ -2,6 +2,7 @@ import json
from typing import Dict, Optional, List, Tuple from typing import Dict, Optional, List, Tuple
from src.model.Slide import Slide from src.model.Slide import Slide
from src.utils import str_to_enum
from pysondb import db from pysondb import db
class SlideManager(): class SlideManager():
@ -39,16 +40,11 @@ class SlideManager():
def update_form(self, id: str, name: str, duration: int) -> None: def update_form(self, id: str, name: str, duration: int) -> None:
self._db.updateById(id, {"name": name, "duration": duration}) self._db.updateById(id, {"name": name, "duration": duration})
def reindent(self) -> None: def add_form(self, slide: Slide) -> None:
with open(self.DB_FILE, 'r') as file: self._db.add(slide.to_dict())
data = json.load(file)
with open(self.DB_FILE, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
def delete(self, id: int) -> None: def delete(self, id: int) -> None:
self._db.deleteById(id) self._db.deleteById(id)
self.reindent()
def to_dict(self, slides: List[Slide]) -> dict: def to_dict(self, slides: List[Slide]) -> dict:
return [slide.to_dict() for slide in slides] return [slide.to_dict() for slide in slides]

View File

@ -1,17 +1,18 @@
import uuid import uuid
import json import json
from typing import Optional from typing import Optional, Union
from src.model import SlideType from src.model.SlideType import SlideType
from src.utils import str_to_enum
class Slide: class Slide:
def __init__(self, location: str, duration: int, type: SlideType, enabled: bool, name: str, position: int = 999, id: Optional[int] = None): def __init__(self, location: str = '', duration: int = 3, type: Union[SlideType, str] = SlideType.URL, enabled: bool = False, name: str = 'Untitled', position: int = 999, id: Optional[int] = None):
self._id = uuid.uuid4().int if id is None else id self._id = uuid.uuid4().int if id is None else id
self._location = location self._location = location
self._duration = duration self._duration = duration
self._type = type self._type = str_to_enum(type, SlideType) if isinstance(type, str) else type
self._enabled = enabled self._enabled = enabled
self._name = name self._name = name
self._position = position self._position = position
@ -88,7 +89,12 @@ class Slide:
"id": self.id, "id": self.id,
"enabled": self.enabled, "enabled": self.enabled,
"position": self.position, "position": self.position,
"type": self.type, "type": self.type.value,
"duration": self.duration, "duration": self.duration,
"location": self.location, "location": self.location,
} }
def has_file(self) -> bool:
return (self.type == SlideType.VIDEO
or self.type == SlideType.PICTURE
)

View File

@ -1,6 +1,6 @@
from enum import Enum from enum import Enum
class ItemType(Enum): class SlideType(Enum):
PICTURE = 'picture' PICTURE = 'picture'
VIDEO = 'video' VIDEO = 'video'
URL = 'url' URL = 'url'

6
src/utils.py Normal file
View File

@ -0,0 +1,6 @@
def str_to_enum(strval: str, enum_class):
for enum_item in enum_class:
if enum_item.value == strval:
return enum_item
raise ValueError(f"{strval} is not a valid {enum_class.__name__} item")

View File

@ -185,7 +185,7 @@
<div class="form-group"> <div class="form-group">
<label for="slide-add-name">Name</label> <label for="slide-add-name">Name</label>
<div class="widget"> <div class="widget">
<input name="name" type="text" id="slide-add-name" /> <input name="name" type="text" id="slide-add-name" required="required" />
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -210,7 +210,7 @@
<div class="form-group"> <div class="form-group">
<label for="slide-add-duration">Duration</label> <label for="slide-add-duration">Duration</label>
<div class="widget"> <div class="widget">
<input type="number" name="duration" id="slide-add-duration" /> <input type="number" name="duration" id="slide-add-duration" required="required" />
<span>seconds</span> <span>seconds</span>
</div> </div>
</div> </div>
@ -236,7 +236,7 @@
<div class="form-group"> <div class="form-group">
<label for="slide-edit-name">Name</label> <label for="slide-edit-name">Name</label>
<div class="widget"> <div class="widget">
<input type="text" name="name" id="slide-edit-name" /> <input type="text" name="name" id="slide-edit-name" required="required" />
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -249,10 +249,18 @@
</select> </select>
</div> </div>
</div> </div>
<div class="form-group">
<label for="slide-edit-location">Location</label>
<div class="widget">
<input type="text" name="location" id="slide-edit-location" disabled="disabled" />
</div>
</div>
<div class="form-group"> <div class="form-group">
<label for="slide-edit-duration">Duration</label> <label for="slide-edit-duration">Duration</label>
<div class="widget"> <div class="widget">
<input type="number" name="duration" id="slide-edit-duration" /> <input type="number" name="duration" id="slide-edit-duration" required="required" />
<span>seconds</span> <span>seconds</span>
</div> </div>
</div> </div>