From f98037c7bbd5a7732077834b032d8cf150741293 Mon Sep 17 00:00:00 2001 From: kerem Date: Thu, 3 Oct 2024 08:48:48 +0200 Subject: [PATCH] for TR --- web/instance/test.db | Bin 19292160 -> 19292160 bytes web/minibase/__pycache__/app.cpython-311.pyc | Bin 3238 -> 3238 bytes .../__pycache__/config.cpython-311.pyc | Bin 845 -> 845 bytes .../__pycache__/theme.cpython-311.pyc | Bin 3793 -> 3998 bytes web/minibase/app.py | 1 + .../company/__pycache__/forms.cpython-311.pyc | Bin 11610 -> 11563 bytes .../__pycache__/models.cpython-311.pyc | Bin 6725 -> 6744 bytes .../__pycache__/routes.cpython-311.pyc | Bin 4512 -> 4632 bytes web/minibase/blueprints/company/forms.py | 18 ++---- web/minibase/blueprints/company/models.py | 2 +- web/minibase/blueprints/company/routes.py | 8 ++- .../__pycache__/utils.cpython-311.pyc | Bin 3116 -> 4604 bytes web/minibase/blueprints/database/utils.py | 32 +++++++++-- web/minibase/blueprints/item/__init__.py | 0 web/minibase/blueprints/item/models.py | 33 +++++++++++ .../main/__pycache__/forms.cpython-311.pyc | Bin 0 -> 881 bytes .../main/__pycache__/models.cpython-311.pyc | Bin 3963 -> 3963 bytes .../main/__pycache__/utils.cpython-311.pyc | Bin 5758 -> 5680 bytes web/minibase/blueprints/main/forms.py | 8 +++ web/minibase/blueprints/main/models.py | 2 +- web/minibase/blueprints/main/utils.py | 11 ++-- .../sensor/__pycache__/forms.cpython-311.pyc | Bin 13119 -> 12484 bytes .../sensor/__pycache__/models.cpython-311.pyc | Bin 6357 -> 6528 bytes .../sensor/__pycache__/routes.cpython-311.pyc | Bin 7153 -> 7153 bytes web/minibase/blueprints/sensor/forms.py | 21 +++---- web/minibase/blueprints/sensor/models.py | 19 +++--- web/minibase/blueprints/sensor/routes.py | 2 +- .../user/__pycache__/forms.cpython-311.pyc | Bin 15749 -> 13600 bytes .../user/__pycache__/models.cpython-311.pyc | Bin 5433 -> 5433 bytes .../user/__pycache__/routes.cpython-311.pyc | Bin 11832 -> 11792 bytes web/minibase/blueprints/user/forms.py | 54 ++++++------------ web/minibase/blueprints/user/routes.py | 2 +- web/minibase/templates/account.html | 11 ++-- web/minibase/templates/form.html | 3 - web/minibase/templates/form/boolField.html | 6 +- web/minibase/templates/form/dateField.html | 6 +- web/minibase/templates/form/fileField.html | 6 +- web/minibase/templates/form/integerField.html | 6 +- web/minibase/templates/form/selectField.html | 6 +- web/minibase/templates/form/stringField.html | 6 +- web/minibase/templates/form/urlField.html | 6 +- web/minibase/templates/notes_form.html | 28 +++++++++ web/minibase/theme.py | 13 ++++- 43 files changed, 211 insertions(+), 99 deletions(-) create mode 100644 web/minibase/blueprints/item/__init__.py create mode 100644 web/minibase/blueprints/item/models.py create mode 100644 web/minibase/blueprints/main/__pycache__/forms.cpython-311.pyc create mode 100644 web/minibase/blueprints/main/forms.py create mode 100644 web/minibase/templates/notes_form.html diff --git a/web/instance/test.db b/web/instance/test.db index 9093c0e85fc0c07008052ff414e430b40e67e953..6c8dc64d8f5fdc967abe9b17c366299dd59337ea 100644 GIT binary patch delta 1313 zcmWmEhhNMA9L90Ky2iEZ;xtYh$*4H4jGSa|vd3kIlD(-&2$fN?_g>k%?47;$-mxPzqcPBERIAmBqNw9y<71=aWBX+1{#6xd!zu(DyhHTiRSc|R za7d`Zpf|HIOU)`$!2*`Bf;H5zfi3J{4+l8H3C?hV2CgWM640U~+~5umctVF#@Papd z;0r(aBLJmQ24xY5atK0sR6s>kLNG!Qipr=0J*uJ_3|5>hZ3shEPPn1(b= z#|+FwIx>)nS(uGEn2RiAV;*ua9}BP$i?A3=uoTO%94oLAtFRhtuommE9viR`o3I&M zuob!3hV9sao!Eul*n_>;hy6H!gE)jd3?3 zif{OiANYx1_>DjKiz56>%PLaRAu*GfOH>jIiKWC!Vl7ciY$Uc4JBhu-LEqYsAEES%`45xb1+)MF delta 1309 zcmWmEWm}U07=~e97|N)D0;2{PsEFX`u$YS7-Og4l>{dV#6=N0?yIZjkvB2)`?hfo0 zy`B%}b=<$;PRh?zC&A>UIL-F1p*STQQ;kZh(K6L&m2Fh5EwDCOIG7yGO--8k9KS?O zoP$S-m7=xq3ef2SBmA`ngCW3RP^;C7qL{M^RXX$Wzp7kqbWmuFUr1zZgg!PrGB_+G zBucNhv@MdBQK*77WEX`E)Ubse?BM`MXy62A6hm>iz!h%L!W|y)gcrP_gAaV+hY~1> zQYa07ltEdPLjcMn5ET%FU{r)2AqYhn!V!T;L?Ie6h(#q-Mio>=HN?Sy>ZpO5h(|5d zMjg~eJ=8}7G(;mbMiVqeGc-pFv_vbkMjNz6JG4g!bVMg~h7n!R72VJsJMY_ zfWGL5{uqFPNW>rv#t;m}Fbu~CjKnC6#u$vnIE=>xBq13on21S8#bl&m3Z`Nj(lH$~ zFcY(2!fedJT+G9KWWbCC$izY{!eT7JQY^!AtiVdF!fLF+TCBr*Y`{ir!e(s2R%Brt zwqpl&Vi&Tp8#&m6T}^S2#0Y5M{x|taRMiC3a4=fXK@baaRC=`372sN zS8)y3aRWDT3%79xcX1E*@c<9;2#@guPw@=T@d7XL3a{}7Z}ATAQGgHlh)?*8FZhaY z_>Ld=iC_4QKlqD6{7cU$RAxb9DY25MB-WB5lA;nDiCSVSv6I+K93+ksjl@afEGZ@_ sE^(2#O57w`iMzx@;wkZxcuRB=ABnHTPf|isQc_A%TFK)hl!Pw-0c-IDvj6}9 diff --git a/web/minibase/__pycache__/app.cpython-311.pyc b/web/minibase/__pycache__/app.cpython-311.pyc index 6df611c319d39da2346eb3d500cd2360f1e5090b..a3156b42692ccea38c630a42d34d2fdbc78cfed3 100644 GIT binary patch delta 58 vcmZ1`xlEFGIWI340}wp=em5;)BkyWXMy|~}IWIEFXfyJEV8A4bM1YC`_@xga delta 58 vcmZ1`xlEFGIWI340}#}#JCLTek#{vGBgf{QoEMp7v>5q6FklizB0$9e%mxk^ diff --git a/web/minibase/__pycache__/config.cpython-311.pyc b/web/minibase/__pycache__/config.cpython-311.pyc index a24e87aeeee4e0290ff68a918e69dfdbe8dd8c88..20683378ff98cfe7d25a4c411f92fb8cba2fd332 100644 GIT binary patch delta 20 acmX@hc9xBMIWI340}wp;es?3c6EgrmQ3f&q delta 20 acmX@hc9xBMIWI340}yaAwQl5gVg>**0R#^K diff --git a/web/minibase/__pycache__/theme.cpython-311.pyc b/web/minibase/__pycache__/theme.cpython-311.pyc index 120340d5d61067d040cd293990e560d74737e715..2417cc8427b6507dc705ec763be097e285934a10 100644 GIT binary patch delta 734 zcmZXQ&ubGw6vwmKANjSr$!<13cehE?q)8g9)`B4Q;w50gda$PfEh}#lqOr;*MJ+=0 zPmlpm#iLd{NlywrDk2`zTMY>Q2SyYGd+|*gRO&GEnK$3}eQ$=@cb^vY=b9D`;Arf8 zZY`Ow^juJISS@&W3p5g^A(Eg`Vt`Ies*xnsiACci1#yyw1j&Fwvgpa7Cr?dcqsIZ0 zxTsB`RzR(Y+B76d3AGv2%3zTSgs8ZQmqLn@s^d7uNoLVkMPH+a#dR#6L!p7f2|Ul^ z`6Q&tDaer1kR=O{yAr79*#+@+a%e!O=UwkoSf%&+7uWA>^w}@*gK&numG+DT(3ZE+ z?XOYazwNJefIX5e!D3J3g}C0~=0BO;ck)L;SYa%5UpdIn4I&t+6=6bK>AK(6@3E$>_%SW7rrS3Mi4 z+684G*`xF9rTRu_vX)j+vbUiBNJGrU*; delta 646 zcmZvXzi-n}5XWuDvC}wq;>3>QI*FU6fhPQ{U_kU#uCPE7z|?q3+DiZeN2mx>&>#dV4AKu{=!yRxq5nS&WWSUk3xLSVIfbdm7fK zH9o5S6z15@VPop&r?q*!&+|-N;D@xn>+52J*0OKuvK1S*`JaY2_U~Ddn(xXiag)DM zk6z|b3mfz^cg3~6L@^nDF*e3}lyvC1{hptA$!QsZJQmZk)4mqTXh~Eh>Jo;8D>1p> zmdTOGGk#~Tu0O%8fw(?I`s}<|UQ%m`auNs99sX-PQah@VC?|0s-Qj;4lbL@3;BA^f diff --git a/web/minibase/app.py b/web/minibase/app.py index f2850a04..da08c40e 100644 --- a/web/minibase/app.py +++ b/web/minibase/app.py @@ -57,6 +57,7 @@ def create_app(): from minibase.blueprints.geography.routes import geography from minibase.blueprints.sensor.routes import sensor from minibase.blueprints.database.routes import database + #from minibase.blueprints.item.routes import item # (BLUEPRINTS) Registering the blueprints. # Giving them theie ulr_prefixes that will define their links on the webBrowser. diff --git a/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc index de13d23cfb9aabf26ca2c3e652f507e8560aa1f0..4ff18854eee1198c9d2e84274ee37bb41163346e 100644 GIT binary patch delta 2591 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 diff --git a/web/minibase/blueprints/company/__pycache__/models.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/models.cpython-311.pyc index e4befeed1b1a6b65353478af16bc480be51ed1c4..f12720852a73f540c3bec63e59c12060588ff8d1 100644 GIT binary patch delta 1023 zcma)(O>7cD6vuaVmn{Jn!3EG1+4M`PjN=)zrCC*|nNa^fyAST*) zH9bw@p$F4bn~huyR}Z~-w@K3|Cr_Rl4<=rkm^g0%jYzD!*81s;ip=_CTHDNu zN#HxOq$fRNvMx)Z2`~0xe`ku8rBF72gZOmkOn;W4+S_5CQ^m*A!!r)xX&m}1DuTnS zTp~jEq`STZPn;~gC$$>2^_JS>3ez0a|ch2pA~O3eGWyfqJ5*)~g!qHcS@jH)rN~mf3m3 zNoFA9EFcPq0oW~ZguCP{l41JYkK?ld>4bu5PThQgJC!uoD1}a zD-pX1CUnS?6);Dn6~R}e%gSzFMzJqLa?j3;lObt(MQ>^UD`3kVIY~eX1eEA!_dr02 z3CN)6xaL-()+^?^f8FoD=b!gQPikL=_GP-^8?-Oer2pldd12;iOnGL|pNl)TUU{;H RTXl7TRJ&jNcaR7>{t0-u(=-48 delta 955 zcmca%a@2%(IWI340}#w!cOdQfM&3$BCKJ}lyG8vbUt?Urv4&$A69dC)rpXOV)r=gI z|1jwSNiAj&8NsY8%(aXWC=0|8kixu%WAY4U-N~)Y0?bS)Jd3 zEX*PVG^Gg0iU+gy0a>fTEG|~d$=|`OFd)mB6{Kzvkkt=ny#umtgIQK=^6a81VkzQl zBqk>S*^((zDbj0XCbzN4%SxumrpT?4S;h=>9}q)8lwyi}FoUMTW#j}7!0~Ai)&p#RBC0B@-(ge*l+(F9G{Kb=#nx2>wpPE;aSyGAcpMkU&NU=AF z@BtDqzk&FElLdq{RsBIsurG@OKuk2J1%t$bC&vjbhd3h`;tWX*$)81_4u}9cz?xA7o8=rusX2+@;D*O9e*b%ks}Qn27G!tiQ7NObFgBMclgVCR7qp$6P94x8Nkl+v73yQ0+1KP93WSwLY70M4q)TL1t6 diff --git a/web/minibase/blueprints/company/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/routes.cpython-311.pyc index 5e1cbd05cf5eb6cbe8df85edcc4f32b47e77e702..5ab4ff88b412c8bc0dedcc4f406b83a334169268 100644 GIT binary patch delta 388 zcmZ3WJVS+VIWI340}xakxtNyEHIYw(aoI%m8b{_F(OkY{CPs!_VK6BcCCwP!oG%M88ZXJY9NMyDCtz`1u~Nb8HFd_*I|`~aV9G>+OW#O zdF6~YjPjeeFs@=`WStz({E(4vvLlNjx8shg6DAkA0al_Q|11pn&^+yIE@dZSDU|{03{>s6?$+x+L zyNij@YVv>Hb&Lv=*YQ1{oW(CCk(OVSTYQTZLUH)zm!!G@MQ$lh{=+9Tc@w{za467H zpp^{8yMW{eW=2NF8^-XTyUufS;dfdNQ-WCpsbMGi!{ SFkWGF{=fo~ahn`0=nDWC8EWbP delta 291 zcmbQCvOt+{IWI340}urI?@znKIgw9-v2UV!jV5c3Xs%e47$XA{Ln>PeTdH^p`x=gA z%nS^xffxd!BvK_7NKW3*Bs%e@7ONDDGuf8Wid7oUo5*OzD6{zt<0?i*k;&!E4;gtU zN3s}lJ00LU;c}5H@CsMp=BX@;S%pP_h8E{DGB7kSd|+eX5d6p>GufNVgz@g=2Cna- zp(l7QM8{v?Pq@gRaD_kN0!PAA4&Kevxx1Jc%_b}Htz(p(e39=tqvB+FewoQ^0&c=V zK;wXhF%(Y&k{_5E85wU(E)BvXNkwyey;P2L>SVk(q%>phXTuxiDT~ PbpF5sl5v=PTF@5&SGZ71 diff --git a/web/minibase/blueprints/company/forms.py b/web/minibase/blueprints/company/forms.py index 81fb665f..dbe4a649 100644 --- a/web/minibase/blueprints/company/forms.py +++ b/web/minibase/blueprints/company/forms.py @@ -5,20 +5,13 @@ from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationE import minibase.blueprints.company.utils as companyUtils import minibase.blueprints.geography.utils as geoUtils import minibase.blueprints.main.utils as mainUtils +import minibase.blueprints.database.utils as dbUtils import minibase.theme as theme from wtforms_alchemy import ModelForm from minibase.blueprints.company.models import Companies from minibase.blueprints.sensor.models import nbiotDevice from minibase.blueprints.user.models import Users -fields = { - "city_id": SelectField( - 'City', - validators=[DataRequired()], - render_kw={"hx-get": "/geography/get_states", "hx-target": "#state_id"} - ), -} - class companyForm(FlaskForm): # Defines the form class to be used for the user update name = StringField('Name', validators=[DataRequired(), Length(min=3, max=100)]) website = URLField('Website', validators=[DataRequired(), Length(min=3, max=100)]) @@ -34,11 +27,10 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user relation_id = SelectField('Relation', validators=[DataRequired()]) status_id = SelectField('Status', validators=[DataRequired()]) comment = StringField('Comment', validators=[DataRequired(), Length(min=3, max=400)]) - image_file = FileField('Update company Picture', validators=[FileAllowed(['jpg', 'png'])]) submit = SubmitField() - + def populate_for_updating(self, company): self.originalModel = company self.submit.label.text = "Update" @@ -52,7 +44,7 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryIdWithDefault(company.city_id, company.country_id)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryIdWithDefault(company.state_id, company.country_id)] - self.industry_id.choices = [(row.id, row.name) for row in mainUtils.queryIndustryNamesWithDefault(company.industry_id)] + self.industry_id.choices = [(row.id, row.name) for row in dbUtils.queryWithDefaultAttrOrderBy(Companies, Companies.industry_id,company.industry_id)] self.legal_entity_id.choices = [(row.id, row.name) for row in companyUtils.queryLegalEntityNamesWithDefault(company.legal_entity_id)] self.type_id.choices = [(row.id, row.name) for row in companyUtils.queryTypeNamesWithDefault(company.type_id)] self.relation_id.choices = [(row.id, row.name) for row in companyUtils.queryRelationNamesWithDefault(company.relation_id)] @@ -82,6 +74,6 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user #custom validators specific naming convention: validate_. This is how Flask-WTF knows which field the validator is associated with. def validate_name(self, input): if input.data != self.originalModel.name: - if (Companies.query.filter(Companies.name.ilike(f'%{input.data}%')).first()): - raise ValidationError('This Company already registered') + if (dbUtils.queryIlikeFromTable(Companies, Companies.name, input.data)): + raise ValidationError(f'This {self.name.name} already exists.') diff --git a/web/minibase/blueprints/company/models.py b/web/minibase/blueprints/company/models.py index 720e6249..42cbc22f 100644 --- a/web/minibase/blueprints/company/models.py +++ b/web/minibase/blueprints/company/models.py @@ -12,7 +12,7 @@ class Companies(db.Model): last_update_date= db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) #Own Fields - name = db.Column(db.String(100), nullable=False) + name = db.Column(db.String(100), nullable=False, unique=True) website = db.Column(db.String(100), nullable=True, default='') street = db.Column(db.String(100), nullable=False) street_no = db.Column(db.Integer, nullable=False) diff --git a/web/minibase/blueprints/company/routes.py b/web/minibase/blueprints/company/routes.py index f9057c0f..de08618d 100644 --- a/web/minibase/blueprints/company/routes.py +++ b/web/minibase/blueprints/company/routes.py @@ -4,6 +4,7 @@ import minibase.theme as theme from minibase.blueprints.company.models import Companies import minibase.blueprints.database.utils as dbUtils import minibase.blueprints.main.utils as mainUtils +import minibase.blueprints.main.forms as NoteForm from minibase.blueprints.company.forms import companyForm # Declaring a blueprint @@ -13,7 +14,7 @@ company = Blueprint('company', __name__, template_folder='templates') @company.route("/list", methods=['GET', 'POST']) def list(): page=request.args.get('page', 1, type=int) - table=dbUtils.table_printable_paginate(Companies, page, 20, 'account/', 'id') + table=dbUtils.table_printable_paginate(Companies, page, 5, 'account/', 'id') return(render_template('view.html', theme=theme, table=table, title="Companies")) @@ -24,6 +25,7 @@ def account(companyId): company = Companies.query.get_or_404(companyId) form = companyForm() form.populate_for_updating(company) + _accountInfo = mainUtils.accountInfo( title=company.name, description=company.legal_entity.name, @@ -45,7 +47,9 @@ def account(companyId): elif request.method == 'GET': mainUtils.populate_form(form, company) - return render_template('account.html', theme=theme, accountInfo=_accountInfo, form=form) + return render_template('account.html', theme=theme, + accountInfo=_accountInfo, + form=form) else: flash('You need to select a company id', 'alarm') return redirect(url_for('company.list')) diff --git a/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc index 4aee18357bde375ccb747e85b17472c7ffb60b84..fa496b676badcc959fb823913f90bc9d0001cb6e 100644 GIT binary patch delta 1507 zcmZWpO-vg{6yC9S@p^adF%YFrA=r&^sMQ}xW5kaUNzgikrkF$&9C1K(*hRP{YCF3e z5LE6VN~?%VG>2A6s}e*CReB&j<%p_CX{$=vwN`TEQ&ja-f2uIQN8$ItQTQ&JAnv*o;DmN!crLknFn(Z=YO2HvolV1#+GLtdDh}* z$zh1GzylnN7BKuUpI(DJ(tfn=qxS+wk)NKHy6L}xaA}$&NjOjOM1gU^tFXmM|#e0=!+87n!uf6NB(JmJjMjs6u$#_=sb66!O=zSa4r9!c>H2c@ zo6^nF?%G~@H@mhAe|9Y6#4@%r;wU2(Wvr}>*^25YswJo|7Rz4FE%rY!zTnnp+dS2H zav`U|i%HRV4*;qT$TiL{WFF%~8*3GuDC5ND#7=H2XLqOPo$j=a`yJe0!9!&{WaEs3 zGnSZn(&Rk3HFs>~bgFla5d^xD;w+#-5p|^pjvxI1lC^-3dPEbkBHFKVuGA z25&PsOFxrh!X%g@^saPDM1)b3!t@WRH^qLg++KFO$(5)3T5j@$B|+Fn$RzERkIEOo zWbI;fAexugOKk|{QH^^JMT9Q7J08N$i#}P`$3uxnnHtv&5rj^#&<%hvoov|vSVn6y OtfOo*S`%qR>HHrqU~&ck delta 475 zcmeyPyheg=IWI340}#Y5yO1WpI+0I;v0$Ql7B_bbLljpEPcVZf@5XI@tc>#}@8wjV zJfEF+@;{DrmRhD7rpXJ~>|~gWgn@c*v8JS^d8XWAPtM5COinE>W(Eo>O#Z;85TFla zi2?CvXCTqQaDz{{C;K{|(j`8nr6wyx*GOy#y`*Wi!|{TK-GRUh%I+7H-LELSpI|-1 zb)N4O-$jpzD;^OS`693IMK-wK;1+7|o4k%g8r3nu4&zRK`C?GdEh_8*;1jy24E&{o`$aL~kK2=s5AX9NN zKmQRKupA3i4y3>gL|B6e^U3e|f|!5>@2g-RJkcJHLD1v%lo?IRy6d$EfuT zBlJs<8_Ud{Ssk2HL=eF)V%Wr3_>wCz*_4@LDhZd}3{y>&X{Lsegtib-J|mK$cpxJ* zgq5196Lkj_wJSl3IL_8wJ2znE6DkvE==k!f=-n=}(w$pyiXi-I9n1Vc7Y;_zbA4`uwo Xz{!Y>>~QMw_z0H!f>1G;o4)`6O70pk delta 99 zcmew@_gjv4IWI340}#9mo|sm>0RW}a8!!L> diff --git a/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc index 44f35ea412529f9a981f2b6c5e6c19ccdaee1089..4acf2dfde06cb77c0f48cebb07e85fd073f6a73e 100644 GIT binary patch delta 452 zcmeyTvq6V$L76lsA7 zNf03lB7}hiRIz7XN@;OPQKesEZfbE+B2Xd$h>JmL8yN0#3tiz>U7EF3TWgE{0mF;j zu2;BSFR-|RO-TmX4g)Me2H5FlFsIA#1v3=!0EIP~i{gRQJC&2yz0M6QORR910 delta 521 zcmdm>^G}C&IWI340}vE+Ur5v1$a{&EQGW9S)<`C%q{PYA97&97o9A&fFfy8Kmgkzn z#Av>G3(pfKMwi7i`I#8~C(jbhRA&KdW(MNVH9%rILkWu)e5adqu3ZKr}s2!{*wohIyyn``ia*Bu{8^{Mm>62%R$Z{0|nIIPx oCr>^k@>GC}h0*W>1DxQSyj|2=n~72Q0|T7kfU^){AQsqn08Cta!2kdN diff --git a/web/minibase/blueprints/main/forms.py b/web/minibase/blueprints/main/forms.py new file mode 100644 index 00000000..6cc86062 --- /dev/null +++ b/web/minibase/blueprints/main/forms.py @@ -0,0 +1,8 @@ +from flask_wtf import FlaskForm +from wtforms import SubmitField, TextAreaField +from wtforms.validators import DataRequired, Length + + +class NoteForm(FlaskForm): + content = TextAreaField('Content', validators=[DataRequired(), Length(min=1, max=5000)]) + submit = SubmitField('Add Note') diff --git a/web/minibase/blueprints/main/models.py b/web/minibase/blueprints/main/models.py index e5b20d96..decc7f4b 100644 --- a/web/minibase/blueprints/main/models.py +++ b/web/minibase/blueprints/main/models.py @@ -23,7 +23,7 @@ class Notes(db.Model): last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) - company_id = db.Column(db.Integer, db.ForeignKey('companies.id'), nullable=False) + company_id = db.Column(db.Integer, db.ForeignKey('companies.id'), nullable=True) class Todos(db.Model): diff --git a/web/minibase/blueprints/main/utils.py b/web/minibase/blueprints/main/utils.py index 78dd6f17..1867c99a 100644 --- a/web/minibase/blueprints/main/utils.py +++ b/web/minibase/blueprints/main/utils.py @@ -28,6 +28,7 @@ def populate_form(form, cur_model): item.data = formFill(item, cur_model) +#Fills the form with def formFill(item, cur_model): if item.type not in ["SubmitField", "CSRFTokenField"]: # Cheking if the arrtibute exitst, otherwise ignoring @@ -35,13 +36,15 @@ def formFill(item, cur_model): return getattr(cur_model, item.name) +# Fills the model with the data from the Form, if an attribute doesn't exist, the value of that +# Attribute will be filled with the existing data (May be an extra step, overkill?) def modelFill(cur_model, item): if hasattr(cur_model, item.name): if item.type not in ["SubmitField", "CSRFTokenField"]: if item.type == "FileField": if item.data == "None": print(f"File field found with no data -> item name {item.name}") - print(f"It will be filled with the existin tbale data -> item name {getattr(cur_model, item.name)}") + print(f"It will be filled with the existin table data -> item name {getattr(cur_model, item.name)}") setattr(cur_model, item.name, getattr(cur_model, item.name)) else: setattr(cur_model, item.name, item.data) @@ -91,9 +94,7 @@ def send_sensor_email(email, data): # QUERIES def queryIndustryNames(): - choices = Industries.query.order_by(Industries.name.asc()) - return choices + return dbUtils.queryWithAttrOrder(Industries, Industries.name, 1) def queryIndustryNamesWithDefault(defId): - choices = dbUtils.queryNameWithDefaultId(Industries,defId) - return choices + return dbUtils.queryNameWithDefaultId(Industries,defId) diff --git a/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc index 3394b3eb8df7f1ffa3b789ced4ce76a5e7484b95..e3efb694af2efd8407272d880037aa77ac9ffe08 100644 GIT binary patch delta 1976 zcmd6nUrZcD9LIO=dPljvyKW2J_O7MCwH#1ddPhC9wM46y0_FZt?n*+9WVv1H(mjsO zE^R?7?W?gyoEMGZLF1o_)Mzd~wZ^12h6hY`$v)^QT3<~xnD)^Jf3xcWhKg@ZC$r!C z{pL42x4+MCX1*S}EBHS4`8*7?z8l6+>$ER`{+O=+yxOho$yH_@h{;u3%JnhtP(Qqlsd<08;N|&)3uGV}dn_)yW$qYM6{;KsZBRXcBWVwE4>Jw*T!j*nm zR%<4>8bQI5Adc5amt|E`n;Xlp0x#n(Dh(jTGI21Y$%x(RO=cjn$VPNFvc&B$xu%<^zS?CT>70)(95uKz zCU<6;LB14P;_LKq;)XaU&y9d#cY{xwd{XC<%Pz(ng(a39bguOV=?PUldXy`bT1ELJ z&O^qHn^&0?%T)=>f-*3Y$DvN4^FttFPw zQyDYWZ*XT#?kpvcv6=M(vk|lTxE}7cyTPYTKCN?U3au4Zq0llGw9I1ztz|v5O>$0^ zH{ulzw}nqrbYoQ7K(Z@)9GpjftRAu#4zEwkC1>MD^#wMZ<;>Xu2J(cl~<^|O63}vJg^&i z3-26w$vH)@A*X9aJx&)rV`~&fR-*Py7@>7pqcB20>fvf_aa;la+_n2+F5rwTts-6-^g&iqd& a_gZ#z&=2cH=s$kml>fA&4>p)&W$-tR1;thX delta 2813 zcmds(UrZcD9LIO=xU1Z9?SSp2^jf;KKv^w+ibX9Ejz32#l{?{%mI4)6xINkS;L7Y3 zORb(Z#wSgz^J1bVJXDNS6O()Ju{@CIgCx7_#?wo%@zKUa8h!FX{mrhNoNc8KJ~5g7 z{^s|ax!=w1XJ=+tq+4*Fa5lap!IH1buVYDmqRF z@G5G~94cKx=xAoO>|GanhK}!DLv6IJe90Yvgd{+J@qgrQXU$I5L>)BXUqYSqj(^GB z#lp`*I734RzCcf9Toq*weg{O^bbjR!^&YBA$5U?b{x0W>Hd+g=jn-ycFxIirv#=?{ zMvUWP=qfs&ci#v9L+2ubhXI#em`C?}JjWNOxb`!@DW1rR0YeOE?fuK$E2qHNRTm?s z7}0Um#L+AsGVqX&M@&4j&LQsvTJu$FHRHNZGJTSUrF9oqatv~>JD{@)*<(m6Okpz5 z1f1JLQF0~E;7r6 zFj1K>vLpqfvd1V0qy3#zo4ss%(Xq8da_7{`-^s|JH2CCi$H1>otA78t&b^Wxe9$UKs{sS6z&n zVpPWiCLYM*VFM5A_?(H)u>}~mvGwY{km(C)IK;3uY5Xy^0K?W!8-6ggqHS@gp3Yu1H)cAWa1%)uiM7grTc=WFR0-l!`A?*8NP1h zvc}N2YkT~cVG_Awc6XEV7`$jNgHK*%@;bd+dt=WWYtA!a(D{4jZ3XzZ%$ty(IE3`==(rrcVr`9%49)*7vD|5y1grr^=dnpws?Bgw$ xxlz}EsJo%g^8vW*i%K2Iv^KcW3*{PDP}hs12(kPRHt#5R?cU%1V~{nSzW@)yTU`JE diff --git a/web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc index bcb4bb72697b252b7ced99e7c19ddbfb9d4c2526..7ce856983d10f071fc8c4937e41b60562101bc80 100644 GIT binary patch delta 1362 zcma)*O=uHA6vuZqyPK~~^HGzu)}}VCCfgE4E!AjK+h{5kWAOtI9+b4Zm9L~SBbLO}51Nx=%@K@gqUSd59F3;WwQZ~pV2_a4dX zP01~$J0_EXBG1#e!}AYKUPMoDFlLJyL^Q|FXejEQ29_-zcxJO94sNV+fr&BWm9<>Z zPJ3VtW7GdWGE$YfM{g@X@`3g==w=Z1$8YHoQQ4jC8c%K2{u~FA#)sg z=a9pDYb&rHP|%nv$54Eh}r$Cb>=^v371%g|4+q*MxQUD&4wr z-Cl|k9nxAXbXE!1mkU*0^Ir`;V%;H1sD}}4OM^fcb)$)BG%^^Kidif%}G?#)Xco zu_tHj$s2p%t6}TLMJ8(r zy9>O1A~@Nfl2e0ed78c&OUGuVh22@cH^=wp`QBuxptnufChJrF)aJB5bMR^)9hmJ{ zV6yr^P9MnY1Mtb}fak^|=pD51Zp=PDz%J`3>uR{fCo~0@=bGu_`a+F!VsKK<&{Kx# z@O1EY_<@jX?aH@yEhe%x;ap8PUlUI5fs3Zg+)g|og`1C9I0O!J6XK!Myk)qKWa|l5 z6EqOuzY?XaA!sCU5i}93#V8s@>GY5ykH_V)QN>R(cVeD7>NmyYQCOLx5@YwpxE{yGL2!?B|;Y!Ph zB1QgXd4O0FY$w40fm;57`6spSk&jsR?H8=d|4a$q*n@%>pD60%a!fiDkHp3+TR2Q^ zAP7RQ<4b8Ghhc}aeSWLsv!k*#I|ZtRvd(Jd|6mLsn~s7Zw}*Bwn~^F~fM733?e5JhHgqL03GJ7Il=b}2xI^E_1U8!6}b!F>xwfQ<~8!45mH#FQ5 zvG!}cHh5lCW4K4Mx}jt&7CIi2f#@o&dfHvKC?XGplCgxBQSezQfhJuTZt4b!XI>|a z5;#|Un;Zd;z8#*521w|e>KDb9*J8^Xv1Q`GlITcj(?Z6ZaZh`1c3ksK`ySTj)nQty zrtefqf;1^jIa2=A&a^+%cQud>z!h3LXgExk;I6?<`O*+z-ir<}8k5{IuW{AE1><>W zD7nN3urYrAm&6lTFuCYw{9tMvuwmAYa3IPNc;re2ViTeg;Y7G7vigWT7FMDoiRkc< z(u^58{mE!p9#dLTr0&y(QSc8ua7LWUH4vl?NCcdcxefnsWjBJS$g+vkBeJpwpZ8Mq zDEl!iu!ELCg+w$i_a{Q}k;3--a0f&?e6g{eK?KW1^x-+4O%KmY&$ diff --git a/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc index bc7cb19c44880cbc7967810c989c12309d9c900c..3eacb588958b5ad02193d9393707412a147fa0eb 100644 GIT binary patch delta 22 ccmexp{?VLwIWI340}%W>em6~XBkvPw09%L%7XSbN delta 22 ccmexp{?VLwIWI340}wE;xR9o>k@tx-08upt=Kufz diff --git a/web/minibase/blueprints/sensor/forms.py b/web/minibase/blueprints/sensor/forms.py index 135ba538..e98a8dd8 100644 --- a/web/minibase/blueprints/sensor/forms.py +++ b/web/minibase/blueprints/sensor/forms.py @@ -6,6 +6,7 @@ from minibase.blueprints.sensor.models import nbiotDevice import minibase.blueprints.company.utils as companyUtils import minibase.blueprints.user.utils as userUtils import minibase.blueprints.sensor.utils as sensorUtils +import minibase.blueprints.database.utils as dbUtils from datetime import date class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the user update @@ -70,25 +71,25 @@ class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the u #custom validators specific naming convention: validate_. This is how Flask-WTF knows which field the validator is associated with. def validate_name(self, input): if input.data != self.originalModel.name: - if (nbiotDevice.query.filter(nbiotDevice.name.ilike(f'%{input.data}%')).first()): - raise ValidationError('This Name already exists. Please choose a different one.') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.name, input.data)): + raise ValidationError(f'This {self.name.name} already exists.') def validate_serial_no(self, input): if input.data != self.originalModel.serial_no: - if (nbiotDevice.query.filter(nbiotDevice.serial_no.ilike(f'%{input.data}%')).first()): - raise ValidationError('This Serial Number is already registered.') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.serial_no, input.data)): + raise ValidationError(f'This {self.serial_no.name} already exists.') def validate_imsi(self, input): if input.data != self.originalModel.imsi: - if (nbiotDevice.query.filter(nbiotDevice.imsi.ilike(f'%{input.data}%')).first()): - raise ValidationError('This IMSI no is already registered.') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.imsi, input.data)): + raise ValidationError(f'This {self.imsi.name} already exists.') def validate_iccid(self, input): if input.data != self.originalModel.iccid: - if (nbiotDevice.query.filter(nbiotDevice.iccid.ilike(f'%{input.data}%')).first()): - raise ValidationError('This ICCID no is already registered.') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.iccid, input.data)): + raise ValidationError(f'This {self.iccid.name} already exists.') def validate_ip(self, input): if input.data != self.originalModel.ip: - if (nbiotDevice.query.filter(nbiotDevice.ip.ilike(f'%{input.data}%')).first()): - raise ValidationError('A devie already has this IP') + if (dbUtils.queryIlikeFromTable(nbiotDevice, nbiotDevice.ip, input.data)): + raise ValidationError(f'This {self.ip.name} already exists.') diff --git a/web/minibase/blueprints/sensor/models.py b/web/minibase/blueprints/sensor/models.py index 4fe4aa32..17453469 100644 --- a/web/minibase/blueprints/sensor/models.py +++ b/web/minibase/blueprints/sensor/models.py @@ -5,30 +5,33 @@ class nbiotDevice(db.Model): __tablename__ = 'nbiotDevice' id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(50), nullable=False) + name = db.Column(db.String(50), nullable=False, unique=True) model = db.Column(db.String(50), nullable=False) - serial_no = db.Column(db.String(50), nullable=False) - device_id = db.Column(db.String(30), nullable=False) - imsi = db.Column(db.String(30), nullable=False) - iccid = db.Column(db.String(50), nullable=False) - ip = db.Column(db.String(20), nullable=True) + serial_no = db.Column(db.String(50), nullable=False, unique=True) + device_id = db.Column(db.String(30), nullable=False, unique=True) + imsi = db.Column(db.String(30), nullable=False, unique=True) + iccid = db.Column(db.String(50), nullable=False, unique=True) + ip = db.Column(db.String(20), nullable=True, unique=True) port = db.Column(db.String(20), nullable=True) registration_date = db.Column(db.DateTime, nullable=True) activation_date = db.Column(db.DateTime, nullable=True) deactivation_date = db.Column(db.DateTime, nullable=True) + image_file = db.Column(db.String(20), nullable=False, default='def_sensor.png') + created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + + # Foreign Keys status_id = db.Column(db.Integer, db.ForeignKey('nbiotDeviceStatus.id'), nullable=False) type_id = db.Column(db.Integer, db.ForeignKey('nbiotDeviceType.id'), nullable=False) area_id = db.Column(db.Integer, db.ForeignKey('nbiotDeviceArea.id'), nullable=False) - - # Foreign Keys company_manufacturer_id = db.Column(db.Integer, db.ForeignKey('companies.id')) company_owner_id = db.Column(db.Integer, db.ForeignKey('companies.id')) device_user_id = db.Column(db.Integer, db.ForeignKey('users.id')) device_owner_id = db.Column(db.Integer, db.ForeignKey('users.id')) + item_id = db.Column(db.Integer, db.ForeignKey('item.id'), nullable=False) #DefinedByUser # Relationships company_manufacturer = db.relationship("Companies", foreign_keys=[company_manufacturer_id], back_populates="manufactured_devices") diff --git a/web/minibase/blueprints/sensor/routes.py b/web/minibase/blueprints/sensor/routes.py index dbed622c..3c0723a4 100644 --- a/web/minibase/blueprints/sensor/routes.py +++ b/web/minibase/blueprints/sensor/routes.py @@ -53,7 +53,7 @@ def callback(): sensor = sensorUtils.queryByImsi(src_imsi) mail=userUtils.queryMailById(sensor.device_user_id) print(f"Sensor Model: {sensor.model}, user e-mail: {mail}") - #mainUtils.send_sensor_email(mail, data) + #mainUtils.send_sensor_email(mail, response_data) return jsonify(response_data), 200 diff --git a/web/minibase/blueprints/user/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/user/__pycache__/forms.cpython-311.pyc index d634aae178012f2e625389e4260a93f59a253a79..aa5b386ed572957a2a35946f60667230bd07db11 100644 GIT binary patch delta 3867 zcmd5;TWlN072REm4|7S1l*kojN){>0l4(6$hmvh6k-|8B#4oCeoLEwu%9M7ckm19g zT{@9#fU=ReMPL+mr$LQ8fB-=p8IOnwpsP!fOSBS6T29|i#jF^Yb){ixg;D3G7@ z-dT#3D7jI7f)2R{cjn%ixpN!>f7smb7q|nQY<+=~MTNg=;JA0-)7yA}@od1eui~{*C-37o(=Oh( zxsA!yfn5D6xh=AJgbTXq1^zqXp8{>!ww3--kleCy-c+@liJt57(LV@Ym*uJedcarK z!%SZ{Fb;2_r@B16l?DtRddA?|xW+P8fl~~!SQe>ks9sEDd>g%E@W66+U^zR|tK=LY zXO|six#1cQUkkK*Kz7P5x$ZS#zP?I-7ff)Ca zw?yZ~fh+D}V`s6k_bahCFZSMcHWZzmH}-wd_x{jA-_3!7Gg5R$7CGL2jK3{y$+tgo zO`cB{d%{5J|AI79lt%K-kwqhC>w_g01r*k&kT7ht+U6!0{V|R1JwTp@Ems)Wt|X(e z#6)yzDxFDbBno^oiLlb5WD3SAhNS87C9|4g{wK9K z6r&!`?wJuJpF|i&z~~|&1Sderc`~Z1&!vexF_lhD$4HV`kaq~-X9x-c#xY^38%Bzy ztArE+2EMA&xsH$+Pvxa_K}r{;H2sI?yckvT(sV(ZE=tq6St-l!L?0WB6|@<&gITskB zf7`UKn*>C~2(G&aVI8*=PGDBw`vWGheBQtA36BOIW3m9jT6PcU-aCw=M-YzEzXV#T zt+mTRMxkE`%-kcb^#A0B^ER_&BNM3aitNDwh1PEA4oo8%23UPJz~GO1HI%h|1~pox zZJeHMe<1rT^1=X-pr0hLlSD`%;8jMj01yYl2?Wevl18XSh#{OrIE5f05Cj#$hESE* zH8_UVsbq~MqqMujK3GX}q9OCYnSBns_s#6n$UU8Vu47yXRZ>+?+jS)DXuI02uEMw+YqZrK`seK_yk z`flRg#Gg{{rxuh2<&&A4Gx@$q-ZosY4Hs?0^it;@Qy8X^3)B#L#iT1o-wbWdR?7MB zfc<+;tGs?VE?%KEv~9U9r{jjDQ7H8lnU$q}u31Cpl^ZMd=ziAX=Ij!w*ZP$Yu=Bjk z!9&XsA-@1IsQq$UQBxh-Qtb~~sw)tS8g_rUU9_AT2rc%5Kq=30BkS-+KdD zj8OGafI05At-fgMxM94JDQ@4hujqxB>j(zL>W1q!2Q?VSF$3feRsB)G2U&1j2%r_Nn@dMp|r_a4vFdl_Uvo^b)F~1>sm0Q%zkUuQk)XJyk^8B)zkSmoT&rsD zOE`w`JpFn96*0Wj4YudL>#yNWM`57UNGf0GjS0hX4Qo literal 15749 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 delta 20 acmdm~wNs0GIWI340}y1DU)ad4Ckg;M*ab}h diff --git a/web/minibase/blueprints/user/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/user/__pycache__/routes.cpython-311.pyc index e148eabe0b960b89079b6bda02ac13266c9fea9c..d2acdf22ec1608701fb57445d3eea8a67e05ae8d 100644 GIT binary patch delta 1634 zcmcIk&u<$=6yEXfI!=?VMPtWgA&!$cw%2y-CQ%^`4i%vVqACRyB+@7)+IlC!itTmZ z?jo8XT8Rq+4pf804Yd-YYH8uHLgmIkfK(wOfmTSB;DE#dfpX(eF>ls&$sd3vf1dYa zX1@8}d;WI)<8|$ZrX7;_=d(|K*xb9SjgVKa=I<^L$&xIkIoV3qBSdOt1*X=fh!l}% z)as)-D|Wm83t5uBRB&F%4)f1 zeaNlpo^>x$BNa9%kEqq2Z&9w1qijdMMWSp<8S`IPN;1*?_xeVNHpy8T5lHbL$g-QU z*T}5@Aoh+-#@Oy)Lz}>G67cOX#r_@~A_b;uIWo=4TKcIny8981A@p$w6ce_bK;EJ* zsOZFpgSbV8EUr`Rik8x5FjsBbTa7lH@ITiy5})I)oxUpf*`8aM7qSw%2xD(Ao7w zLPt))K-an4-n0chV+@Aby+k@{;OWb3KQVv&C0rH|iU`vjfOTgVughM713a9~fsJj95 zqDLJU*4Z=q4SxG?`uh=ndvny#*Le2M5uxM3+zk7AG)vNKZ!{lv%h1DaiKWY@hme3^ z_DB}dHG)|MqZ-0lgjW$B^@|dyuDwm$51aFH`tczl(?G}|44VF}bONRNZY)a*qNu8C zUT9J{$&WMoMOQ)%k6z>u$XKH)8yGK4btS1|>`e{_BvHX`QU|u#>i9aDW8aLwn>&O1 zm1d*8ZODP*(B>wf3vAqryfdgLJ2$b&H+(u#(l284IfP!XLJQ3n`(@&2R5)Ayk;z$^ zSnO18fy;O$mwIvwQ*?xJ4u&GeCmf!W%+DRW{4~bISPX|^ub>0B1yQrpp=~R?1_uSO zB?65X7A~FTPg=UPY(WwOqAa2gs1%$+sA6)=y70W+YBjnOEcy&*8?cr6lV9M7&ke^~ z2`?U?Z@XYFd9G`>LGZy=bC3d;rQ2tRypF|(0C~W!e#{|A3&*Gi-8t5VcoDgRCs?16s)xtnw4 delta 1693 zcmcIjO>7%g5ZLP(@fLP%5<7brhBEJP*X2Det?hP0~0fkPw?h)SH`!pvLOp@=Ih?YD1c z-t5eq?|bj9-CNV|>iQ7{pK~AoxOuRzC)o0S?(6LC;OZb#OvTi!q1|{zWy__5aoaMs?@BJvSE~AxiSzobCc(i3bVx{m{%UV?P;qjLBHd=+2 z^*}A9CRF7`#q4`iF`xNFRg^FA4W89vYv0LGiA{q|2O0-t2_ggnYEkz|UbbpD8dy4w)6fteWS-f;ih*U^5M` z^S;Ig#C+HELJBus*FA?rp&Sgug+B7dnr30!-L>%d)S}-B2I^?=Lc`{6oNZC4Hn#%SY&I3F*dRQBRMZE_$Q z&i{6NvQwTR+AIw#jfe4{@$8LnyRS1O<@v;BNs`j}pQOa;*Rq>gT9pV+5=e^j;-^G< zTvk&L$M2AW9*C)WWDm~sgX9oPiSLp* zUG{UV*^hXX9J|p)C1o3=ir~Of1+t9^^63Px5-bxC?{eyf=7-(d4!4_{M8DroGUDcX z{i>s(jrwQ`q$B7y*uQ}x4__zBm?-q-#P|KbVC$czhS-SYGwhZ(EDnpf$7qKre&7_r z9D*MrdWzzY^vG~?Kqkei2u}LQ;bNb-S{gr6=GZzvZWcR+fJ$5;3{9hCJYAK zltcoC41%G_2?oqAird*|FP@-SnqtQTeqJUArTLL^z0PejC`@Aol8mn-@o zgyR&DOiJo#c5s%UD8_Qh^CPsBhy4eE!T&q(PD6R#bKRN^vMgQre-U`(@Hnv7ct7_N zlczVP#KA}{B3Vm`2S!48#syXs#e724jd09!tCkZ8WcIOBJe40*@qQNb`Lev94wmzg zF3;sKO?{pwSRhy-xI{pr0gFHqut%#WnfbHrh25IzS$q!O!6?JmSrOmlf8E+pe@FX& M$1lfXsz#dl8&r3LyZ`_I diff --git a/web/minibase/blueprints/user/forms.py b/web/minibase/blueprints/user/forms.py index 76521eb1..96fc900c 100644 --- a/web/minibase/blueprints/user/forms.py +++ b/web/minibase/blueprints/user/forms.py @@ -5,14 +5,14 @@ from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationE from flask_login import current_user from minibase.blueprints.user.models import Users, User_Roles import minibase.blueprints.geography.utils as geoUtils - +import minibase.blueprints.database.utils as dbUtils class registrationForm(FlaskForm): # Defines the form class to be used for the user registretion # Decalarion of the fields for the form and it's propereties - username = StringField('User Name', validators=[DataRequired(), Length(min=4, max=20)]) + username = StringField('User Name', validators=[DataRequired(), Length(min=4, max=20)], unique=True) name = StringField('Name', validators=[DataRequired(), Length(min=4, max=20)]) surname = StringField('Surname', validators=[DataRequired(), Length(min=4, max=20)]) - email_account = StringField('Email: Account', validators=[DataRequired(), Email()]) + email_account = StringField('Email: Account', validators=[DataRequired(), Email()], unique=True) email_comm = StringField('Email: Communication', validators=[DataRequired(), Email()]) street = StringField('Street', validators=[DataRequired()]) street_no = IntegerField('No', validators=[DataRequired()]) @@ -40,14 +40,14 @@ class registrationForm(FlaskForm): # Defines the form class to be used for the # Queries to be made in order to validate the form : If username exists def validate_username(self, input): if input.data != self.originalModel.username: - if (Users.query.filter(Users.username.ilike(f'%{input.data}%')).first()): - raise ValidationError('This User Name is alredy registered') + if (dbUtils.queryIlikeFromTable(Users, Users.username, input.data)): + raise ValidationError(f'This {self.username.name} already exists.') # Queries to be made in order to validate the form : If username exists def validate_email_account(self, input): if input.data != self.originalModel.email_account: - if (Users.query.filter(Users.email_account.ilike(f'%{input.data}%')).first()): - raise ValidationError('This E-mail is alredy registered') + if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)): + raise ValidationError(f'This {self.email_account.name} already exists.') class accountUpdateForm(FlaskForm): # Defines the form class to be used for the user registretion @@ -84,53 +84,31 @@ class accountUpdateForm(FlaskForm): # Defines the form class to be used for the # Queries to be made in order to validate the form : If username exists def validate_username(self, input): if input.data != self.originalModel.username: - if (Users.query.filter(Users.username.ilike(f'%{input.data}%')).first()): - raise ValidationError('This User Name is alredy registered') + if (dbUtils.queryIlikeFromTable(Users, Users.username, input.data)): + raise ValidationError(f'This {self.username.name} already exists.') # Queries to be made in order to validate the form : If username exists def validate_email_account(self, input): if input.data != self.originalModel.email_account: - if (Users.query.filter(Users.email_account.ilike(f'%{input.data}%')).first()): - raise ValidationError('This E-mail is alredy registered') + if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)): + raise ValidationError(f'This {self.email_account.name} already exists.') class loginForm(FlaskForm): # Defines the form class to be used for the user login - email = StringField('Email', validators=[DataRequired(), Email()]) + email = StringField('Email: Account', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) remember = BooleanField('Remember Me') submit = SubmitField('Log In') -class updateAccountForm(FlaskForm): # Defines the form class to be used for the user update - username = StringField('User Name', validators=[DataRequired(), Length(min=3, max=20)]) - email_account = StringField('Email Account', validators=[DataRequired(), Email()]) - email_comm = StringField('Email Communication', validators=[DataRequired(), Email()]) - picture = FileField('Update Profile Picture', validators=[FileAllowed(['jpg', 'png'])]) - submit = SubmitField('Update') - - # Queries to be made in order to validate the form : If username exists - def validate_username(self, username): - if username.data != current_user.username: - user = Users.query.filter_by(username=username.data).first() - if user: - raise ValidationError('That username is taken please choose another one') - - # Queries to be made in order to validate the form : If Email exists - def validate_email(self, email): - if email.data != current_user.email_account: - email = Users.query.filter_by(email_account=email.data).first() - if email: - raise ValidationError('That email is taken do you have an acocunt ?') - class requestResetForm(FlaskForm): # Defines the form class to be used for the reset form - email = StringField('Email', validators=[DataRequired(), Email()]) + email = StringField('Email: Account', validators=[DataRequired(), Email()]) submit = SubmitField('Request Password Reset') # Queries to be made in order to validate the form : If Email exists - def validate_email(self, email): - email = Users.query.filter_by(email_account=email.data).first() - if email is None: - raise ValidationError('There is no Account with this email your must register first.') + def validate_email(self, input): + if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)) is None: + raise ValidationError(f"This {self.email.name} doesn't exists.") class resetPasswordForm(FlaskForm): # Defines the form class to be used for password reset form diff --git a/web/minibase/blueprints/user/routes.py b/web/minibase/blueprints/user/routes.py index 6f19a85d..ab04db5f 100644 --- a/web/minibase/blueprints/user/routes.py +++ b/web/minibase/blueprints/user/routes.py @@ -5,7 +5,7 @@ import minibase.theme as theme from minibase.blueprints.user.models import Users, User_Roles import minibase.blueprints.database.utils as dbUtils import minibase.blueprints.user.utils as UserUtils -from minibase.blueprints.user.forms import registrationForm, loginForm, updateAccountForm, resetPasswordForm, requestResetForm, updateRoleForm, accountUpdateForm +from minibase.blueprints.user.forms import registrationForm, loginForm, resetPasswordForm, requestResetForm, updateRoleForm, accountUpdateForm import minibase.blueprints.main.utils as mainUtils # Declaring a blueprint diff --git a/web/minibase/templates/account.html b/web/minibase/templates/account.html index 47587270..1b4a6842 100644 --- a/web/minibase/templates/account.html +++ b/web/minibase/templates/account.html @@ -14,18 +14,21 @@ -
-
+
+ {% include 'form.html' %}
+
+ + {% include 'notes_form.html' %} +
+
{% endblock content %} - - diff --git a/web/minibase/templates/form.html b/web/minibase/templates/form.html index 12101bed..0edf8a6d 100644 --- a/web/minibase/templates/form.html +++ b/web/minibase/templates/form.html @@ -6,9 +6,6 @@ {% elif item.id == 'csrf_token' %} {% else %} {% include 'form/allFields.html' %} - {% if item.errors %} - {% include 'form/formError.html' %} - {% endif %} {% endif %} {% endfor %} diff --git a/web/minibase/templates/form/boolField.html b/web/minibase/templates/form/boolField.html index 052869ae..9c80a553 100644 --- a/web/minibase/templates/form/boolField.html +++ b/web/minibase/templates/form/boolField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.check_label_class, style=theme.form.check_label_style) }}
- {{ item(class=theme.form.check_class) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.check_class) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/dateField.html b/web/minibase/templates/form/dateField.html index 0efc2acd..78b44928 100644 --- a/web/minibase/templates/form/dateField.html +++ b/web/minibase/templates/form/dateField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.date_label_class, style=theme.form.date_label_style) }}
- {{ item(class=theme.form.date_class, style=theme.form.date_style, type=theme.form.date_type) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.date_class, style=theme.form.date_style, type=theme.form.date_type) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/fileField.html b/web/minibase/templates/form/fileField.html index 8396962b..001d4537 100644 --- a/web/minibase/templates/form/fileField.html +++ b/web/minibase/templates/form/fileField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.file_label_class, style=theme.form.file_label_style) }}
- {{ item(class=theme.form.file_class, type=theme.form.file_type, style=theme.form.file_style) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.file_class, type=theme.form.file_type, style=theme.form.file_style) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/integerField.html b/web/minibase/templates/form/integerField.html index 76d240c4..3481fc81 100644 --- a/web/minibase/templates/form/integerField.html +++ b/web/minibase/templates/form/integerField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.integer_label_class, style=theme.form.integer_label_style) }}
- {{ item(class=theme.form.integer_class, style=theme.form.integer_style) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.integer_class, style=theme.form.integer_style) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/selectField.html b/web/minibase/templates/form/selectField.html index 360ed9d8..e23a30d3 100644 --- a/web/minibase/templates/form/selectField.html +++ b/web/minibase/templates/form/selectField.html @@ -7,6 +7,10 @@ {% include 'htmx/popup.html' %} {% else %} - {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} + {% endif %} {% endif %} {% endif %} diff --git a/web/minibase/templates/form/stringField.html b/web/minibase/templates/form/stringField.html index f22c0f24..83cef404 100644 --- a/web/minibase/templates/form/stringField.html +++ b/web/minibase/templates/form/stringField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }}
- {{ item(class=theme.form.input_class, style=theme.form.input_style) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.input_class, style=theme.form.input_style) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/form/urlField.html b/web/minibase/templates/form/urlField.html index f4d432f7..6671e689 100644 --- a/web/minibase/templates/form/urlField.html +++ b/web/minibase/templates/form/urlField.html @@ -2,5 +2,9 @@
{{ item.label(class=theme.form.url_label_class, style=theme.form.url_label_style) }}
- {{ item(class=theme.form.url_class, type=theme.form.url_type, style=theme.form.url_style) }} + {% if item.errors %} + {% include 'form/formError.html' %} + {% else %} + {{ item(class=theme.form.url_class, type=theme.form.url_type, style=theme.form.url_style) }} + {% endif %} {% endif %} diff --git a/web/minibase/templates/notes_form.html b/web/minibase/templates/notes_form.html new file mode 100644 index 00000000..42066805 --- /dev/null +++ b/web/minibase/templates/notes_form.html @@ -0,0 +1,28 @@ +
+
+
+
+ + +
+
+
+

Type your note, and hit enter to add it

+ +
+
+ avatar +

Martha

+
+
+

Upvote?

+ +

3

+
+
+
+
+
+
+
diff --git a/web/minibase/theme.py b/web/minibase/theme.py index 4d0920cd..c796a745 100644 --- a/web/minibase/theme.py +++ b/web/minibase/theme.py @@ -25,12 +25,14 @@ class form: default_label_style = "color:" + orange + "; font-size: " + label_font_size + "; font-weight: bold;" default_field_style = "color:" + black + "; font-size: " + field_font_size + "; background-color: " + white + ";" default_error_class = "form-control is-invalid" + default_error_id = "disabledTextInput" input_label_class = default_label_class input_label_style = default_label_style input_class = "form-control" input_style = default_field_style input_error_class = default_error_class + input_error_id = default_error_id check_label_class = "form-check-label" check_label_style = "input_label_style" @@ -81,7 +83,7 @@ class menu: {"text": "Remove", "url": "main.index"}, ],}, - {"menuName":"Sensor", + {"menuName":"Sensor", "sublinks": [ {"text": "List", "url": "sensor.list"}, {"decoration": "line"}, @@ -89,6 +91,15 @@ class menu: {"decoration": "line"}, {"text": "Edit", "url": "main.index"}, ],}, + + {"menuName":"Lager", + "sublinks": [ + {"text": "Names", "url": "sensor.list"}, + {"decoration": "line"}, + {"text": "Add", "url": "sensor.add"}, + {"decoration": "line"}, + {"text": "Take", "url": "main.index"}, + ],}, ] navbar_items_user = [