import os from flask import render_template from sqlalchemy.exc import ( DataError, DatabaseError, InterfaceError, InvalidRequestError, ) from app import db from statuspengguna.helper import ( IsZipUploaded, CurrentDistribusi, IsDistribusiLive, ) from distribusimodel import Distribusis from distribusisinfo import DistribusisInfo from forms.uploadform import UploadForm from forms.distribusiform import DistribusiForm from forms.themeform import ThemeForm from forms.editorform import EditorForm from forms.selectorform import SelectorForm def Editor(): editorform = EditorForm() current_distribusi = CurrentDistribusi() if editorform.validate_on_submit(): ValidateEditCssForm(editorform, current_distribusi) return RenderDistribusiTemplate(current_distribusi) return RenderEditorTemplate(editorform, current_distribusi) def ValidateEditCssForm(editorform, current_distribusi): newcssfolder = os.path.join("themes/userthemes", current_distribusi) if editorform.public.data: MakePublicTheme(editorform, current_distribusi) publicfolder = os.path.join("themes/publicthemes", current_distribusi) if editorform.cssfile.data: SaveUploadCssFile(editorform, publicfolder) else: WriteCssToFile(editorform, publicfolder) if editorform.cssfile.data: SaveUploadCssFile(editorform, newcssfolder) return if editorform.cssname.data: WriteCssToFile(editorform, newcssfolder) def SaveUploadCssFile(editorform, newcssfolder): if not os.path.exists(newcssfolder): os.mkdir(newcssfolder) cssfile = editorform.cssfile.data cssfile.save(os.path.join(newcssfolder, editorform.cssname.data)) def WriteCssToFile(editorform, newcssfolder): if not os.path.exists(newcssfolder): os.mkdir(newcssfolder) cssfilename = "{}.css".format(editorform.cssname.data) with open(os.path.join(newcssfolder, cssfilename), "w") as cssfile: cssfile.write(editorform.css.data) cssfile.close def MakePublicTheme(editorform, current_distribusi): try: distribusi = Distribusis.query.filter_by( distribusiname=current_distribusi ).first() distribusi.publictheme = editorform.cssname.data db.session.commit() except InvalidRequestError: db.session.rollback() editorform.public.errors.append("Something went wrong!") except DataError: db.session.rollback() editorform.public.errors.append("Invalid Entry") except InterfaceError: db.session.rollback() editorform.public.errors.append("Error connecting to the database") except DatabaseError: db.session.rollback() editorform.public.errors.append("Error connecting to the database") def RenderDistribusiTemplate(current_distribusi): uploadform = UploadForm() distribusiform = DistribusiForm() themeform = ThemeForm() themeform.publicthemes.choices = DistribusisInfo.publicthemes() selectorform = SelectorForm() files_uploaded = IsZipUploaded(current_distribusi) distribusi_live = IsDistribusiLive(current_distribusi) css_selected = True selectorvisible = False template = render_template( "distribusi.html", uploadform=uploadform, distribusiform=distribusiform, themeform=themeform, selectorform=selectorform, files_uploaded=files_uploaded, distribusi_live=distribusi_live, css_selected=css_selected, selectorvisible=selectorvisible, ) return template def RenderEditorTemplate(editorform, current_distribusi): htmlplaceholder = HtmlPlaceholder() cssplaceholder = CssPlaceholder() editorform.css.data = cssplaceholder files_uploaded = IsZipUploaded(current_distribusi) distribusi_live = IsDistribusiLive(current_distribusi) template = render_template( "editor.html", files_uploaded=files_uploaded, distribusi_live=distribusi_live, editorform=editorform, htmlplaceholder=htmlplaceholder, ) return template def CssPlaceholder(): cssplaceholder = "Try out your CSS here" with open("themes/editor/placeholder.css") as f: cssplaceholder = f.read() return cssplaceholder def HtmlPlaceholder(): htmlplaceholder = "Write some test HTML here" with open("themes/editor/placeholder.html") as f: htmlplaceholder = f.read() return htmlplaceholder