From 48a2b2300f3180185ae641f274270c3283793d18 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 26 Jun 2024 11:28:15 +0530 Subject: [PATCH 01/80] [update] task 1: console.py --- console.py | 32 ++++++++++++++---- file.json | 1 + models/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 345 bytes models/__pycache__/amenity.cpython-310.pyc | Bin 0 -> 444 bytes models/__pycache__/base_model.cpython-310.pyc | Bin 0 -> 1855 bytes models/__pycache__/city.cpython-310.pyc | Bin 0 -> 510 bytes models/__pycache__/place.cpython-310.pyc | Bin 0 -> 668 bytes models/__pycache__/review.cpython-310.pyc | Bin 0 -> 532 bytes models/__pycache__/state.cpython-310.pyc | Bin 0 -> 466 bytes models/__pycache__/user.cpython-310.pyc | Bin 0 -> 551 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 183 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 0 -> 2130 bytes models/state.py | 2 +- 13 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 file.json create mode 100644 models/__pycache__/__init__.cpython-310.pyc create mode 100644 models/__pycache__/amenity.cpython-310.pyc create mode 100644 models/__pycache__/base_model.cpython-310.pyc create mode 100644 models/__pycache__/city.cpython-310.pyc create mode 100644 models/__pycache__/place.cpython-310.pyc create mode 100644 models/__pycache__/review.cpython-310.pyc create mode 100644 models/__pycache__/state.cpython-310.pyc create mode 100644 models/__pycache__/user.cpython-310.pyc create mode 100644 models/engine/__pycache__/__init__.cpython-310.pyc create mode 100644 models/engine/__pycache__/file_storage.cpython-310.pyc diff --git a/console.py b/console.py index 13a8af68e930..2c9c4abf01d9 100755 --- a/console.py +++ b/console.py @@ -2,6 +2,7 @@ """ Console Module """ import cmd import sys +import datetime from models.base_model import BaseModel from models.__init__ import storage from models.user import User @@ -73,7 +74,7 @@ def precmd(self, line): pline = pline[2].strip() # pline is now str if pline: # check for *args or **kwargs - if pline[0] is '{' and pline[-1] is'}'\ + if pline[0] is '{' and pline[-1] is '}'\ and type(eval(pline)) is dict: _args = pline else: @@ -115,21 +116,37 @@ def emptyline(self): def do_create(self, args): """ Create an object of any class""" - if not args: + arr = args.split(' ') + if not arr[0]: print("** class name missing **") return - elif args not in HBNBCommand.classes: + elif arr[0] not in HBNBCommand.classes: print("** class doesn't exist **") return - new_instance = HBNBCommand.classes[args]() + kwargs = {} + for arg in arr[1:]: + key_value = arg.split("=") + key, value = key_value + if value.startswith('"') and value.endswith('"'): + value = value.strip('"').replace('_', ' ') + else: + try: + value = int(value) + except ValueError: + try: + value = float(value) + except ValueError: + pass + kwargs[key] = value + new_instance = HBNBCommand.classes[arr[0]]() + new_instance.__dict__.update(kwargs) storage.save() print(new_instance.id) - storage.save() def help_create(self): """ Help information for the create method """ print("Creates a class of any type") - print("[Usage]: create \n") + print("[Usage]: create ...\n") def do_show(self, args): """ Method to show an individual object """ @@ -187,7 +204,7 @@ def do_destroy(self, args): key = c_name + "." + c_id try: - del(storage.all()[key]) + del (storage.all()[key]) storage.save() except KeyError: print("** no instance found **") @@ -320,5 +337,6 @@ def help_update(self): print("Updates an object with new information") print("Usage: update \n") + if __name__ == "__main__": HBNBCommand().cmdloop() diff --git a/file.json b/file.json new file mode 100644 index 000000000000..2e5d2a85d0e3 --- /dev/null +++ b/file.json @@ -0,0 +1 @@ +{"Place.d636f410-16a7-4d37-80f6-f7d6a788b58f": {"id": "d636f410-16a7-4d37-80f6-f7d6a788b58f", "created_at": "2024-06-26T11:21:21.231381", "updated_at": "2024-06-26T11:21:21.231424", "city_id": "0001", "user_id": "0001", "name": "My little house", "number_rooms": "4", "number_bathrooms": "2", "max_guest": "10", "price_by_night": "300", "latitude": "37.773972", "longitude": "-122.431297", "__class__": "Place"}, "Place.715e9ede-9490-4a7b-a74f-b5341dbd8b49": {"id": "715e9ede-9490-4a7b-a74f-b5341dbd8b49", "created_at": "2024-06-26T11:23:37.238801", "updated_at": "2024-06-26T11:23:37.238819", "city_id": "0001", "user_id": "0001", "name": "My little house", "number_rooms": 4, "number_bathrooms": 2, "max_guest": 10, "price_by_night": 300, "latitude": 37.773972, "longitude": -122.431297, "__class__": "Place"}} \ No newline at end of file diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3aa34fc302ba50bf830424ad2ec109ccac9c7de GIT binary patch literal 345 zcmYjMJx{|h5Ve!gRM7qbCW|dgEU_RVglHugS<)$sW#UUPa_q`BA7$l-03%cXk5?xC z0uxTk(39?+-ksjPJ2Rgjq8RVzn|2%P_dxa|iR3D#JBc7rjRY2n!hKRF7(w!e>J-wC z>=R)m(h3#X>)GmFI?@~QsDMcAJl9@w4~}q6%-sVto|u+2iaSScq=L#D%RBgq2B^T{ zXs>r$9E6-PVH(E5aoh>Ym7qJRp=_g+xt-PyXNLTrg^2}axcEXgkNpvTE81&M1zo5Y zR+-j6a|`5pTm@F@ZXB$D_hfC&a3ozwyVOh8D5HTrozk5>WlU=687tSDFumCQd5NQs Nn?}g+3{TP-{sWdzWDo!V literal 0 HcmV?d00001 diff --git a/models/__pycache__/amenity.cpython-310.pyc b/models/__pycache__/amenity.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c653705512bba16b157b382c6fb34b537a1973b GIT binary patch literal 444 zcmYjOu};G<5Vf5^)2fv~V#fnZmqubl2(^(AEOekuS*#FWt02cNP70J2Ha>!xU&_kF zFEDYJg6K&;-}!v+y|dk5&|_%tC+qne?w^!wTZqXRS9OF=vy^GBh2f=01!osb2ReLZ zIt1|&q=DXs?-US1~CL@vF%gS?hs2*rlH=_XkPcnM5SC)>s` z8RM$<&;d(1QVY$ILLf!ZbS5R(qFy&_It-ggDVvp`RMS(cY*{hxD|Nrh%x@*6{e$@~ z0=Dk^IxcM;>v&?G)XdH6$IOE~w~N98_`)vQ!VP5QpYV86_{1hEH_n23IF6ADOcf(A zX&EioK0x$c(oOFcv52=Pq_Lxvb~(!0-*k;`ad;97#tYI!t^eva5&caQoo+@tqerO- KJ>-3U5c~i&oos*r literal 0 HcmV?d00001 diff --git a/models/__pycache__/base_model.cpython-310.pyc b/models/__pycache__/base_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9a87d491aa0863b7ea9127ff11c15a7aff00112 GIT binary patch literal 1855 zcmZuy-)|d55Z=9CK0A(;1_Xp3)fQo>ks70lrz%BFDg-<y zaU5RKKg51QmH3P9m8bp-eF@*3?Icxt*3QlB&h36P^UXS6U#~GdU;cB}`!`_hKQeAU zE{rD_=4%MaI!touq`brNc2j5IbR5opVA7NROD6pbr{hZJfVG0j?(=?P#2}ZWR0*ki zNv4d5#bIoe=%%qTqL*tCrz!cU)QBV#`ACcYVRi_IJX5c6B-?NCB9yUJHW{cc&D?w( z7*8ng*@NRO2Fq`;h8bgi$1uu8pE1 zSYT;+g=bXSE4)}AnIiaOOz-lPS4@9^E#ACn4>H@9?cMaR=pgS|cqs9Gb_8N6on%Ml z!gCc5#8BtQs%zW3iQdchfF5LuP9C-w(Az}8sMNQIrvxR*5tSfwpSm%MGOj_a`TjSdkA5f1qCkn1)qVLbF|MEgXTi>w%9qB{>+`i z5R&VoFO=&)le&=GL$&U(J4J)`wBgSnrB^A@a@-^c;4`@%4$#Q zznz``F7BV5w**F@smlw`o(@&vn_-&RB0&2MVyoA&qVGVo9Q_`7x!u&18DEGGX|57Q zz!61TFbwftIGcQO=VmU-^;@Z+bd;(19LiOHfb-Uwxn)OqQ$F+O3|&B>dy~g6N^%-; zO;RyVY+rOoS|ffz1QO%E%C4dpxM;flI6G3Zj9wGMeMC(qEjd(jQa8vf>FAmGL@fhe zI1t6I1J?Io-o-HFUUzD|&L@rQaOv|~v65>UYX?e#(jqeIR1}>v(j})`VMzv0qI;>| zXSk%Gq05tnCulGWkQ*)o^gBDQEUgMGjvR%Pdr$N1L}_~?1DVYQwG`c|RMrp}G?hz# zOyUy~bPrtjWGmF0G(oj5`JsvY`m>c&QB6#~+>Jt8@uNn^fP=9|&=tyTX4k^Eb>{ znfL`J&MAnVbZ6hY^SyUAolXmZy&WzlA8>y9WZeiP18}zwL7)@~ECPj#APq3OKq3_6 z6$v7PmoN=QV}!cR(_UoZ)EakZInC!tBI%p>cD zAsK+XT?i7T7?=ZrfgwlbJ7Nm@pZ@Q9Xs_q9VTZj_el5s>An9T<9_u z@rin7BQq(VxRvx=PjfA$&Gob{j3qDr){jqeo9KjP%4o?R4`N`K%EexOf3~n8jBfhX zBM1>9nBWN4=&(zy2dnMXlm0FIpBFEc4FIp3{-v#MZT}!TTCI5O|JC{F1h?@{_yc^Z BfAs(W literal 0 HcmV?d00001 diff --git a/models/__pycache__/place.cpython-310.pyc b/models/__pycache__/place.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b1b4eb16b40ade21900e9a6bfd8da069255b276 GIT binary patch literal 668 zcmZuuy^ho{5Vn)-Zualsq@$t11ZGGeV|nA*T##cgwsTyrh4-N5 zmE2PC3RFyzJ8=bLeWUsFeB-fMuNMU6$LsE3C?UUk=dmQ{yhXT|s3a+fq%u;piHeAl z_e91r`A%d4(YLsW<>ZQNrgtycr4l8uk4Cl%*uhx#A>ZZfXw7FRJ^PKV$cBb_E*xMH zsIred793@yy+8vn2!Xn^yu;Jg_gfcA>>FRf7bnHlHOlo+0sweNT>!>n~+ zdn4&f!cu}OZGH5$(P5?AW{+8GOyk1Sdv7oN^%$8q;+9t}I3G@qwl0D1JFe^M+J{sL zU;9=f9(mnQV$X2;LH)VR8tpTgZPhKmG6(-vSYYq)ng+17u7<=X5Y59! zWZT;2I_D)e2Y&M^!}o%6*|4SaV`pRRJw>?Zs8W*9|DBW$b-PVsQ!ERoW0&(ier~@( fP&UH&Q1oxw(R$WjNH4}czv(~2^?V6k(X;q3ZuPIh literal 0 HcmV?d00001 diff --git a/models/__pycache__/review.cpython-310.pyc b/models/__pycache__/review.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..028b89af5149439b62b77901ace3f771e16efcc2 GIT binary patch literal 532 zcmYjOJx{|h5VaGx4X7QE7#Tct$wDMXgisp^!9pb{Qx+@4R|sSKk;Q}O2Y1T$Zuhp!-^M1E)?*YvAlW&eict*KDXuxvWkCUKN8Y27s*GCA$McQ# zv3b`G!u_j&FzQx7oBAYVHo$Uy&|W*f$9cM!fU+Len~(nGwb8&`2+rE~p1V1hu0NxF Hdg%WE0n&** literal 0 HcmV?d00001 diff --git a/models/__pycache__/state.cpython-310.pyc b/models/__pycache__/state.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d2678752862e980b0d9dc79d2fd105fcfb6d9a1 GIT binary patch literal 466 zcmYjNy-ve05Vjq+gwhU3-SNPZrIDBsY9k?7sF2E(#WL}=Dsr6Sq(HmU2Vv!Hn6n`! zUV({oT0~E}v+ui~@9v6TuR~BiKUUK>e80T2FC3jAYI%xAlay$xnV~sL86{Ul2byn) z=D=QqG|;UHiQ4NEF{xAq;-=6`17cb@ah;44v2eu$WR>{FRwSbJVWLXFBrusr_JyJ| zL@oPhfTR?unWjj=QmzA};dQHFS@(8qnNejaYBG*mbtt7(IY?P|q|BQ!@ZXj4ajDEM zav-HHGK9GY-ih;vXw1)ToZBka@yNW$NinUSl>>2UXLAeS=62Qu?m*>#E5)O^OKc)D zQ&^BsXEAbuDdW=LVX#=a0DHInKHh|c(~vgUIN~lus6O6S4DRtHequ0=A>JhYPqzIX T`GW9#yVr$3RnwN!F6{@ua=>y8 literal 0 HcmV?d00001 diff --git a/models/__pycache__/user.cpython-310.pyc b/models/__pycache__/user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a67ab21fecc1ca40ab25391ef96a2cc57db32cc7 GIT binary patch literal 551 zcmYjNy-ve05VjMy4ONST!~=L>$;xz)yazL{S=fg`snba0jRqNr|E=(6kKFfRYQMLdD*R zVi3HAX{ZL*Bp$xB&L36E*)GN1v+aZ+d|Pf zML3QMNJ^1AP!u_WlpzL)A!4LL0Jgf2N&o-= literal 0 HcmV?d00001 diff --git a/models/engine/__pycache__/__init__.cpython-310.pyc b/models/engine/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e040611b65112ca116a8e72b3e412203a32a117e GIT binary patch literal 183 zcmd1j<>g`kg85dJX(0MBh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o10MKR2&LKSkd$ zry@Q$Kdq!Zu_#r+H7`9gFEzC&GcO%15t5pit58sspOu%f5?bxrkSy1x3Vx+ZJ4n*`dAH&2H@+l2gz zgT-dT;5PL94G^6438&nMX`kLF+~n*j;q1)l8{F6<9c!}l=rGFtB;(^)_*@L5ROEi> z58^P-{UY;|FbxlcKa5~GFEXhIne-3$(|y>LrQ$a*LwW<0i_L(+ZRq(85Q6k6KruM& zo80KLi1e)*OyA}fx1W-}!yWFz+vN@3gm;6t0HCK@_rUaCZFzD-qpiW!$npzR*{}u$ zzKA&YqtyR+@3Wpi%w!T4lLmUQeUxYEfC8ZNhC22;&~spu6y%74T{`*Tp(w^OMKX9a zD55M4<*5%w=I0N_Qi`;QPtnqxnT{dRZM6|BfDVFe|40mqyh9bsMLhh4NDFrT@l7{L zi!Sf(#7}~~Y*?IxQuue%0|k9*HpVM>4|`x;v5FO?LxLdvN@Iw}#Rc`kO9# z7|fAuk4}{t#&HY%LQJ+XSzZ9O4Qm6OKX0fr=$eS@pp;}vW@JiBIyGjHLtBI!o1~;i zCd!D;D203is@UYM9nNz<6(@e}Ddx?2t~}>XH3C2mX%z&DZudG&I$%cG;}H)Fp`0QM zaI-QZ4m=_jWx{!yt6E@ulnHj0LD61af59tQyA)pJ*@dpXia{wzL60B}&y4S{RWu@% zQ5sVd<{0_|x-}yok*}Ly8I@VFl1=Ry%$DXY@_4;)rY`7oW>E44u)%<^GZR>VoAe&Z zyC-l0K3_uDx67RPd*LzMr+<@y6k)s+J?V8Cie)2_*15BJId^nWM`3X&@zzTdgtDSS zB)P=cDuyYo7#}C2j#aZphl;_5kutv(kOjwK{33@e2UzRydAb z7SjYbUShNjA6zi{I}CJnAqlN8A1F6tBQYyr2y_;+#Hx@X%B|Q=oQi4Pj@_hDSz34E zX40x`t-G<8v?~YVK#}v3l~!q&4sZP6RPN*^M5|FO70X8}yb1ApyJ{Az)3vfWqgA79 zOxJbf)**7O$}8Q{HS2%qma=rK{Q(s%li;N?>v5}>j)k!MzEe`q}Vup zavoRQcS1T#ldGR(A*B3&#C0gML`PO)S%E9x*bQ^>Db^&s|DWeV!rOWfhXaAiUIEFE zD|e#e6yDBGBGOv5ABy8hoOB%d3LGV0Me!Pn*HK_~mv5r*K`1IEhNY)N-MOMx>)Nor z57q;%>r+%~K0gK^`bg!?XGRD~8@QOt5u7%6@!bHhY1?XP{#{rD)>u?~J}EVH4Na~f zNUSe%6$R#z$zwPFDve4 Date: Wed, 26 Jun 2024 11:31:56 +0530 Subject: [PATCH 02/80] [update] console.py --- console.py | 1 + 1 file changed, 1 insertion(+) diff --git a/console.py b/console.py index 2c9c4abf01d9..588aef2c677d 100755 --- a/console.py +++ b/console.py @@ -129,6 +129,7 @@ def do_create(self, args): key, value = key_value if value.startswith('"') and value.endswith('"'): value = value.strip('"').replace('_', ' ') + value = value.replace("\\", '"') else: try: value = int(value) From 2a5c0ac58461eaefe501f554cee2fc15f308b0ea Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 26 Jun 2024 11:43:29 +0530 Subject: [PATCH 03/80] [update] console.py --- console.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/console.py b/console.py index 588aef2c677d..a742ed487144 100755 --- a/console.py +++ b/console.py @@ -116,29 +116,30 @@ def emptyline(self): def do_create(self, args): """ Create an object of any class""" - arr = args.split(' ') - if not arr[0]: + if not args: print("** class name missing **") return - elif arr[0] not in HBNBCommand.classes: + arr = args.split(' ') + if arr[0] not in HBNBCommand.classes: print("** class doesn't exist **") return - kwargs = {} - for arg in arr[1:]: - key_value = arg.split("=") - key, value = key_value - if value.startswith('"') and value.endswith('"'): - value = value.strip('"').replace('_', ' ') - value = value.replace("\\", '"') - else: - try: - value = int(value) - except ValueError: + if len(arr) > 1: + kwargs = {} + for arg in arr[1:]: + key_value = arg.split("=") + key, value = key_value + if value.startswith('"') and value.endswith('"'): + value = value.strip('"').replace('_', ' ') + value = value.replace("\\", '"') + else: try: - value = float(value) + value = int(value) except ValueError: - pass - kwargs[key] = value + try: + value = float(value) + except ValueError: + pass + kwargs[key] = value new_instance = HBNBCommand.classes[arr[0]]() new_instance.__dict__.update(kwargs) storage.save() From 2403142fea211f702d34cb250eec25383afb1a2e Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 26 Jun 2024 11:47:10 +0530 Subject: [PATCH 04/80] [update] console.py --- console.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/console.py b/console.py index a742ed487144..eb790a39f1cc 100755 --- a/console.py +++ b/console.py @@ -123,23 +123,22 @@ def do_create(self, args): if arr[0] not in HBNBCommand.classes: print("** class doesn't exist **") return - if len(arr) > 1: - kwargs = {} - for arg in arr[1:]: - key_value = arg.split("=") - key, value = key_value - if value.startswith('"') and value.endswith('"'): - value = value.strip('"').replace('_', ' ') - value = value.replace("\\", '"') - else: + kwargs = {} + for arg in arr[1:]: + key_value = arg.split("=") + key, value = key_value + if value.startswith('"') and value.endswith('"'): + value = value.strip('"').replace('_', ' ') + value = value.replace("\\", '"') + else: + try: + value = int(value) + except ValueError: try: - value = int(value) + value = float(value) except ValueError: - try: - value = float(value) - except ValueError: - pass - kwargs[key] = value + pass + kwargs[key] = value new_instance = HBNBCommand.classes[arr[0]]() new_instance.__dict__.update(kwargs) storage.save() From de11ae10437c86b4d586bffd42174408521dafa5 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 26 Jun 2024 12:10:55 +0530 Subject: [PATCH 05/80] [add] setup_mysql_dev --- setup_mysql_dev.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 setup_mysql_dev.sql diff --git a/setup_mysql_dev.sql b/setup_mysql_dev.sql new file mode 100644 index 000000000000..8d582f694ab2 --- /dev/null +++ b/setup_mysql_dev.sql @@ -0,0 +1,5 @@ +-- MySQL setup developement +CREATE DATABASE IF NOT EXISTS `hbnb_dev_db`; +CREATE USER IF NOT EXISTS 'hbnb_dev'@'localhost' IDENTIFIED BY 'hbnb_dev_pwd'; +GRANT ALL PRIVILEGES ON `hbnb_dev_db`.* TO 'hbnb_dev'@'localhost'; +GRANT SELECT ON `performance_schema`.* TO 'hbnb_dev'@'localhost'; From 69618c1cef2557cf9e86a80d4f3b0109b0ed1c43 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 26 Jun 2024 12:16:18 +0530 Subject: [PATCH 06/80] [add] setup_mysql_test --- setup_mysql_test.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 setup_mysql_test.sql diff --git a/setup_mysql_test.sql b/setup_mysql_test.sql new file mode 100644 index 000000000000..23d2c0707a60 --- /dev/null +++ b/setup_mysql_test.sql @@ -0,0 +1,6 @@ +-- MySQL setup developement for test +CREATE DATABASE IF NOT EXISTS `hbnb_test_db`; +CREATE USER IF NOT EXISTS 'hbnb_test'@'localhost' IDENTIFIED BY 'hbnb_test_pwd'; +GRANT ALL PRIVILEGES ON `hbnb_dev_test`.* TO 'hbnb_test'@'localhost'; +GRANT SELECT ON `performance_schema`.* TO 'hbnb_test'@'localhost'; + From 8a890f4bff4ba01187a38e618b210a7656cd5981 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 26 Jun 2024 12:19:36 +0530 Subject: [PATCH 07/80] [add] setup_mysql_test --- setup_mysql_test.sql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup_mysql_test.sql b/setup_mysql_test.sql index 23d2c0707a60..edafe4be30eb 100644 --- a/setup_mysql_test.sql +++ b/setup_mysql_test.sql @@ -1,6 +1,5 @@ -- MySQL setup developement for test CREATE DATABASE IF NOT EXISTS `hbnb_test_db`; CREATE USER IF NOT EXISTS 'hbnb_test'@'localhost' IDENTIFIED BY 'hbnb_test_pwd'; -GRANT ALL PRIVILEGES ON `hbnb_dev_test`.* TO 'hbnb_test'@'localhost'; +GRANT ALL PRIVILEGES ON `hbnb_test_db`.* TO 'hbnb_test'@'localhost'; GRANT SELECT ON `performance_schema`.* TO 'hbnb_test'@'localhost'; - From 31a6e76ad2723145cf2e8c182c1c0333a30f7f1a Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 26 Jun 2024 13:05:58 +0530 Subject: [PATCH 08/80] [update] fileStorage engine --- models/engine/file_storage.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 6f5d7f8d4680..1ef21c0910ce 100644 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -8,9 +8,17 @@ class FileStorage: __file_path = 'file.json' __objects = {} - def all(self): + def all(self, cls=None): """Returns a dictionary of models currently in storage""" - return FileStorage.__objects + if cls: + new_dict = {} + for key, value in self.__objects.items(): + if isinstance(value, cls): + new_dict[key] = value + + return new_dict + else: + return FileStorage.__objects def new(self, obj): """Adds new object to storage dictionary""" @@ -45,6 +53,19 @@ def reload(self): with open(FileStorage.__file_path, 'r') as f: temp = json.load(f) for key, val in temp.items(): - self.all()[key] = classes[val['__class__']](**val) + self.all()[key] = classes[val['__class__']](**val) except FileNotFoundError: pass + + def delete(self, obj=None): + """ delete object """ + if obj is not None: + for key, value in self.__objects.items(): + flag = False + if value == obj: + flag = True + wanted_key = key + break + if flag: + del self.__objects[wanted_key] + self.save() From 75e0e79330ecba9f666f3ba59a62982eae4cba66 Mon Sep 17 00:00:00 2001 From: Ezekiel8807 Date: Wed, 26 Jun 2024 02:17:19 -0700 Subject: [PATCH 09/80] add my name to authors --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 6fb53b5277cf..7caa80837b2c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2,3 +2,4 @@ Ezra Nobrega Justin Majetich +Ayebidun Ezekiel , From a9fca9dabc131344084757bed41a1c92a3348ea0 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 27 Jun 2024 11:44:03 +0530 Subject: [PATCH 10/80] [some update]' --- console.py | 8 ++++---- models/__pycache__/__init__.cpython-310.pyc | Bin 345 -> 361 bytes models/__pycache__/amenity.cpython-310.pyc | Bin 444 -> 460 bytes models/__pycache__/base_model.cpython-310.pyc | Bin 1855 -> 1871 bytes models/__pycache__/city.cpython-310.pyc | Bin 510 -> 526 bytes models/__pycache__/place.cpython-310.pyc | Bin 668 -> 684 bytes models/__pycache__/review.cpython-310.pyc | Bin 532 -> 548 bytes models/__pycache__/state.cpython-310.pyc | Bin 466 -> 482 bytes models/__pycache__/user.cpython-310.pyc | Bin 551 -> 567 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 183 -> 199 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 2130 -> 2547 bytes 11 files changed, 4 insertions(+), 4 deletions(-) diff --git a/console.py b/console.py index eb790a39f1cc..327ce379be27 100755 --- a/console.py +++ b/console.py @@ -74,7 +74,7 @@ def precmd(self, line): pline = pline[2].strip() # pline is now str if pline: # check for *args or **kwargs - if pline[0] is '{' and pline[-1] is '}'\ + if pline[0] == '{' and pline[-1] == '}'\ and type(eval(pline)) is dict: _args = pline else: @@ -290,7 +290,7 @@ def do_update(self, args): args.append(v) else: # isolate args args = args[2] - if args and args[0] is '\"': # check for quoted arg + if args and args[0] == '\"': # check for quoted arg second_quote = args.find('\"', 1) att_name = args[1:second_quote] args = args[second_quote + 1:] @@ -298,10 +298,10 @@ def do_update(self, args): args = args.partition(' ') # if att_name was not quoted arg - if not att_name and args[0] is not ' ': + if not att_name and args[0] != ' ': att_name = args[0] # check for quoted val arg - if args[2] and args[2][0] is '\"': + if args[2] and args[2][0] == '\"': att_val = args[2][1:args[2].find('\"', 1)] # if att_val was not quoted arg diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc index f3aa34fc302ba50bf830424ad2ec109ccac9c7de..aebf0f8c435a12fdfd9b4c34ed63b2b7602ea5c4 100644 GIT binary patch delta 28 icmcb~^pc4?pO=@50SJ~b)K28S&zL;%wc}(NMq2=GkO&U| delta 28 icmaFKbd!lYpO=@50SM+>RZir-&lo)Mwc}(PMqL1LEeJpW diff --git a/models/__pycache__/amenity.cpython-310.pyc b/models/__pycache__/amenity.cpython-310.pyc index 8c653705512bba16b157b382c6fb34b537a1973b..40bbc0ca0acc62acdf8d2a581a19b2fbab061c01 100644 GIT binary patch delta 28 icmdnPe1@4jpO=@50SJ~b)K297$e1+ouj6Dr#y$XQMF?F0 delta 28 icmX@ZyoZ@PpO=@50SM+>RZiso$QU&7uj6Dt#yS9O;s}la diff --git a/models/__pycache__/base_model.cpython-310.pyc b/models/__pycache__/base_model.cpython-310.pyc index a9a87d491aa0863b7ea9127ff11c15a7aff00112..bd275d3ba4221b3ba8154e4f3f0a387dfaf57220 100644 GIT binary patch delta 31 lcmdnbcb<Rc_=y$jBHl`7ER3WI3ij0B_6(^#A|> diff --git a/models/__pycache__/review.cpython-310.pyc b/models/__pycache__/review.cpython-310.pyc index 028b89af5149439b62b77901ace3f771e16efcc2..51e5224363a9f17ac46136a0d3286b71ebee7453 100644 GIT binary patch delta 30 kcmbQjvV?^@pO=@50SJ~b)NbVVU}Q|39Kz^0xs|aW0AptdH~;_u delta 30 kcmZ3&GKGaZpO=@50SM+>Rc_?=U}OxO9Kz^0c`0K(0A^MPX#fBK diff --git a/models/__pycache__/state.cpython-310.pyc b/models/__pycache__/state.cpython-310.pyc index 1d2678752862e980b0d9dc79d2fd105fcfb6d9a1..2dc62426ddcb3566cb7249fd67f35de091436c9a 100644 GIT binary patch delta 30 kcmcb_{D_%5pO=@50SJ~b)NbVFW@Jp5EY9dS*@LkQ0Bi3C^#A|> delta 30 kcmaFFe2JMmpO=@50SF#msNBfS&Bz!qS)9>vat31+0DPba{r~^~ diff --git a/models/__pycache__/user.cpython-310.pyc b/models/__pycache__/user.cpython-310.pyc index a67ab21fecc1ca40ab25391ef96a2cc57db32cc7..a3d7d8e81f1fc784761d11c2ab7e65141ebffb7b 100644 GIT binary patch delta 30 kcmZ3^vYmxHpO=@50SJ~b)NbUCW@Lh($ delta 30 kcmdnavYdrGpO=@50SM+>Rc_>tW@PlAoX+Stc?V-X0Bke|#sB~S diff --git a/models/engine/__pycache__/__init__.cpython-310.pyc b/models/engine/__pycache__/__init__.cpython-310.pyc index e040611b65112ca116a8e72b3e412203a32a117e..2c827144297f4260384ff0de83fdc73a2385565b 100644 GIT binary patch delta 27 hcmdnac$|?tpO=@50SJ~b)K28KVa%H7;W)9<4ggo52IT+% delta 27 hcmX@kxSf$ZpO=@50SM+>RZir#VT_vS;W%-o9spVU2NnPT diff --git a/models/engine/__pycache__/file_storage.cpython-310.pyc b/models/engine/__pycache__/file_storage.cpython-310.pyc index 49fac4ceacb1651e99b6df2e09b969d7b86f568f..8eeae054197c6d9837912cd427201a43218b79df 100644 GIT binary patch delta 1213 zcma)5%}*3D6mL77-PuoIQ4kSalo;nAG4X&gXfz-i4{PG;Wuw`Q+d>A08Ej`EklCz> z`~y0kJZa)Zul^Z&^4NdEgC-_M6W^N!{D=o<(qG%x_tE!zuOEj$k5;2frAXj=O?oR+ zg{RdQO$&BcVdy0QNm^8p78A5(3D)91Y1yJGxUlzVD<^Uyzeiem;fMmvjwp%}%mvUW ziwbBIh1DeP(9=(M?ln3L{2hEYEI5os82TbWLe+#%dMqJpIB+2q19zDbov#hUmNQOk zv`8Jw9&?t?v*)yueqfW+IXE;Hgw3o5P|jrFd_1+SFSpTNA+-wARwH=I*K`ybF1j0= zuB|dBbj5JE^rkAHf(4iP+a=fDmYjTdi@&AkrqR_&ggU|u!YPE)2(ti&DpiHKp-SmY zZlaGCrnC_W8R)sLmMSwh<$cL!-~mZ>R5}m=ak0!?AKG>NcqfZvs{3}{h73`NaZP1k zsN|L}x3g=gF*pG7`+(!PJcf!qh&(aiqk{VptYRaIm!obdt}7KOx02DK{v*+RC-AhE zT1}$=;|R#1I)Q-2L>M9}t4mHvj6Iv)$lvV$(U@2TEYl(keHS31f_AAo^IKyMLt{c~ z3fAL^mC$vjCImEU!g@9(A%*tj>MZIf_GOZgm+TdxM9}8paQW^~9ZDc$S&#Zzx7HiW zcU|kZ4w-`3Zf=nND69wB;9E6(CGb{FaoY=HDcaDrhxr|(H}Jgx${Lw)SdDUMTb}*w z2j>ngQ~s6bcWcXIzn;$Az|N%&x0F81&-JrfAsq?}q>doq#ngF(3kV0)?yr#E?3E#r wx(48oLD(X5$_{r5)nkKKXsLPB#ZJfs|L}C27-s>xsT;^E6#b!7Or&Q01n2$%aR2}S delta 813 zcmah{J&P1U5S{+mnb}WoZ}HC4I~5ZdI1a;O5m5{@I#9DwT;`^GVb`U z^B5x&K`_wNf8Z|=%^Lg_8fjv`-c=6~?4e)PR9C&K>gun(Pivi`-EMexz3MN9Z~T+a z%RAKm-LzZpTaaE%gcnmmVkT(JGcT?QCiqh?_C-zjRt6#vp_QSii-whT(R|=Vt&<=3 zucX9M{94elZ`-YX3#B(A)oarCsY1@`3)$>O#BeS1;agADtnK^bYMN3KDNRro1Cgbrp_z!N;y7c);mAcV0jUg|$fGmWbN1~Xx>XFeT2{)jR!!)9 zq>G8+Vm6*ewIvN18g3n?hCPuB!{$l;H!0W2T=w37=I_YydC*<}Yy)-x7Xg<5mn|5g zRA}Xaqlq?5cU%aW>%GH7%YoAsSWI(epJ}NarD?4!(>zI~OYqyIOM4A!XK*?&&B}#K zZaS;LWGp8zq8QU&8I_!8^2pVu*6e|sg6cx+!H?%fBGfwmgX&?h^$54?O8ifwL7FF8 zORY8#a2Bu$I0wL3PYuRb5^1)pkHKAb5H+gZ`rfgt0W(qy`w333s~i9T From 1e39683a51fc9bd741e2ec868e44a60b0e487523 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 27 Jun 2024 17:49:14 +0530 Subject: [PATCH 11/80] [update] on task 6 --- console.py | 45 +++++++++- file.json | 2 +- models/__init__.py | 11 ++- models/__pycache__/__init__.cpython-310.pyc | Bin 361 -> 502 bytes models/__pycache__/base_model.cpython-310.pyc | Bin 1871 -> 2818 bytes models/__pycache__/city.cpython-310.pyc | Bin 526 -> 840 bytes models/__pycache__/state.cpython-310.pyc | Bin 482 -> 1195 bytes models/base_model.py | 41 ++++++++- models/city.py | 16 +++- .../__pycache__/db_storage.cpython-310.pyc | Bin 0 -> 2835 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 2547 -> 2848 bytes models/engine/db_storage.py | 79 ++++++++++++++++++ models/engine/file_storage.py | 22 ++++- models/state.py | 25 +++++- 14 files changed, 221 insertions(+), 20 deletions(-) create mode 100644 models/engine/__pycache__/db_storage.cpython-310.pyc create mode 100644 models/engine/db_storage.py diff --git a/console.py b/console.py index 327ce379be27..e63fd70c31e3 100755 --- a/console.py +++ b/console.py @@ -116,12 +116,15 @@ def emptyline(self): def do_create(self, args): """ Create an object of any class""" + import os + from models.engine.db_storage import DBStorage + from models.engine.file_storage import FileStorage if not args: - print("** class name missing **") + print(" class name missing ") return arr = args.split(' ') if arr[0] not in HBNBCommand.classes: - print("** class doesn't exist **") + print(" class doesn't exist ") return kwargs = {} for arg in arr[1:]: @@ -141,7 +144,15 @@ def do_create(self, args): kwargs[key] = value new_instance = HBNBCommand.classes[arr[0]]() new_instance.__dict__.update(kwargs) + if os.getenv('HBNB_TYPE_STORAGE') == 'db': + storage = DBStorage() + storage.reload() + else: + storage = FileStorage() + + storage.new(new_instance) storage.save() + print(new_instance.id) def help_create(self): @@ -224,15 +235,41 @@ def do_all(self, args): if args not in HBNBCommand.classes: print("** class doesn't exist **") return - for k, v in storage._FileStorage__objects.items(): + cls = HBNBCommand.classes.get(args) + for k, v in storage.all(cls).items(): if k.split('.')[0] == args: print_list.append(str(v)) else: - for k, v in storage._FileStorage__objects.items(): + for k, v in storage.all().items(): print_list.append(str(v)) print(print_list) + # def do_all(self, args): + # """ Shows all objects, or all objects of a class""" + # import os + # from models.engine.db_storage import DBStorage + # from models.engine.file_storage import FileStorage + + # print_list = [] + # args = args.split(' ')[0] # remove possible trailing args + # if args not in HBNBCommand.classes: + # print(" class doesn't exist ") + # return + # if os.getenv('HBNB_TYPE_STORAGE') != 'db': + # storage = FileStorage() + # _dict = storage.all(args) + # else: + # storage = DBStorage() + # # ensure table are created and session are ready + # storage.reload() + # _dict = storage.all(args) + + # for _, v in _dict.items(): + # print_list.append(str(v)) + + # print(print_list) + def help_all(self): """ Help information for the all command """ print("Shows all objects, or all of a class") diff --git a/file.json b/file.json index 2e5d2a85d0e3..f08dc6f5178a 100644 --- a/file.json +++ b/file.json @@ -1 +1 @@ -{"Place.d636f410-16a7-4d37-80f6-f7d6a788b58f": {"id": "d636f410-16a7-4d37-80f6-f7d6a788b58f", "created_at": "2024-06-26T11:21:21.231381", "updated_at": "2024-06-26T11:21:21.231424", "city_id": "0001", "user_id": "0001", "name": "My little house", "number_rooms": "4", "number_bathrooms": "2", "max_guest": "10", "price_by_night": "300", "latitude": "37.773972", "longitude": "-122.431297", "__class__": "Place"}, "Place.715e9ede-9490-4a7b-a74f-b5341dbd8b49": {"id": "715e9ede-9490-4a7b-a74f-b5341dbd8b49", "created_at": "2024-06-26T11:23:37.238801", "updated_at": "2024-06-26T11:23:37.238819", "city_id": "0001", "user_id": "0001", "name": "My little house", "number_rooms": 4, "number_bathrooms": 2, "max_guest": 10, "price_by_night": 300, "latitude": 37.773972, "longitude": -122.431297, "__class__": "Place"}} \ No newline at end of file +{"Place.d636f410-16a7-4d37-80f6-f7d6a788b58f": {"id": "d636f410-16a7-4d37-80f6-f7d6a788b58f", "created_at": "2024-06-26T11:21:21.231381", "updated_at": "2024-06-26T11:21:21.231424", "city_id": "0001", "user_id": "0001", "name": "My little house", "number_rooms": "4", "number_bathrooms": "2", "max_guest": "10", "price_by_night": "300", "latitude": "37.773972", "longitude": "-122.431297", "__class__": "Place"}, "Place.715e9ede-9490-4a7b-a74f-b5341dbd8b49": {"id": "715e9ede-9490-4a7b-a74f-b5341dbd8b49", "created_at": "2024-06-26T11:23:37.238801", "updated_at": "2024-06-26T11:23:37.238819", "city_id": "0001", "user_id": "0001", "name": "My little house", "number_rooms": 4, "number_bathrooms": 2, "max_guest": 10, "price_by_night": 300, "latitude": 37.773972, "longitude": -122.431297, "__class__": "Place"}, "State.139b2ce1-9d85-4f58-8227-8c94f454143c": {"id": "139b2ce1-9d85-4f58-8227-8c94f454143c", "created_at": "2024-06-27T17:24:13.627118", "updated_at": "2024-06-27T17:24:13.627125", "__class__": "State"}} \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index d3765c2bc603..a14e402255d9 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,7 +1,12 @@ #!/usr/bin/python3 """This module instantiates an object of class FileStorage""" from models.engine.file_storage import FileStorage +from models.engine.db_storage import DBStorage +import os - -storage = FileStorage() -storage.reload() +if os.getenv('HBNB_TYPE_STORAGE') == 'db': + storage = DBStorage() + storage.reload() +else: + storage = FileStorage() + storage.reload() diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc index aebf0f8c435a12fdfd9b4c34ed63b2b7602ea5c4..3e866b10b03b9866e10051ef025bc853d2cce7a4 100644 GIT binary patch delta 281 zcmaFK^o_YbpO=@50SGp-)u#C~GB7*_agYHskmCTv#bH1qg&~R|g)xOGhcTBaiir`# zX3k;GWr<<|vsrRjqgYc}7qF$UE@Vt$%VsK4N@Zzgh+ZK&b7ellaft-7bDZls@TY73qYF^nbcBsrPwxZOW{KS-%3`M*^ dHATD=pOuRV0a+}JJV407$j8J6q}iBw7y%y#LVW-L delta 140 zcmeyy{E{gspO=@50SJ~b)TXTm(vLwLWWWUEH~?|65|Bt?h+;@#Okv7l%w>vVVq{2V zYG#OHPGw%evXFt1A%!`ZL6c=-n=iAUChNps+LG+WCHX~(>8ZEaic)j(6H`_)6tM$M XDPo_T$ymTyL#2zD-y-czaurPvPqYYMCuh#}*Ij|H1rfm#H>?SqZ zd1!lvl0}mz`IT6DW%h^D@`Km{vw3dhHn(Cfvc2)KFRd=zx++ukC`{i_S zXNj@@Q0MyNpz{!|979OfW0Fge@*c=J))p(Q9NuFUXp` zrX3e)tJhMk*^>0yUFrSH>G>FGNJj;;=A20%BdwbwvLS;XSZ_%-Wee}NT#{|Pm*ukT;N6k8 zN!4P(Md2{|zw_7yK4Fnp`Lo8HK?@dI zQ#SS(daa3&&Ki^MT#&YPIp!_Kye*_>B2Jk8Gc5cESZlU4XCJX|Ti=MOJN2segiYLu zcaC+R-Jh_dLbePCLBtu8D~GXjc0wkX=|-ZFljSp6FQ(>P_N zjXN48(s(34G$N5&*iU(Js^5U7U#D&W%VXl7@sdhqC7e<47Sllmne;2b->=>3`o=9) zIxudmho$kK0_?-`VnOVg@lN7&q^{VZZ`l>1D9IE2&+pJHLkL&2d55>C3BiLGwG4#M zS1`81$Eyn@ZCp-%2>=ub0pJl@c@Lsu6}I}EpYs_gjfy7L7&Hf(yT+zmdNXGNiz64! zn>*MTf4upHszy4eEkP1M)=;ZstxA<60ZD<9H3+Lih2n+%%lpdkjpr}${KP-7J2!5B z{r&XY@Xq(sZiwdVx8R9!tFvPyvpi0d%J`^*SzPJ2@kRe00=Ql$E2p29zf4pkir_~S zZNk73Jrt{aeEWJX?Drd~a4^B9;!jW(JOBbKF>@^P-3gz06Go_n=Fb_>Nl9?W5B_N( zSB6*63r~~kFzk=CMkYeSMtFLt@dC;$7+1+kKzlpbngGHKthq@MI z4j>Qg#3$+^{@Q9$MlDeEhp?ws1`uu00z%q++_{RM{@_ONR19qJhfosiH39_LkAMOj zED}QH-~t`41T~5BGZ&->F4kC5TLKr9m=J?%5 zMSh}mbuBGCK-y_RL~p9stU{HzrwtH1%epp^S8PGq9ZyyfbPD8vq=1m;^9?hA!NFpO- z)+oF{;`_Ksq^iOV;sSY>X$c3q$UsqBBg2pPcX2KFO|*bT6cq<_vX=T?I8{@PVAS<2 z)$|=2?LruLkj6vPI*oCakaWuYGEaW(!4nvlR7Y2Z3kbUQC;sQU0rh?!uPoNys3+`p zS2S*HOw-ju(?M-OW?A&3NYja}38b}W4brH7)%381_z%>jGG-~D|3Vs_kJsF@RH1UJ zS0HYqmG48)RUqI3KmTXffxPw(++a2Ef=0V-=X5*z0nPs{340Q}Sw2hSw123wvkmoK zg;*B1FHIY5T2}^j7zBYj77D|N0;j+bTb7^L`-olV*PJ%N7EUKz7XL=@uMr5p+xWeK LcgH~!tM2~+D<7l+ delta 943 zcmZuv&2G~`5Z+y{*W3J9Z9sw2Qk5za1k|bzQ2xq+a-aoO9LU9rvJP^a#L=uvRpe3$ z`T~_-AeFd)5E55T+&OUHmnk#p4=7cI|-P1aOLpI$ucQ0$*e;Ku_ryNnRC7B{RV3@4894p~c{=4tsx znE=0)(Pjeoz?3j&x%e&?7djld=S$)X*#??@i;xRDU)=YWR&#Gu%GojJ%mkY(Q=@W@ zHKwuCV?l2#=RW_!=dU2$sJkp@Ta{6@_~Ai0bgG}4xM#sH)@0*JfHgoNIByW|I&Cu; zW=TJGI*Lrv$)d=qouO%GaZ@^J<6hUvHoUS7WgJ|EQ9sfBDOb)B$|Ta zb6lN-BIJ_4nObez_$mDfOJ~9B*zqB69FV3a?L-k=r55H1=&H~l_^rXk5WvF&>eN;c tG?QF&J*oYQ8lN;J+#+U~V5~94|1Xi#EB&-?c6#wWlE{*Fl&r#Q-Y*LrwD14` diff --git a/models/__pycache__/city.cpython-310.pyc b/models/__pycache__/city.cpython-310.pyc index 8cab1bbae138373c0b721e548789dd8c352c372e..71362d78113903d5db6fe8da438920ab9440acaa 100644 GIT binary patch literal 840 zcmZWoO>fjN5VaHMv)ig5RJeeALRzWXl{i<3ZlQdM3Tb=F#Y*F88?c?NodvcM5>mPH zL-G-rb2BG6-roOw`Y<5mhX*%Dgy0EI_X-zD3L>ct z6xBfy=&%T>$Dv|6Dk2>hu}+Gl=a@=$R%DbsCo+=pS0ZBwAiQElE|V!4rk4-+LESF+ zn?}wR@YBZf7n7q2pV{UeR4rd(Ju(csY*ISFAW$9i<}mEygGSA@>EdZ?Yjf7+hmD2$ z%)ExhkahzLs%-1Vxbu2e`7AfbKRt)Y0x2kJ3M4H;859g6h-G+1C6m#&ph$WgUr|V9 za?OTC2DwaSATx~EkU47E=$Mysxyz5wfmdEtrAp^^dDWPo=S9SsLvDuhob zM3)Pp`(C0w5aME9s%uXoglsCLH-%_@g%xiZ*0H`J9rKKhy_xoPMJ;XOVbsI##NPG6 ze)%cJ+O%Ui-dCT*v^i}*mKOLkb5W$7)t&3F30<|otTNJRAWGVc=R8}bAxhY z-?`CjVNm6F^yf%fyD> znY#;Bs_Go{Vy$?kb!+V!HCFeE`^;;#E9;(5lu{+58ufiy)^@}#V$=Eiu#bU|uW zo=GK`C+n>amQ)t64+m%5?VMIATy8Yf*HHc|2AczEf)>a#e2p^n#tSe|3m<9E`ABF{ z7VQVmCN6EOZCKrECwEm7-YE{Dj>GoQgxX>)vZF(DBrNPW=If%An2+6Fle47R8nIUW f9u4mO)2~&gz3C_m+%dlH>u{3ertB^};(hxAYLGTZ diff --git a/models/__pycache__/state.cpython-310.pyc b/models/__pycache__/state.cpython-310.pyc index 2dc62426ddcb3566cb7249fd67f35de091436c9a..8a615143657bf398291871377463b27ae8b91385 100644 GIT binary patch literal 1195 zcmZWp&2HQ_5GE-~tNnG8gD-7R6(|ZUPgD355cBh9NgkEVtQTYI2L`lsWmDT%jD$7b@o~#)J$ztS zXlZTc6C1eN4{z|&BgB{1E3M^RgXagOyYg|nzwS$|zs-;;xWIEXm&LhQHp>-~1M545 zw1rgQAB9YblV4sQirLAFpZA{~dZy+D-6G0S59J!nboZ9Jt6QY>~PcvLR_q*e%R>vVVq|b< zNMTN4X<4Q9|}o7ko9z<7((DX}=!H$NpcCmE;{1uz164nSNi0whuy zq8NeZGNmvA^)p4Wq%Z@`V40lAD9*y*r^z}womr2MB`+~IbtOX)$f-qKldmwP$`vsK z*=!&~Km-Q^3nK?3SjWHa^HWN5Qtd#F0PAI8l3Y@>Y_w^b)YBvnAsUED0~CepCYB<*DG)1(sWb?YVzJyANh|M# zo>@r|v3!!zH~)epfb^KZG_QRq`qCd@piR!1r6|ft9=eM;duDbn-#PQ0GgEfEZ3~`% z?aud}f%Z?VtUfkW?mkE4o~b*TKlcA(ahH2f zE$*GsaloCCHSlK-*mhjSlUNC+s#3=Lg6)-(#i^VW6E>CQp-8Isfslfo2$sYJQ$n!n zK(IXCPZL(|v5y};Z2uduSOcoNi4<`qB2nz8h0wu6QN_3b{0fy&DlLmVek`Q!sid3= z9xWPo5}aW5S(^C~vt&GWNO81850&i?`w1fhQ??_3Zb zKBjWBa?Y%|Tf2vDZ5`UY`-~6^YTi|i_eK_$!P@L4*rlaqNm-~$9wlHk(`z4Y?QBI4 zzZiY`QS{m9{v+L6Y53&x?Q0!A{CKphyDJ^Gw`TqPR6WUlXC$B884jP5JI~3znRn;i zci;ZQaCbm-cUqQNG?gNnrp3Mv%mnv${-&Kus0unbleFMF17FipX>VUtqBxcm9H`f$ z<@Q7iB1vR}_NCa%fQ~xgvYbY7mJK}ZD3R@H=STsm?CA;D&OxavP5DFzIk1ld`@XZ} zD=@+HY?v3-kPkPrucA@8SDnN_>-&bPLIO)`|1q+4|Drjmtp^ z`r`8Gf#O3kEc*{ACg!aixV4CPi2ZpJ`wqtb+%fHL=H>p}HM*Atd28O}13zo$ow-k} z)S3r1t^L}qz1prF9(?1?TQ!jnfm7jmw+1Gk_b#k?yKZk=fA7ybb?0#Hun$~qfp!Df zYR|*EQwMc;*Lw1&;*Gj>zJ6gr-`ii(c{uMb=IQ=l^F&WRt!~!A8S*;-Hn(T5vL{DE zp0cuF$&r+zs31xq7nzj8B!(oC>NB7LeBDp7I1!+DkHm2*PVm|%;e=`@bE2z4o z3UbxJleb~Cd;`U6C|*awQ2Z8zCL4oWy3_3R2J+1G*WsdNic6X9y1QtSX3=K!<-i2i zG}G(eqF3AiG0QDyQwYgm(KlD)U}33tjT^KLDq^v4eNwPDb@+}ww&g1+$YP=#5=nGb88{BXg z+7+(Wr>l72&$aZAyu)4w4@PN&=fYZ|VNAuxaB?2R1s*L8q^Xc_)&PmKQ?`WVC1swc zkQ*Ch*If&F4yL&WD;QKgI_q6|34i^_O-ooWBP=+Rj)?4BhqrLpuNWjTNWkc`H)VM; zV0*I6(REkYnjR9}@`Af0g4%|n@GJ~yk2v4Y`d8qZk=MM2JLp0&Uc((&rZWt9a!Ai@ z01C$>u`0L1Sbzd~0Pf(XH9fjJUFy6U;6+kos0Lisk%+l~;{QHF6I zMi7&6wupK^ig=ksQ3DMD$={&BfRukm@ji-sC?24=VwcfO^y2>E-BaBH5m*kvH=ylq zzyhc3gs#LMgO)_(x(!!=I7<#hernF`=8W!LwQiI$ZyaP?bpr;O34UsA9o%g!dk-T@ NAqt1|ZA=X7_74`-#TNho literal 0 HcmV?d00001 diff --git a/models/engine/__pycache__/file_storage.cpython-310.pyc b/models/engine/__pycache__/file_storage.cpython-310.pyc index 8eeae054197c6d9837912cd427201a43218b79df..350d75d503d67f45f61d1b81e2ab8a2549119f6c 100644 GIT binary patch delta 1259 zcma)5TWi!n6wV}*%kE~kH!T)wyA`F4m3pZ+N-ao5@Iouy3WAoBZf0w?lihWaZ7C%5 z!Dm6qqdv4g2z~a^KOyvOz#k#{q%Y2yY`3z$n2>KiGH1T?<(!irL;J&}X0e!8#I?Md z)TRpWO20?uS6}*Jxk}wIEC+7G-6Uc8zE4Rd9Yc5aY!PdUXHh)iM*$x4RH_6hQ4w&B zs)3ehl4FVkJ;9Re)CkN(m)xLMkV_27O_~o1iHQ_nNvv3n%~+3(Sc|b|eK3+-jM$Rg zQR?=7@j$tGPgxs!p(gpH5a;$wF*-mAiu&ThYZRj`l|70Ju@&d%l~=c8tD;2xb-SWC zx%3mdvB!|Gdx$uG8WJW}{RwreL=aq=hYh0_+Ff-kC`ImF}5N!`bB*|Hv!5Dx8 z0@e2%m5soj*4(JGaltYu%Xh-bWcpV7xqKcrP6G@BT!39%51S2+y>`%Y^h^ZR#5a?m z#m+*2CJgsV;?UhD)1QxU3+*utv~++XKn|b)0JH3v>>6;{VOgx6HbaLwV(gq)mt-Di zm=AP%wBd$iUGhw&uPfCL4D=qbQ$VHaATT*WL%`%14FH2A>>>cPkxc_!62LKSx?Wa| ziS)TS@(il@ACB25#9an}4$4ZgE5Le+Z!iKWuBTtkqotG5UlpNZ?q#;guE3aJ9M`D3 z$@4pIBO>0q7@2=0#jijj@;Lo&`Lps$5tz79$ jHr5(jfIz57R-oP^VuM@rq7iLM7T{M8q4XG8Xi)nDwPz9P delta 940 zcma)4zi-n(6!x9Zj^o4;X-m@IO-mOq2&qD?P(VUu0tpZ;TT$gY7jST#aOb3|NJ1_su= zl13e$3L9hQ;G`!iU=>i+K4{U*>(;L)NGD7L{7+HGDC@~VqF86tANp27Lb{5jygw9W zOfW&xEG3h{n6G?2w1?!}CyG6nT)=5Pjf0S*agc&SjO<708Jwm2eV!Di{fv(ze(IOR zI*QmpXd!GOY$4o0*alEUh#H)awE(}N>it27$MWV$Ao;Pj&ozyzOamiOqB&J{>KURY z-Qm&&+eo?YcUc#LINe;;rgcG~Sc_5K)G4%ftxYsgC0#~rA}j(Z77v0>Fow Sa~#F|9)T~3qhZ7$bLL-C(ARtb diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py new file mode 100644 index 000000000000..9f3d399ae2fb --- /dev/null +++ b/models/engine/db_storage.py @@ -0,0 +1,79 @@ +#!/usr/bin/python3 +""" Database storage for airbnb project +here we can see the magic of ORM +""" +from sqlalchemy import create_engine, MetaData +from sqlalchemy.orm import sessionmaker, scoped_session +import os + + +class DBStorage: + """ This class manages dbstorage for airbnb project """ + __engine = None + __session = None + + def __init__(self): + """ this class constructor """ + user = os.getenv('HBNB_MYSQL_USER') + pwd = os.getenv('HBNB_MYSQL_PWD') + host = os.getenv('HBNB_MYSQL_HOST') + db = os.getenv('HBNB_MYSQL_DB') + self.__engine = create_engine(f'mysql+mysqldb://{user}:{pwd}@{host}:3306/{db}', + pool_pre_ping=True) + if os.getenv('HBNB_ENV') == 'test': + metadata = MetaData() + metadata.reflect(bind=self.__engine) + metadata.drop_all(bind=self.__engine) + + def all(self, cls=None): + """ query on current db session """ + from models.user import User + from models.place import Place + from models.review import Review + from models.city import City + from models.amenity import Amenity + from models.state import State + new_dict = {} + classes = { + 'User': User, + 'State': State, + 'City': City, + 'Amenity': Amenity, + 'Place': Place, + 'Review': Review + } + if cls: + # becouse cls is string when we passed it as arg + filter_query = self.__session.query(cls).all() + for obj in filter_query: + key = f"{obj.__class__.__name__}.{obj.id}" + new_dict[key] = obj + else: + for key, value in classes.items(): + filter_query = self.__session.query(value).all() + for obj in filter_query: + key = f"{obj.__class__.__name__}.{obj.id}" + new_dict[key] = obj + print(new_dict) + return new_dict + + def new(self, obj): + """ add obj to db session """ + self.__session.add(obj) + + def save(self): + """ save changes to db permanently """ + self.__session.commit() + + def delete(self, obj=None): + """ delete obj(row) from db """ + if obj is not None: + self.__session.delete() + + def reload(self): + """ create tables in the Database """ + from models.base_model import Base + Base.metadata.create_all(self.__engine) + SessionFactory = scoped_session(sessionmaker(bind=self.__engine, + expire_on_commit=False)) + self.__session = SessionFactory() diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 1ef21c0910ce..4bedf51f1a65 100644 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -4,16 +4,32 @@ class FileStorage: - """This class manages storage of hbnb models in JSON format""" + """This class manages FileStorage of hbnb models in JSON format""" __file_path = 'file.json' __objects = {} def all(self, cls=None): """Returns a dictionary of models currently in storage""" + from models.user import User + from models.place import Place + from models.review import Review + from models.city import City + from models.amenity import Amenity + from models.state import State + new_dict = {} + classes = { + 'User': User, + 'State': State, + 'City': City, + 'Amenity': Amenity, + 'Place': Place, + 'Review': Review + } if cls: new_dict = {} for key, value in self.__objects.items(): - if isinstance(value, cls): + cls = classes.get(cls) + if type(value) == cls: new_dict[key] = value return new_dict @@ -68,4 +84,4 @@ def delete(self, obj=None): break if flag: del self.__objects[wanted_key] - self.save() + self.save() \ No newline at end of file diff --git a/models/state.py b/models/state.py index 4263a7ceac39..fc17e4ebecbc 100644 --- a/models/state.py +++ b/models/state.py @@ -1,8 +1,27 @@ #!/usr/bin/python3 """ State Module for HBNB project """ -from models.base_model import BaseModel +from models.base_model import BaseModel, Base +from sqlalchemy import Column, String +from sqlalchemy.orm import relationship +from models import storage +import os -class State(BaseModel): +class State(BaseModel, Base): """ State class """ - name = "" \ No newline at end of file + __tablename__ = "states" + name = Column(String(128), + nullable=False) + cities = relationship("City", back_populates="state", cascade="all, delete") + + if not os.getenv('HBNB_TYPE_STORAGE') == 'db': + @property + def cities(self): + """ getter attribut for FileStorage r/n + between State and City """ + list_city = [] + for _, value in storage.__objects.items(): + if State.id == value.state_id: + list_city.append(value) + + return list_city \ No newline at end of file From c32dc400215efa9187db41f71136030e3595cc91 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 27 Jun 2024 23:41:53 +0530 Subject: [PATCH 12/80] [update] user model --- models/user.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/models/user.py b/models/user.py index 4b54a6d24120..f39a3b396d9a 100644 --- a/models/user.py +++ b/models/user.py @@ -1,11 +1,18 @@ #!/usr/bin/python3 """This module defines a class User""" -from models.base_model import BaseModel +from models.base_model import BaseModel, Base +from sqlalchemy import Column, String +from sqlalchemy.orm import relationship -class User(BaseModel): - """This class defines a user by various attributes""" - email = '' - password = '' - first_name = '' - last_name = '' +class User(BaseModel, Base): + """This class defines a user model """ + __tablename__ = 'users' + email = Column(String(128), nullable=False) + password = Column(String(128), nullable=False) + first_name = Column(String(128)) + last_name = Column(String(128)) + places = relationship('Place', back_populates='user', + cascade='all, delete') + reviews = relationship('Review', back_populates='user', + cascade='all, delete') \ No newline at end of file From e66a136ffc6368020bfd559501fc576a931d0692 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 27 Jun 2024 23:46:15 +0530 Subject: [PATCH 13/80] [update] user model --- models/user.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/models/user.py b/models/user.py index f39a3b396d9a..86204dd3039c 100644 --- a/models/user.py +++ b/models/user.py @@ -11,8 +11,4 @@ class User(BaseModel, Base): email = Column(String(128), nullable=False) password = Column(String(128), nullable=False) first_name = Column(String(128)) - last_name = Column(String(128)) - places = relationship('Place', back_populates='user', - cascade='all, delete') - reviews = relationship('Review', back_populates='user', - cascade='all, delete') \ No newline at end of file + last_name = Column(String(128)) \ No newline at end of file From b4e09da6db040681badd1ed8c0b703e7bdbc7aff Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 27 Jun 2024 23:51:34 +0530 Subject: [PATCH 14/80] [some update on tasks] --- console.py | 27 ------------------ models/__pycache__/user.cpython-310.pyc | Bin 567 -> 772 bytes .../__pycache__/db_storage.cpython-310.pyc | Bin 2835 -> 2820 bytes models/engine/db_storage.py | 2 -- 4 files changed, 29 deletions(-) diff --git a/console.py b/console.py index e63fd70c31e3..5c4b0823d69b 100755 --- a/console.py +++ b/console.py @@ -149,10 +149,8 @@ def do_create(self, args): storage.reload() else: storage = FileStorage() - storage.new(new_instance) storage.save() - print(new_instance.id) def help_create(self): @@ -245,31 +243,6 @@ def do_all(self, args): print(print_list) - # def do_all(self, args): - # """ Shows all objects, or all objects of a class""" - # import os - # from models.engine.db_storage import DBStorage - # from models.engine.file_storage import FileStorage - - # print_list = [] - # args = args.split(' ')[0] # remove possible trailing args - # if args not in HBNBCommand.classes: - # print(" class doesn't exist ") - # return - # if os.getenv('HBNB_TYPE_STORAGE') != 'db': - # storage = FileStorage() - # _dict = storage.all(args) - # else: - # storage = DBStorage() - # # ensure table are created and session are ready - # storage.reload() - # _dict = storage.all(args) - - # for _, v in _dict.items(): - # print_list.append(str(v)) - - # print(print_list) - def help_all(self): """ Help information for the all command """ print("Shows all objects, or all of a class") diff --git a/models/__pycache__/user.cpython-310.pyc b/models/__pycache__/user.cpython-310.pyc index a3d7d8e81f1fc784761d11c2ab7e65141ebffb7b..ca0f4a25771614f367a87d43a850655125efc3d4 100644 GIT binary patch literal 772 zcmZWn&2AGh5VrR}OHzRZocEebB5_8j4WeA2mlPrSV!7){v&dej_J&dHaJodbJ|w~=Y&M+@QLt&yO75?l;rFOAyj)@RGkHtpq<`mqHiy2i9_-E8Vm zc_;~jV^sGB4G>0=MI)MI2lofDk3&r`fB0Ot-CWL3)F-|) ztL|D@s9v>~xD5!S?Gxu9bhWYO1JvF8q_K;3!E0q&;2)p;hkLqi9@x${H#Wyx3RHL0 zI|)tbL;S|5eeP^p+K}>(hQiqet~ks9l#MWMe)a delta 362 zcmY*UO-jQ+6rMLTjj1$(-~ndg!nmjx5Gih4*^PCRjij9^22vyQl7fN=+6zdo;2k`J zSIE{=xDfm%-RK*>_ult@=WU`7J*$#rS3usy)A9%QE0DjUK_&nnLRpasOIDV&l9?oN zA*`}`Bdm7vRb|Q!u0$HWt&g6m8=mLvE-UNG1v>u;flUB5P)=loxzZB)Wu}1v5CJ<@ zVV>^vH9P-!GP^Ca7xQ6LJMP3ZjoTL*x1V$z zCD`SY_M6C56#%atDhUOASXb!{h@juFMIAL6Zeo zTN#BXPh;IOIgqWC(QNW@HYIUJ4n`41E=Cr1f!_j9Hq$>A=E+R#xs2wM3)saOttNM{ zPi3^5EXUCxX$`cfNCr;Gf>`!I!fEn$j_ZsLllwUhfaC#AEk^gruQ@XWY(NU^V5*8- hC*S81pIpTyEg;9i!o|YFTEqsF)8s7jn7ouL4*-k{E=B+V delta 223 zcmZn>n=Hng&&$ij00hrNYSVf*@`|!BzMHJflEUaaxr4=wDNkkcAr@Ee_`<*v;Tn!+ zMn;CoT&%5(B9kYuZehR0T2PdkS2Ed!t(4JX@-8+dNhS_P5k@XXrhft~0*o*=2Qv%f z Date: Fri, 28 Jun 2024 00:01:49 +0530 Subject: [PATCH 15/80] [some update] --- console.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/console.py b/console.py index 5c4b0823d69b..6f1ad25fb4e3 100755 --- a/console.py +++ b/console.py @@ -240,8 +240,8 @@ def do_all(self, args): else: for k, v in storage.all().items(): print_list.append(str(v)) - - print(print_list) + print("[{}]".format(", ".join(print_list))) + # print(print_list) def help_all(self): """ Help information for the all command """ From 39721f991800620af83630934f133b221c0184fc Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 29 Jun 2024 13:18:14 +0530 Subject: [PATCH 16/80] update base_model --- models/__pycache__/base_model.cpython-310.pyc | Bin 2818 -> 2823 bytes models/__pycache__/city.cpython-310.pyc | Bin 840 -> 900 bytes models/__pycache__/place.cpython-310.pyc | Bin 684 -> 1167 bytes models/__pycache__/user.cpython-310.pyc | Bin 772 -> 871 bytes models/base_model.py | 2 +- models/city.py | 3 +- models/place.py | 30 +++++++++++------- models/user.py | 5 +-- 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/models/__pycache__/base_model.cpython-310.pyc b/models/__pycache__/base_model.cpython-310.pyc index 953e813d93447e0b53af228c74ccb8cae38d9a99..bf2e56f07470aecbd2d03c6f4bb828812363ece5 100644 GIT binary patch delta 80 zcmZn?YZv3r=jG*M0D`-_>Nj$?F==wAu%~deFhudBaHenpY2Fm>6doYWm%^LE2c-E^ d_)`Rcw7}+FOw8I6}2mk@76Hx#F delta 78 zcmZn{YZBwm=jG*M0D=!;wHvwHm^8Uk*i$%K7^1jSI8(TQG*1e53J;LxP2o-91JZmc b{3!xJnt$^yCT4aeDJG^1fvZnfTjPB$X?LD}^bAJB6p0If^HRH<&?_Z?YR> zx%w^EfSknS)GF@8oE#m6l+>Kml2lEmB0iuAx7d>ti<1*mQvEb}Cm&!;7rez*08(4L zlA%ZnC|@Ks*?=jJQDX9ZCUHIqh0uVJ|g&;zDvIesP0DLtm AV*mgE delta 121 zcmZo+Kf%VE&&$ij00aTDwP|V-dEYX+P5kZ3mckXxpvgTsgt462Pm^czC&qNnl?+AV zKy^jple3ueRK$Qx4h9xR7Df(6CPudZ987E=`kw%E5eHDpPm{YyX!1X%Fad}jutpFe JF*$`<0RTcJ7vBH? diff --git a/models/__pycache__/place.cpython-310.pyc b/models/__pycache__/place.cpython-310.pyc index 7a32bfd23fae9c8a1adb7417146d9c7601f38460..a915c2c1441b7e6330e7cf618f76ac7be5da7161 100644 GIT binary patch literal 1167 zcmZWo&2G~`5cXgElQ?P0PvC%rFCgX8NSrG~Q&B*O3Q@T1WpTWd)Ua!(>oqjJfK;wL z2yehc@C1A1)K}odtR31^?8^3h-_Fj=ezPw7{jPsSI$RbCd=alXt<)Xi~u&|k=cMQl8* z!))R*hj`EdpSkBY1k5|P%|X7qB-~(wOEzlQaE%?(ZE%FRi@O}sLmXp-9*Z$X{~8)x zLtEF-5YhHJ#*Gd8=E5Sk;5O?shYc|P2<@%4eTNNE;%(h&6h7Nd_L60zwJMWJrK?2y z4X!SB@z7^cma819otzz@Twzgjp3XR&g>?ne&=+6PEjRb%t+de`JF<@-9Wa=uHCNhu zhn~21FiW$KbXhKIR2(Yp?dNKBIKHbxN{dtgrMgS0XgZE|OzBCT^7TqUDJwIi`;;nE zK+8)^Ye~~488k_;+7->24orE*@QkDGF{m<`FHNVVZ#?6o7Bh5_Whp8>T%%d4j$0-Y z=_y^*P$@lF$~*%)ThSt494i@`{h_%ws%D@gUKWei>|w5=t)P;Taq~vN#2kRNzF|x5Uv>WfkabJ$mS#P(oc4qibnU(;T4)W49 zi{0vkr#w3bvD(nzsM<84)n{bF5XNVAH)nEQ6d_tzEfSCv3f3N?HdY>jR@=p!y=!u;Bxj)@g4&DhE7%CW zfp3yl-$Q4Kf`YUBhHwAO_w8fy8lAZ`?E}{{+)Nw-yob&2QoPw`nw%Sf0YVZL&V&&N zM?jL)1CX-fUK&Z!DHOe@yUkl{lf$yH$Bt|@=E*VA3g=r7o+DPO5TjuUGVez6eUsoo?o9<&|!s4nfnO=uxrko!ItoBKIF+ z*XMF0d4W3P`#SUIaSTQSz*-KbD?>_4U6`gY*6POY+P&N$ z4gNY|QeI%#5Gz4kn=e@PNV~S{C0hw?!;0yOaZ!@YMwB+J7L?kUQuxx#fv1!{^~~(h z>_i3d%Ld(WUcWnP3{s8F4{FW}ppoMt4;6qEFhVMXW=Uc-GB56|_@Dk;8Oo{IyZ9HI C3Q*zz delta 156 zcmaFP*22b@&&$ij00iM{YSWH0PUO4F#RB9x0CBO;#JApjDQv+En(Vh&LW@(2suU)N zFe=F0Vl4%7ieEMW6}f3L-r~qB&B;kj%1QOp Date: Sat, 29 Jun 2024 14:10:54 +0530 Subject: [PATCH 17/80] =?UTF-8?q?=C3=BCpdate=20task=209:=20Review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/__pycache__/place.cpython-310.pyc | Bin 1167 -> 1659 bytes models/__pycache__/review.cpython-310.pyc | Bin 548 -> 923 bytes models/__pycache__/user.cpython-310.pyc | Bin 871 -> 904 bytes models/place.py | 17 ++++++++++++++++- models/review.py | 20 +++++++++++++++----- models/user.py | 3 ++- 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/models/__pycache__/place.cpython-310.pyc b/models/__pycache__/place.cpython-310.pyc index a915c2c1441b7e6330e7cf618f76ac7be5da7161..b204a1229d460d213ca521700e34efc6bbd44696 100644 GIT binary patch delta 769 zcmZuvPiqrF6rVRc`zOgJZE9QF8eyRdU6CGo@*oAPwVrBeir`XNHknD-bT=Dkw-rlb zgcdxBlzf5qrXR$U-(c=u`~-p*-)?g7;5^6x+RS#ilL#bvKt8aPT}63I8HeI56z`Nih=R5_uLM!_ z(BUEynQ*DBBQIsPgR~uR(T1G#?C5wi)TgNFHkyJuiD3jlx@1I$(4*Jd4S7c1%pKG5 zNE@*s>#-r}=?J_rq}Rrf-C*(C>X0^xtDSE+vcTeWMV1Na1X(7-)@kN+66rh-Bavo_ z47$RRIS?0AB@Z^ILDy7kae~0pP0{a$eX-fWq(5tsuU4={&G`p8OW#jgJ<-lmrH7e_ zQ)Lz8{g5k)Y6OFU=yO+BEEQ2l7Oj;jHa`l}Oo6Z9>>H8mla?m7lsV0%ck^A;(AXM- z1+bwE^dp1wYB6a#6PD(qeColCi2OI1Oa&|3{eazj44bxjJZrvOu5Wa%#0vDa}G-` zYZPlPTNGO^dlY*vM-)dcXA~z`jwOdHmph7^k-?oIg*An(g&~D4l_{0EnI(!Rg?(b1 z*2In3jAtgxGM;8j5eR0`6r3!@)XwauDKWW+PO2RvNGHe$7DfR^8AcvP GF=hY+`9Ju7ND{-z6T|_}3Dn#MpiXQ1XJvK!#t448a3`#dsp4eUin?N9j8_ zDd9BLwOlAj4{MXQGe}=f_onIG)E}W}(@WfyWS$*N^9J735|m}m%zPU@tJOkRHr#Jb zSsmGAw>D57Rj=VZqjqRO@no}}ED9%m3hDE$?MNU{}m z)nE8LzQsn@?4V=gE9~(EHsnBhGP&^h5bcdCdnAY0^T>vM%gb!td!h2CY3mfHfzUVIYs zdcHt0ps~SQ_xoP9X=5R(T!Roc5u!f+SXRV2xmpRS`UCdWv9=PA!@++U{s-4KmjyeDz3pSpgn;7?Tvq?LHQAT4LQjdneV}Jcc z^k?X8(Jp!~+c0-A*xu=rjSuj$IekDGd>+L3&Y3jFDp$n}^!dMHY~HxWc!-?_UFMt4 bd+VV~6mR#^KcR>k_YxW1qW9>K-uM3kHVOF; delta 286 zcmbQuzJw(tpO=@50SJ~b)TTWH(vLwLWWWOCH~?|63Xn))h+;@#Okv7l%w>vVVq|b< zNMTN4X<4Q9|}n^>iz&UlN{DX}=!H$NpcCmE;{1uz164nSNiGntW5 zm@kDXiWP|2Qka3dStjQ(ny@hVX|hlL!KkOmQIM0EoEo2*a*MsRIJF4GU@1whC|Su+ z!~-;;h-Y#+Q@SEEkjVxz5absQ1{OvTHvyCSiC^iEe@O9 W{FKt1R6CHPib003F!C^pFarRza};k1cQAt{&txCQ zcJ5njL8)b#spWo}e3P#+Rtw!?F9P$6S27ey1C1$?o*c!LryvAmaxkzkvM>q&ArBDp gF$ysju>*zuG`Wg|CqH8f6o9A)YXT86liisW0F1mM3jhEB delta 115 zcmeBRf6m66&&$ij00ap;>eDnQ^4@2Rn)o)7ErlzXL6duO6k|KHpC<3*H;mPsD;bI; zf$EARCs#7%$q4|N91JXsEQ|s`$OD8zj797~K|f8dBB9Cb%z*+B)nF|kLTYjbvjPC) C6&4Ht diff --git a/models/place.py b/models/place.py index 50abc8adcc0f..5cef102119a7 100644 --- a/models/place.py +++ b/models/place.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 """ Place Module for HBNB project """ +import os from models.base_model import BaseModel, Base from sqlalchemy import Column, String, Integer, ForeignKey, Float from sqlalchemy.orm import relationship @@ -19,6 +20,20 @@ class Place(BaseModel, Base): latitude = Column(Float, nullable=True) longitude = Column(Float, nullable=True) amenity_ids = [] - user = relationship("User", back_populates="places") cities = relationship("City", back_populates="places") + + if os.getenv('HBNB_TYPE_STORAGE') == 'db': + reviews = relationship("Review", back_populates="place", cascade="all, delete") + else: + @property + def reviews(self): + """ review getter attribut for Filestorage """ + from models.engine.file_storage import FileStorage + review_list = [] + for _, v in FileStorage.__objects.items(): + if v.place_id == self.id: + review_list.append(v) + return review_list + + diff --git a/models/review.py b/models/review.py index c487d90d34f0..0c3b85c81372 100644 --- a/models/review.py +++ b/models/review.py @@ -1,10 +1,20 @@ #!/usr/bin/python3 """ Review module for the HBNB project """ -from models.base_model import BaseModel +from models.base_model import BaseModel, Base +from sqlalchemy import Column, String, ForeignKey +from sqlalchemy.orm import relationship -class Review(BaseModel): +class Review(BaseModel, Base): """ Review classto store review information """ - place_id = "" - user_id = "" - text = "" + __tablename__ = 'reviews' + place_id = Column(String(60), + ForeignKey('places.id'), + nullable=False) + user_id = Column(String(60), + ForeignKey('users.id'), + nullable=False) + text = Column(String(1024), + nullable=False) + user = relationship("User", back_populates="reviews") + place = relationship("Place", back_populates="reviews") diff --git a/models/user.py b/models/user.py index 49f0519d4b24..b1babdbb7b6d 100644 --- a/models/user.py +++ b/models/user.py @@ -12,4 +12,5 @@ class User(BaseModel, Base): password = Column(String(128), nullable=False) first_name = Column(String(128)) last_name = Column(String(128)) - places = relationship('Place', back_populates='user', cascade="all, delete") \ No newline at end of file + places = relationship('Place', back_populates='user', cascade="all, delete") + reviews = relationship('Review', back_populates='user', cascade="all, delete") \ No newline at end of file From ccec7e348c126396de28a95bcdd868ed7d830b41 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 00:35:13 +0530 Subject: [PATCH 18/80] [add] setup_web_static --- 0-setup_web_static.sh | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 0-setup_web_static.sh diff --git a/0-setup_web_static.sh b/0-setup_web_static.sh new file mode 100644 index 000000000000..55573561edb0 --- /dev/null +++ b/0-setup_web_static.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# Set up web servers for the deployment of web_static + +if ! command -v nginx > /dev/null 2>&1; then + sudo apt-get update + sudo apt-get install -y nginx +fi + +sudo mkdir -p /data/ +sudo mkdir -p /data/web_static/ +sudo mkdir -p /data/web_static/releases/ +sudo mkdir -p /data/web_static/shared/ +sudo mkdir -p /data/web_static/releases/test/ +echo "hello fab!" > /data/web_static/releases/test/index.html + +Target="/data/web_static/releases/test/" +Sym_link="/data/web_static/current" + +if [ -L "$Sym_link" ]; then + sudo rm "$Sym_link" +fi + +sudo ln -s "$Target" "$Sym_link" + +sudo chown -R ubuntu:ubuntu /data + +sudo sed -i "51i\ \tlocation /hbnb_static{\n \ +\t\talias /data/web_static/current/;\n\ +\t}" /etc/nginx/sites-enabled/default + +sudo service nginx restart From 827635b1f3935987629dd9e78838216b44255397 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 11 Jul 2024 12:17:30 -0700 Subject: [PATCH 19/80] [update] setup web_static --- 0-setup_web_static.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 0-setup_web_static.sh diff --git a/0-setup_web_static.sh b/0-setup_web_static.sh old mode 100644 new mode 100755 From 114c97b22ca093d824b717609ce71974a4c1b1e8 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 11 Jul 2024 13:02:04 -0700 Subject: [PATCH 20/80] [add] pack_web_static --- 1-pack_web_static.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 1-pack_web_static.py diff --git a/1-pack_web_static.py b/1-pack_web_static.py new file mode 100755 index 000000000000..ef4f870ae3b7 --- /dev/null +++ b/1-pack_web_static.py @@ -0,0 +1,21 @@ +#!/usr/bin/python3 +""" Fabric script that generates a .tgz archive from the contents of the web_static +""" + +from fabric.api import * +import datetime + +def do_pack(): + """ function to create .tgz archive + from the contents of the web_static. + """ + local("mkdir -p versions") + time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + archive_name = "versions/web_static_{}.tgz".format(time_stamp)) + res = local("tar -czf {} web_static".format(archive_name)) + if res.succeeded: + return archive_name + else: + return None + + From acc6eb153c4dac020217589f51049f94440014d5 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 11:32:10 +0530 Subject: [PATCH 21/80] [update] pack web_static --- 1-pack_web_static.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/1-pack_web_static.py b/1-pack_web_static.py index ef4f870ae3b7..3a771da688a2 100755 --- a/1-pack_web_static.py +++ b/1-pack_web_static.py @@ -6,9 +6,8 @@ import datetime def do_pack(): - """ function to create .tgz archive - from the contents of the web_static. - """ + """ function to create .tgz archive """ + local("mkdir -p versions") time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") archive_name = "versions/web_static_{}.tgz".format(time_stamp)) From e6a132edeaca8fdbd962c8a8ea99b06d6488c60e Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 12:14:17 +0530 Subject: [PATCH 22/80] [update] task one --- 1-pack_web_static.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/1-pack_web_static.py b/1-pack_web_static.py index 3a771da688a2..ad3f12871f0a 100755 --- a/1-pack_web_static.py +++ b/1-pack_web_static.py @@ -1,18 +1,22 @@ #!/usr/bin/python3 """ Fabric script that generates a .tgz archive from the contents of the web_static """ - -from fabric.api import * +import os +from fabric.api import local import datetime def do_pack(): """ function to create .tgz archive """ - local("mkdir -p versions") time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") - archive_name = "versions/web_static_{}.tgz".format(time_stamp)) - res = local("tar -czf {} web_static".format(archive_name)) - if res.succeeded: + if os.path.exists('./versions'): + os.mkdir('./versions' + archive_name = "web_static_{}.tgz".format(time_stamp)) + local("tar -czf versions/{} web_static".format(archive_name)) + print("Packing web_static to versions/{}.tgz".format(archive_name)) + if os.path.getsize("versions/{}".format(archive_name)): + size = os.path.getsize("versions/{}.tgz".format(archive_name)) + print("web_static packed: versions/{} -> {}Bytes".format(archive_name, size) return archive_name else: return None From 7a7e583f9cc8fd0c1d7128ac5877b2390d9ac0be Mon Sep 17 00:00:00 2001 From: Fuad Hassen <133159437+fuadhasen@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:18:40 +0530 Subject: [PATCH 23/80] Update 1-pack_web_static.py --- 1-pack_web_static.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-pack_web_static.py b/1-pack_web_static.py index ad3f12871f0a..8a487d33368b 100755 --- a/1-pack_web_static.py +++ b/1-pack_web_static.py @@ -10,13 +10,13 @@ def do_pack(): time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") if os.path.exists('./versions'): - os.mkdir('./versions' - archive_name = "web_static_{}.tgz".format(time_stamp)) + os.mkdir('./versions') + archive_name = "web_static_{}.tgz".format(time_stamp) local("tar -czf versions/{} web_static".format(archive_name)) print("Packing web_static to versions/{}.tgz".format(archive_name)) if os.path.getsize("versions/{}".format(archive_name)): size = os.path.getsize("versions/{}.tgz".format(archive_name)) - print("web_static packed: versions/{} -> {}Bytes".format(archive_name, size) + print("web_static packed: versions/{} -> {}Bytes".format(archive_name, size)) return archive_name else: return None From 74dfa7f6ac1fad5c3cc65bdd6b5bd6fa1e286758 Mon Sep 17 00:00:00 2001 From: Fuad Hassen <133159437+fuadhasen@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:20:20 +0530 Subject: [PATCH 24/80] Update 1-pack_web_static.py --- 1-pack_web_static.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-pack_web_static.py b/1-pack_web_static.py index 8a487d33368b..b8343ee09a79 100755 --- a/1-pack_web_static.py +++ b/1-pack_web_static.py @@ -12,7 +12,7 @@ def do_pack(): if os.path.exists('./versions'): os.mkdir('./versions') archive_name = "web_static_{}.tgz".format(time_stamp) - local("tar -czf versions/{} web_static".format(archive_name)) + local("tar -cvzf versions/{} web_static".format(archive_name)) print("Packing web_static to versions/{}.tgz".format(archive_name)) if os.path.getsize("versions/{}".format(archive_name)): size = os.path.getsize("versions/{}.tgz".format(archive_name)) From 523a06ec1cc7aff1394f3d8ab976cbe4f5d258b9 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 12:40:30 +0530 Subject: [PATCH 25/80] [update] pack web_static --- 1-pack_web_static.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/1-pack_web_static.py b/1-pack_web_static.py index b8343ee09a79..59b956d01d1b 100755 --- a/1-pack_web_static.py +++ b/1-pack_web_static.py @@ -11,14 +11,12 @@ def do_pack(): time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") if os.path.exists('./versions'): os.mkdir('./versions') - archive_name = "web_static_{}.tgz".format(time_stamp) - local("tar -cvzf versions/{} web_static".format(archive_name)) + archive_name = "web_static_" + time_stamp + local("tar -cvzf versions/{}.tgz web_static".format(archive_name)) print("Packing web_static to versions/{}.tgz".format(archive_name)) if os.path.getsize("versions/{}".format(archive_name)): size = os.path.getsize("versions/{}.tgz".format(archive_name)) - print("web_static packed: versions/{} -> {}Bytes".format(archive_name, size)) + print("web_static packed: versions/{}.tgz -> {}Bytes".format(archive_name, size)) return archive_name else: return None - - From 53da202dd928661f2ab173e44a09da2eb7ad418c Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 13:23:31 +0530 Subject: [PATCH 26/80] [update] --- 2-do_deploy_web_static.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 2-do_deploy_web_static.py diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py new file mode 100644 index 000000000000..5f5a97f0fe20 --- /dev/null +++ b/2-do_deploy_web_static.py @@ -0,0 +1,25 @@ +#!/usr/bin/python3 +""" Fabric script that generates a .tgz archive from the contents of the web_static +""" +import os +from fabric.api import run, env, put +import datetime + +env.hosts = ['100.26.152.53', '35.174.208.133'] + +def do_deploy(archive_path): + """ function to deploy archive """ + if archive_path: + a_name = os.path.basename(archive_path) + a_folder_name = f_name.split('.')[0] + + put(archive_path, "/tmp") + # Uncompress the archive + sudo("tar -xzf /tmp/a_name -C /data/web_static/releases/{}".format(a_folder_name)) + sudo(f'rm /tmp/{a_name}') + sudo('rm /data/web_static/current') + + sudo(f'ln -s /data/web_static/releases/{a_folder_name} /data/web_static/current') + return True + else: + return False From b13148f26ba9789d8e4b1e2c0f708e1b5f89be3f Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 00:59:45 -0700 Subject: [PATCH 27/80] [update] task2: deploy --- 2-do_deploy_web_static.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 2-do_deploy_web_static.py diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py old mode 100644 new mode 100755 From 131b7677c9e5cebf556aa006a522066d4a69acf7 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 01:27:52 -0700 Subject: [PATCH 28/80] [update] task one --- 1-pack_web_static.py | 6 ++--- 2-do_deploy_web_static.py | 2 +- __pycache__/1-pack_web_static.cpython-35.pyc | Bin 0 -> 931 bytes fabfile.py | 22 +++++++++++++++++++ versions/web_static_20240712012713.tgz | Bin 0 -> 19300 bytes 5 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 __pycache__/1-pack_web_static.cpython-35.pyc create mode 100755 fabfile.py create mode 100644 versions/web_static_20240712012713.tgz diff --git a/1-pack_web_static.py b/1-pack_web_static.py index 59b956d01d1b..5e9cbfcbc31b 100755 --- a/1-pack_web_static.py +++ b/1-pack_web_static.py @@ -9,12 +9,12 @@ def do_pack(): """ function to create .tgz archive """ time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") - if os.path.exists('./versions'): + if not os.path.exists('./versions'): os.mkdir('./versions') archive_name = "web_static_" + time_stamp - local("tar -cvzf versions/{}.tgz web_static".format(archive_name)) + res = local("tar -czf versions/{}.tgz web_static".format(archive_name)) print("Packing web_static to versions/{}.tgz".format(archive_name)) - if os.path.getsize("versions/{}".format(archive_name)): + if res.succeeded: size = os.path.getsize("versions/{}.tgz".format(archive_name)) print("web_static packed: versions/{}.tgz -> {}Bytes".format(archive_name, size)) return archive_name diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py index 5f5a97f0fe20..42f47d385832 100755 --- a/2-do_deploy_web_static.py +++ b/2-do_deploy_web_static.py @@ -2,7 +2,7 @@ """ Fabric script that generates a .tgz archive from the contents of the web_static """ import os -from fabric.api import run, env, put +from fabric.api import env, run, put, sudo import datetime env.hosts = ['100.26.152.53', '35.174.208.133'] diff --git a/__pycache__/1-pack_web_static.cpython-35.pyc b/__pycache__/1-pack_web_static.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afaee6f1f54a637efa189d181786442461e7488c GIT binary patch literal 931 zcmZ8fPiqrF6o0e3*(BQ(wZ$rkFerP-AqjdBM2c1rFBYXIb6K`Cv+1PSKg>*9yG>5@ z1Nbe(liz2+lOXsNJo#pulC;Cj+j+nFy}$c*HaDYRf4*gpeSqJvwmiJQ#-n#paDXvN z0^EZcfiYfi`!Mq$_hIYqlFvU&a5~b%7za+3g+=poZ(M;D8x*DF>Xe@xl2 zEGBe?xxlw9>N~fA!5Y6p7lOaMZA1sV^kT7hjz4+7-?JT#r5KqD>lfvj?P#O2M)gW< zgDN#gHWXi^HrlrGV=k3)V`#&yRC#J_t5UKswyRGV6M_qF+Y@25tVKTCV>S8H@-W}}+sC($}Up#sv)n2ieuvuA%vQ4_=5!oSur?&B>AKG@3@RB8o3Q@OF)=c~`tz=V$@)2#QO%7{f%h5Zp U@{*s-#IB=h7cnF~a+mbH|3mcm4gdfE literal 0 HcmV?d00001 diff --git a/fabfile.py b/fabfile.py new file mode 100755 index 000000000000..fedbcf6c7a45 --- /dev/null +++ b/fabfile.py @@ -0,0 +1,22 @@ +#!/usr/bin/python3 +""" Fabric script that generates a .tgz archive from the contents of the web_static +""" +import os +from fabric.api import local +import datetime + +def do_pack(): + """ function to create .tgz archive """ + + time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + if os.path.exists('./versions'): + os.mkdir('./versions') + archive_name = "web_static_{}.tgz".format(time_stamp) + local("tar -cvzf versions/{} web_static".format(archive_name)) + print("Packing web_static to versions/{}.tgz".format(archive_name)) + if os.path.getsize("versions/{}".format(archive_name)): + size = os.path.getsize("versions/{}.tgz".format(archive_name)) + print("web_static packed: versions/{} -> {}Bytes".format(archive_name, size)) + return archive_name + else: + return None diff --git a/versions/web_static_20240712012713.tgz b/versions/web_static_20240712012713.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e86e75be267f391c19372e225c73d36699740788 GIT binary patch literal 19300 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 G$Nd*zTD3?3 literal 0 HcmV?d00001 From de24d5b370bdd30bc4cb792015397d1dca198988 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 01:37:34 -0700 Subject: [PATCH 29/80] [update] task1: pack webstatic --- 1-pack_web_static.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/1-pack_web_static.py b/1-pack_web_static.py index 5e9cbfcbc31b..c18f0b34e99e 100755 --- a/1-pack_web_static.py +++ b/1-pack_web_static.py @@ -1,10 +1,11 @@ #!/usr/bin/python3 -""" Fabric script that generates a .tgz archive from the contents of the web_static +""" Fabric script that generates a .tgz archive """ import os from fabric.api import local import datetime + def do_pack(): """ function to create .tgz archive """ @@ -16,7 +17,8 @@ def do_pack(): print("Packing web_static to versions/{}.tgz".format(archive_name)) if res.succeeded: size = os.path.getsize("versions/{}.tgz".format(archive_name)) - print("web_static packed: versions/{}.tgz -> {}Bytes".format(archive_name, size)) + print("web_static packed: versions/{}.tgz -> {}Bytes".format( + archive_name, size)) return archive_name else: return None From df27c10dee5d69ff50c0371af4757e5ee5e92356 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 02:27:28 -0700 Subject: [PATCH 30/80] [update] task2: deploy web static --- 2-do_deploy_web_static.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py index 42f47d385832..e282e4b7b2e8 100755 --- a/2-do_deploy_web_static.py +++ b/2-do_deploy_web_static.py @@ -11,15 +11,18 @@ def do_deploy(archive_path): """ function to deploy archive """ if archive_path: a_name = os.path.basename(archive_path) - a_folder_name = f_name.split('.')[0] + a_folder_name = a_name.split('.')[0] put(archive_path, "/tmp") # Uncompress the archive - sudo("tar -xzf /tmp/a_name -C /data/web_static/releases/{}".format(a_folder_name)) - sudo(f'rm /tmp/{a_name}') - sudo('rm /data/web_static/current') + sudo("mkdir -p /data/web_static/releases/{}".format(a_folder_name)) + sudo("tar -xzf /tmp/{} -C /data/web_static/releases/{}".format(a_name, a_folder_name)) + sudo("rm /tmp/{}".format(a_name)) + sudo("mv /data/web_static/releases/{}/web_static/* /data/web_static/releases/{}/".format(a_folder_name, a_folder_name)) + sudo("rm -rf /data/web_static/releases/{}/web_static".format(a_folder_name)) + sudo("rm /data/web_static/current") - sudo(f'ln -s /data/web_static/releases/{a_folder_name} /data/web_static/current') + sudo("ln -s /data/web_static/releases/{}/ /data/web_static/current".format(a_folder_name)) return True else: return False From 4bf3b25d8936ef6b7d5f44ace538dce05369d393 Mon Sep 17 00:00:00 2001 From: Fuad Hassen <133159437+fuadhasen@users.noreply.github.com> Date: Fri, 12 Jul 2024 22:17:09 +0530 Subject: [PATCH 31/80] Update 2-do_deploy_web_static.py --- 2-do_deploy_web_static.py | 1 + 1 file changed, 1 insertion(+) diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py index e282e4b7b2e8..fda11f449f90 100755 --- a/2-do_deploy_web_static.py +++ b/2-do_deploy_web_static.py @@ -7,6 +7,7 @@ env.hosts = ['100.26.152.53', '35.174.208.133'] + def do_deploy(archive_path): """ function to deploy archive """ if archive_path: From e9a21fc3e3d5ab4b99708cb93a6c68180cec4e82 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 10:03:36 -0700 Subject: [PATCH 32/80] [update] task2: do_deploy --- 2-do_deploy_web_static.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py index fda11f449f90..2090d9ba693a 100755 --- a/2-do_deploy_web_static.py +++ b/2-do_deploy_web_static.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 -""" Fabric script that generates a .tgz archive from the contents of the web_static +""" Fabric script that generates a .tgz archive +from the contents of the web_static """ import os from fabric.api import env, run, put, sudo @@ -13,17 +14,21 @@ def do_deploy(archive_path): if archive_path: a_name = os.path.basename(archive_path) a_folder_name = a_name.split('.')[0] + path = "/data/web_static/releases/" put(archive_path, "/tmp") # Uncompress the archive sudo("mkdir -p /data/web_static/releases/{}".format(a_folder_name)) - sudo("tar -xzf /tmp/{} -C /data/web_static/releases/{}".format(a_name, a_folder_name)) + sudo("tar -xzf /tmp/{} -C /data/web_static/releases/{}".format( + a_name, a_folder_name)) sudo("rm /tmp/{}".format(a_name)) - sudo("mv /data/web_static/releases/{}/web_static/* /data/web_static/releases/{}/".format(a_folder_name, a_folder_name)) - sudo("rm -rf /data/web_static/releases/{}/web_static".format(a_folder_name)) + sudo("mv {0}{1}/web_static/* {0}{1}".format(path, a_folder_name)) + sudo("rm -rf /data/web_static/releases/{}/web_static".format( + a_folder_name)) sudo("rm /data/web_static/current") - sudo("ln -s /data/web_static/releases/{}/ /data/web_static/current".format(a_folder_name)) + sudo("ln -s {0}{1}/ /data/web_static/current".format( + path, a_folder_name)) return True else: return False From 56bec7a8daae332c2d9bde561504006dac30098e Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 11:02:51 -0700 Subject: [PATCH 33/80] [update] task3: deploy web_static --- 3-deploy_web_static.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100755 3-deploy_web_static.py diff --git a/3-deploy_web_static.py b/3-deploy_web_static.py new file mode 100755 index 000000000000..114e408076e5 --- /dev/null +++ b/3-deploy_web_static.py @@ -0,0 +1,22 @@ +#!/usr/bin/python3 +""" Fabric script that creates and distributes an archive +to your web servers +""" +import os +from fabric.api import local, env +import datetime +pack = __import__("1-pack_web_static") +dep = __import__("2-do_deploy_web_static") + +env.hosts = ['100.26.152.53', '35.174.208.133'] + + +def deploy(): + """ function handle full deployment """ + + archive_path = pack.do_pack() + if not archive_path: + return False + + res = dep.do_deploy(archive_path) + return res From 1e52e5f7cd0f9702edc65cd260f8e4c66ee0e0b2 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 11:21:04 -0700 Subject: [PATCH 34/80] [update] task3: web_static --- 3-deploy_web_static.py | 58 +++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/3-deploy_web_static.py b/3-deploy_web_static.py index 114e408076e5..cf7318342d36 100755 --- a/3-deploy_web_static.py +++ b/3-deploy_web_static.py @@ -3,20 +3,60 @@ to your web servers """ import os -from fabric.api import local, env +from fabric.api import local, env, put, sudo import datetime -pack = __import__("1-pack_web_static") -dep = __import__("2-do_deploy_web_static") env.hosts = ['100.26.152.53', '35.174.208.133'] -def deploy(): - """ function handle full deployment """ +def do_pack(): + """ function to create .tgz archive """ + + time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + if not os.path.exists('./versions'): + os.mkdir('./versions') + archive_name = "web_static_" + time_stamp + res = local("tar -czf versions/{}.tgz web_static".format(archive_name)) + print("Packing web_static to versions/{}.tgz".format(archive_name)) + if res.succeeded: + size = os.path.getsize("versions/{}.tgz".format(archive_name)) + print("web_static packed: versions/{}.tgz -> {}Bytes".format( + archive_name, size)) + return archive_name + ".tgz" + else: + return None + + +def do_deploy(archive_path): + """ function to deploy archive """ + if archive_path: + a_name = os.path.basename(archive_path) + a_folder_name = a_name.split('.')[0] + path = "/data/web_static/releases/" - archive_path = pack.do_pack() - if not archive_path: + put(archive_path, "/tmp") + # Uncompress the archive + sudo("mkdir -p /data/web_static/releases/{}".format(a_folder_name)) + sudo("tar -xzf /tmp/{} -C /data/web_static/releases/{}".format( + a_name, a_folder_name)) + sudo("rm /tmp/{}".format(a_name)) + sudo("mv {0}{1}/web_static/* {0}{1}".format(path, a_folder_name)) + sudo("rm -rf /data/web_static/releases/{}/web_static".format( + a_folder_name)) + sudo("rm /data/web_static/current") + + sudo("ln -s {0}{1}/ /data/web_static/current".format( + path, a_folder_name)) + return True + else: return False - res = dep.do_deploy(archive_path) - return res + +def deploy(): + """ function handle full deployment """ + + ar_path = do_pack() + if ar_path is not None: + res = do_deploy("versions/{}".format(ar_path)) + return res + return False From 8869f89d7224c25f6737fae56b70c2716a612dad Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 11:23:36 -0700 Subject: [PATCH 35/80] [some update] task 3 --- .3-deploy_web_static.py.swp | Bin 0 -> 12288 bytes __pycache__/1-pack_web_static.cpython-35.pyc | Bin 931 -> 925 bytes .../2-do_deploy_web_static.cpython-35.pyc | Bin 0 -> 1157 bytes .../3-deploy_web_static.cpython-35.pyc | Bin 0 -> 2011 bytes ...2713.tgz => web_static_20240712110132.tgz} | Bin 19300 -> 19300 bytes versions/web_static_20240712110133.tgz | Bin 0 -> 19300 bytes versions/web_static_20240712111744.tgz | Bin 0 -> 19300 bytes versions/web_static_20240712111825.tgz | Bin 0 -> 19300 bytes versions/web_static_20240712111927.tgz | Bin 0 -> 19300 bytes versions/web_static_20240712112029.tgz | Bin 0 -> 19300 bytes versions/web_static_20240712112031.tgz | Bin 0 -> 19300 bytes 11 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .3-deploy_web_static.py.swp create mode 100644 __pycache__/2-do_deploy_web_static.cpython-35.pyc create mode 100644 __pycache__/3-deploy_web_static.cpython-35.pyc rename versions/{web_static_20240712012713.tgz => web_static_20240712110132.tgz} (99%) create mode 100644 versions/web_static_20240712110133.tgz create mode 100644 versions/web_static_20240712111744.tgz create mode 100644 versions/web_static_20240712111825.tgz create mode 100644 versions/web_static_20240712111927.tgz create mode 100644 versions/web_static_20240712112029.tgz create mode 100644 versions/web_static_20240712112031.tgz diff --git a/.3-deploy_web_static.py.swp b/.3-deploy_web_static.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..e711392a3173ad34be1824a036b4f6ccdf5b63d4 GIT binary patch literal 12288 zcmeI2Piqu07{*ft1+gkBJ$Oo|ES<&fZ2zdWMFk5MJyZm#ARdP7Or{$;lMG3A>u#wY z`~=<<97gp$9L5SI@rLnca?iSfO|+yn%<=d6PVO^2=$Nv=*N|+M=t$4Fc^F zA?M<^$zgY4=KEL9Itw}j`gwtnAE1w*KIjFg0Xm!} z74!u(Sn~uj!^lVg2_OL^fCP{L5(J+m4p>G29p? zuEbNr*9X7cTiMHW)D~SHN|qI)TwmF$eGAlxKCjowurt>}THiameoS)~?ech?cDXh} zNz>dv2<%RuHtx~=gN>f$#tRaqGiLpfi!-HnsWL&%Y&+QD)>V9O%wsgM8mSB;64;9g zOecysk0HRoyo~n*G6}guD>1DaPdLdPtRY{jB9{7|Wtujkell)Qv7h8s4G*RjcA-bF zQ!6s=u5xGj2oG?{c4MLa`Jg#OGGCklY+EWjBFA3}W6j^=3KB=Qux89GcZFc|L#jQ$ z9vG_=SNFZz^IBGmYY%H%wWnUOQ~?yuCoFd0d{pR;+pm*Br{{Sz>Bz{!xl;h#W-?AW zl+u(I_tY~kEvGP!#5^f$etn&gM5~N0HJn@JE;|)juC%SJGc1%FDCQ-srQzZ`%f)cQ z;G{@7SQ+A0bm=x(i`q7`G}0U_426U=24-5cI>kFJ&&O?`r#jl5Dm7d?@MLbb*)h7= N60({1Y+K0{@&_XXO40xT literal 0 HcmV?d00001 diff --git a/__pycache__/1-pack_web_static.cpython-35.pyc b/__pycache__/1-pack_web_static.cpython-35.pyc index afaee6f1f54a637efa189d181786442461e7488c..83989fa1c088bc3b88d1b09f83cdd9fa0dc2e08d 100644 GIT binary patch delta 214 zcmZ3?K9`+SjF*?IJbz-E(?rfVM%{@SI_g|68Gyh~lkpa7PJVJ?PBMrK0<1vH0>sWh zT)c1M{bI&#lY<$J1XI`;vN#xO7#W%w8ERP=YFIY6GdeOdvQ9q9q{@GbGp#fyC%z!D zBx5B*k*HC7H=wFByQqPm}Q$YfgT0VooxM3j!=q>Fi^Be5S0*`T+b}a$OHhN Cn<}sX diff --git a/__pycache__/2-do_deploy_web_static.cpython-35.pyc b/__pycache__/2-do_deploy_web_static.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..134c52d729a85ea5d632b6b473ce49c248027127 GIT binary patch literal 1157 zcmaJ>O>5LZ7=9n(o$4Lk4~|3}(lQirA*q}Mk{@;&KnN4jaui~tk%UetMy_kYona9yt0RbfirsU40lG(&bV3|?>NI3 z&z#ZVr869lL!!udp({<>!@m59;S50h010qH;6zjDIe`U%GfZ{m3Z}TEdkanZv(P~r z3WNrnYd~a6`EX*wnWlhvHzl(vp$Jx+2TirTtgZk%O-a87?A}zgF17F6ps*esG8@|( zI=@~$q|r1BWt?YJ=9KXw$xkngrZsVd@}j!$vOoszmA|gw2@gtMx|QL|w5T4ZA6YDD zzo556=Zk6}0|b4pBC1&Kd_ntr|7Tbty}(wF(ixo(7W3g^bt+GnwaP(gU!e4@lbx>; zs|QN@IyRgNfoH0El4P`BUcByB-2455?RKr@Wo;CJoYb8obR`Q?Ubo63iKS3yNVG82 zW|WIGka#A0%aiOYif0DCB6xP-M|r}yXj0KZ&UX+tc7L9_Z)35W?fPMoXWXBS+)x{+v1G{uuw?Ho5)!Y#iZhcmO?y==&v@qeoHH|j|7N_=ZaaUMKM#Jd1N;R` zmx1lCu#}frMF1Yw1R?_x0vwZO9=t$|mA)CSK6GWV{7SBJ=gs0L>S zFbn(!L^ecq_z9CXA;NA`w;hP^UeWCpHPT79CBLOd!6}bJT82C>1Qo+TP#SU;2v*V{ zi)a*=g2$)hS)T?x9L5*S5jnle$DCfWQ(7{9!FcKXgG+(qu2t2NJPeY`WZ6Y!7GqIa zNYk+4{0zykPYQVJ)RnZ0r6sHEuMsjVy$N~QA zZDy3ozUMJDby$6Fyf)!xHWnsErJtRk*1B{ZxkU%#EEI8`Q50(?DW$GBleZ#L+3Nh* zNjp*Jo6dKg6Y02pr6Wd^-UFYKYUz0tbFP@L>_N`cKvcDY$C;>_Ozk>i%n!3eKTPtB`4_wWyN!?mJ}2v>O&s!+JRwc8iKR^%2H(JUAyFQ9-NW%uG$2&`4-F+zIAT`;MHE~k zb518B_yQS21Qjxta>7lDun>W`B6c<)Y#4{PHX&zd!X#*&A*CD`LuqNNVhw4nc1*8>mxza+u?Bf>?`gfxCIZIejva&C&zDNt% z(chW&3i`O~WGc5c&TkNB6@@6%-s}I5aCmy_E8j~m=wy33*_kd+<&(Khy6D>DnEKJl zPL>1Zrb_+LHym@$G9f=oGTJL|hkMlThoj?eoi|Y=?qF3lPEi$&YppDjSa8JHM6zedhs86#`Kr~ literal 0 HcmV?d00001 diff --git a/versions/web_static_20240712012713.tgz b/versions/web_static_20240712110132.tgz similarity index 99% rename from versions/web_static_20240712012713.tgz rename to versions/web_static_20240712110132.tgz index e86e75be267f391c19372e225c73d36699740788..6cc975e84ce7bdc3a73c17a294b882a6c948d4a1 100644 GIT binary patch delta 18 ZcmaDdjq%AeMt1pb4u+cii5uBty#Yhb28;jz delta 18 acmaDdjq%AeMt1pb4u*#>CTwJn^#%Y*VFzgd diff --git a/versions/web_static_20240712110133.tgz b/versions/web_static_20240712110133.tgz new file mode 100644 index 0000000000000000000000000000000000000000..92a283699df8c3b26c7bf6a05c6a11dc9507b867 GIT binary patch literal 19300 zcmYItW00mzuw~n}ZQGdcp0;h<)3$A6+O}=mwryMQ&i!I{Z$w4LsW_FVvNC^EJx>xw zK>_*LCzt_&Ug<)6E30<&nqpHa{8ITPc83%X;wrgNL~jf2Y`^G}uYfTr>zJwI>15yb zT4H;~^^yR1yl_Jv7$wsq^UyzjO;CrQr=FWgh=(-8-YKhYxXz1dz*H6NqwU}A` z(%3mgiS3fgJ5tW~_t6-c2}wG-8CkKnHF%$cJKO_{9UjHuI~tMPJ}z7l?LB@bIWyB( z=AlL-kX-+%tUgwU{Tmhw^c%a-Uk5UQ!y#nr!_26vu3AkE-q9P1*q3?q7^$r^xvCT4 zZHS~Rob2-_ER|GT9@1r+dtl6FDpD{laT>UTTDFcdXg3=DS|-}jV%0sJcF})ci9!Y5 z;*_|GLxJ%FhbF4}Mw1&-qRCgt#u^Ob6h}YgiqsCvFDN6QG9=7sjukSDtG%QD?i&Vb z#2){h>sUcne?i4MWh#Qsia<6E5C=EQB>Lm9kMPQ}Ev>8)@(fym;8xkCJi9vxV9!1Q zD4bpccij9h4z{8N}jpyTjc_2_iX~7 z!fbK2N6h37Gyl6MKNntN|C4Wh&^d*}Yk-yu+W$y#JoxFr%PEKc4$Uk}vZY#QKsC@%A)4O|*d{U3GIv3%=}&xpqA>OC?in%TMVh5#APX zZ|>f*b9d<`5s}tJ@RU?vh4;z|Dx8)P=}je(HpmL07q2ocn9x-lfL0SS4TlXo7)dCt zDgRqYZdm}+#IT68Jj9bn!fb}eb6I(rdRqe*&B{%j{16HfiZRUrC4M8g?LrXb82ERj zaOpKDL<|dtD1!;5iu6D#ez%!~aAv zQsU7}jRkhPidZ>bfsYbaY4TFx$F;KOCmuI9@bgN_f_G4a#{>so%-bh_)uZT;ZIsm! zYQn&@F=oH^felCOZvB@}&;UuVs*BS{wLB(xt`s3Vl^LF%`KT;T^Jepf?M4an5e+y~ zLrG0E2JwCSeN>uKJ*FYrT%CPpOHWOWdIZX+N+=y>1GMYNA{U>yV|dkHYUXw+cQ{Iw z(D`|*xF9&2r}aYI$)M?V^j9Tz_Nwd}x_TaLNi}wjSn*~h)q)}Ypi?v$u=xTN9r|S< z#9LD~oN%`d;F{!LAC1zo@}@>~KNJgjU?YK@ADPhX%qbD6w$rkZ%hOZptLwADKTX%k zbrGX~;keO}NQn=yjp7yS?x~XYJ#3<7-5Qw^HBInc!h*jfN{Coohj_?J@im!M<6G zkN_MO)&+(e7U&q@#PcV||F};MnN$*vr4diPmUt~5HHD{|j-Hf&5sKRa`R7lhp=`za zF7P|paLJd3W5$KfI;#!`SEG2II!W^Ao1+J*@(}YZYqD2!je+#K*mbF}P$NH{j4|a* zh!X?4rULn?6&iQ#Z}DCV29{$w<#{R5qfT7T($LVX6IMxR*piLC?i-b45*XKHqI88s z*gf(@TetF7AhqZ4-dOxC zpjDahAZI9pX!`JI-EA5g;G;JokYOhNv>^)FP!nKx1Xxa#1%`Cjxhpj8p^=x3!Y0-c z?!D83QJU`u^-Dk8!;s@@P$YsA!yT_BzbAuT-OX7YuASJDtrq!^ULm$5iq0DD_1WIA zhKIV0iXStNLfiR6&ty;4}^PnK`(pW>c(XhPcMq9H(Y*?6%#By|>#o zxDZbsdcyNDJ>4SYAh-Yovsvu~*!%zKo1@!ez>RAKecYleLlf~Kd_ z-h|@OIqc95#H`lqLOiiBeAfGQgp=yWEmt7 zBH`lcvQdkV{?0yK*(d2c+NZd!U%Zg#^5?=T)B?iz9iL=tmnZXamLfl8ms$(HqvkplQ2eR<*`F%X@ES;y%C2xn;?bxR`uct1l7DTFEO;af)tB~b)O zRzeACt>svXOSuAQpLtIb4^j@qLmNbXAFBgTJXa|p!Ny;htT8EtoXr1G1V+pi69xGE zKK>AyKGKGJnjN}2L-phtTc$HV%^eE$PkePKLxy$x+Me4ceyr{jCxvT7TYi01i%7jR zi1)N(KCNJ6Gr~X{eJ)TcE_NLoZhQxwu;qJTw4Wa_)nTN29^44|9S|ssdp-z}e;_Lx zmIa!D@sJ{-K6YfAK+`?~3ryB8CGf$qHyR}O)CAX%JZEs{J&#EZSUrCt7`e(Ar+~0o zWE~`0riOTvjpY%h0^KJ|XGen=qybS>*be2Th}t`@>bHYbwd&X&0adx-)olwCBO;>u zVmY~XEDn@piy#FmAPZEf6iL~&b#yEgxVKnitgzrppezR)>cX-vVJhSJ#r+;<2rk3} znC&C7piYdRFfrLTLVV(2fY2LZFkpWMDt2Ywb%fI`xL6cixnPH;=p|No*c2$CZzPfRXiI$gTfWp#Xz`2I&7$f-?9Q3S%kJzdHSk z-s?Q+P7r4mS4t0srmPvE%~t-~9iZIEGJL zn0>#kE2fbD_9=Xhd7FgW_j{`*{~y=8UYq}xf@u7UVUikZqK)L=N%cO+zT!syC1k$J z{om=&&k5=81(&RRf)N2C_{fs~lkw|8z@51JoE~bDh?lGkLN#YnA-R<(sLKK8)$Pu~ zKHz%j$7&rw`m8AMQ%ec>Q4Sl6=>tTb$^58qA~$rHsNCQA=~BM;iWS~J`{8^1sQ=^l z0J^z=^2dEYR~LfQ>1X<|aKZa2g;lQt#v+~?{5E|G}udwp&I9g>HF?QxU0JX&3GmnFRcQAKyL zm~mf(%bM?kQm2`KXU{|cudu|=?a*g$;n?;r7(3F^+d?ccm4S-7)f1GzsID*q=v-7tJId9!s5@~CC}>B=Uu3n938+l67>+`O=BI&S{G3VlC|5P zX#6fXL9qFwylS`?>XnHw7fo0SNB)16aKSv=^hLNjQ1tBf1E_leen5X}OX7R3(++4k z+X0_Be&2{}ww&V9Uxc#BhyY3@*&Dza5wt%50%7Pjyx}>otY3ixLr(#W{Kiq#lWiN& zeww4a)7aRUqAn+gpsJxEalPG{78x5`QX-!#XKHFn?b6=fzO>cuRIb@*rhC3yt1n2y z!I7H5<6?!hRC;=PiW?Ob1xZFGQxH8uHepo%6v|B5Pg|RpxAzhp3}*HDa=p~ya!Hj@ zlG1KAmCnq@%zlxuqmDTC* zw%slGqvF2=p;bZ0@p919+p?ayP%Yb%7SHn86R_`Zy*o&rs@d$kD90)7>t6hPR{B92 z(}D7138_zXX<*Q4_zSuP{X8}{u*lwV8+b3gXVfRn>POOY339r4gdxh;f0?NKh(b8qq7|7%E1 zEg5Ba17d^v?6ew16}i+OMCd9lFYi-VMzyMBP@avI?cqji4aG5T zcI!FN*0Db@tfRD~M8HHwp7|Ws>NcFZDqBs*CMP)~@oTNhOBzBhn@6_3vji*`Gz-2Z z;;yLZ=vo=ZNlblLor6ihcfoPa>u0UL-}kg8?fvoekOR055n{#y^2}ISN@{{{wX32} zsWL^Y*-EwXTUuJ0nzl*1(M;BjD+z1P4QI`S=%v4)pup^N1y(@2j&XSB&bMy%;L%p9 z0(9@#JnN$41N3bKZ8cOHR=kQd#D# zI_+oBU!YpKYFD=2VY_;R`SWn`)4Id`)IV>WoBj1rY2O2QU56F?eppRn4AKH!I+wf; zvAp&EypPUWr9`}Xf6qY_WKEfFvZ^=GOq%$~cA$$a>1Qa%JCGKtU}5`u9T zjll2XAo3*3b21t88y*>`9uMeBOHW zLOh4J=)-DE?lj`Qrsp;ywbO5EGog#f_xuWZnG^vlmha^i82D5AL4|*E2XJ(_gJ@p> z^C^(GV8UGSoD}`2h8+^-)O<2MbT+$uJ%zObK-;;n zQzUN^H@?&Q6BFO{y|l^L#d$QDGGn@Cx0uwJlp~wY-@Ax+%1QEbAZTpac(?oTm|M`5 z3n*9>jlcE7C#jD3r(y9W=yhVqODBDeFu(2ff^fCSXz>=FU?4aj8hvHiSk(ffuKFA( zI=Q;c_dFo&MT|hm?fQTgyf@iv^PMxCmgc%Nyk}hgt*^eD>aCLg`h7+yU+wLzf4$3= zv?{}Jo3P-um!I(+M^DgW@|gOmvTr<-D|7iuv0LbA_3>j%x#)W?bSmTCB&%U;%$?tAcZ<6yq%2YIWTVmMhI!+rP z_Q^e7;>{88#vs(r3=tIku}23lEvzQ_CB5pmguF8g2oDxM0N@i>-vNNyqdoxkdSZT` zkC=I{6(d+p^1Hr5-@suAAVfUwWB6E6J0W5*&;-0cIdgS?n#FMQ<1&y~=b5Mln5ntR zx6>2;rev$LJ?b?UM>|P0G&WrPT!==c(d&1+ZjWS80-B!x;&F|3Yj7|)irwPqLa|IY5&++#7RC75f5G+4BmA_s8QeA0d4_d`}4VKyc zyZ$=trq5-w#X@ELm2(6h0;!hueeim@I!fS5r^98m1JHHN@;J!)Ub~SGO0~`4y4vZ( z?By|~hq`WjiNlq%ozUtMWA|~$ol_K~oA~B29JlyPBwT=rhJ^5KZKC`>4MsISkgLs5 z|Niu=TYP!Gaci>p8L%CFNQxT`W+;>6p1)nbjg3HNZN)&~G4cv+&i0|3Y<7Cp=B14z z%ZVDp*Wy0xH5;N!IvTFv7u^>R75vk6qCnj265i$e)AlVWFR9D&vL`s8Y|sC;v#~vH zU8pj83;6Jxh10yxkxlXzer^6zwm0^E>KHm#zc_4bAb+@bK(A zV$GOym=}bI!P-3>O%j{-`>HfQ`ZTS8W$-*(H09AfKc#)C^%eA*=j?WN2!M9Gj$?t7 zedFOe%RCo8I$jTf)h}((`w)?d(+-_odsrU10G_4XQT28>Qc;-B=X?^+lcgdXS^~*Ih+l@ zEhByv{rrXhN!wnce_rkO`xaUIELFvJtFKzH46jXbWB3Yl%8{HulUC(S7?cZM; z-T7@I7Jj89wl4MCgd!pNZ?+9f!?9ni5_R|O=eN(N$1dQOU)|?V&g0gs&-SX1{$qR1 zCqZ9O6j-q3H)EjwnIA9G(*4|l;8!2vF5vNj_yxd&_eT4n51bG1V@>~UJ=F(g^_Xo0 zs9L>;jwRrg6ZQ5H}M!NcG40*M6Z;S)ChRkn~}>WdbKe4twg^ZMk8cy%PMV6 z3$&dSXTU)1)DdZ6FA{FUDC!9}%`IBgIV3|m>Jcta1c@9J2SruKrQBZP@<_$A-1}-(vY&6aOdEVMvZ zr~QF1f&*P+cnp05IWclr`}YQ_^GQj141sHITo3BJv)-u)O3h7c$5bf8OVVh6!94Yd zw7Cj*dN?Q~hy3`4*2!e{#=z)B>9`5UdHFXIqUUu)lDvJQ$qyGnQtU^)S1dE%AlU3~wtAPPkSrS~S9irWL6( zR}fpOtA&DK6VGB3u)lV32#~-|H&})|FHMl>9ovw(S26=>n6NkC7LFp&J9eilzA)m9 zu$h@-QV=tB=Kp?8_T;LT10$b1EQ`?((7hS(SgB++J9fp(tQ&XTl{7FZYGUoyyUYh4 z;iak(p;SRDOWd#9vUA|%85nXWkBgo8+Pp?}dlcxB9(ZEpVW@x@S^CuWJ$Z%B{cs$QfB4{>>w&QwN#!@h1~0s5`7^F6LVLc_r`kW2&`Yu|fV zkzEmiSP`WUsy{HwF~5fzr4OT+xL7w)c!MQGyE6%TrI!)H%&f7MrA9OR^b^9jgah)WTCJ6n>#)6IB+C*fJ zTY5Ca`VVQ6*ds5d&ne4I4-SmD9);eTu6;OLDymm`84vDTx16;mDFk=PKGTiK4Y<{p zdTct}Cdry8fV?8?&KH(G(2OIX>b!n^`bZ9|<>80UtF7)?hlaOGaJwdc^*(}+F&+ti zp-m4q0zCYt00+m1VpjlXsyp?gUVh;p06dZE+dX#l*$pHZKw$JoVjm|kG6SN9C_Pf+`Cn)Pv3F0it+HO}vsg2Zo=r{}fIaVFJ-Bz={SyLr8{ zTG$fuP=lR;o6L*twO!cv9OyL^s*f3cCJ?Y@dnJX(mO29Kf*8&Ih*i21>I0I1GW2e0 zlw*eK7HQ_ZgOaFT^#0>#hXij^j3RCjORt0*^9c-qc)7z*+drKo0ey1)PxnF6OzPOeYnU_smvzpMey)uFBD&YnwD%Hqr} z9?ewwqyjFfsi}5AtCt*nhRv?BpEh)+wy^U^!C3e^bM032MR=hW+BRDEVQ;s`sUm6~ znsU-{jZpH(#{r=@BYGob=#JPx#`)nonMfCc7i#D)_Ge2cLTJ0^ZwT3lR@~$Hoq`#s z^mUr9J=W9-n0fHgQJ8ZEUR{~;wkf}ggtH{L>zM|!j}xiC^6?YD;cg8eS+XYms_A@F z0eAGGzJ>RQZ>;aL!_(kN?}8@)N8%X(7aG^EpTR{QQKr~FUyQ3a-a+4N|D46piuDX3 z-DtdDK$6PZ#z@cLZ$^sX*nd0L1wkW#fT&9QE;bZw!99pkwXI!A-}tX;R$M!M!oxc^ zu>WcVk;5$ygR-1hc50byy_&7GbBU7nNjvw(S(L{$xrW<@#F zzkhHra5FG%cWE#KjE065EEp6O1@8)(S(pjGG?p?wl3;fWZQiR2t28Kxi@nJsBx-5- z8fsws`drTut3L)tiWOFwfDaj;opjiVi;nj5re=Lv>&7drDrDy8-CEd@i61V4eq?cZ zWB`)M#meJu%u7rS8IQcQBDB4N(I75r3aedKT^Lf0-<*s?$X*zj0KEp`8(`TQ5*RoK zj*B(BmhR7xgu3_g4RC=C*D`bPF%1U7RA^#JYoDBbU!#_DA| zyOF`we;M_%k>P7i`##xnH+*djyc6tY&{+$sl_oR+)xJfj3*mR+~ER{r2YLNI!D($4gRB%aRO#4(XtUdxZR7!oCo?rI^68q=?{s!BU6 zch}U`$5Mw&fa3+8gTam*8(fq;+AFkVaiPqb10SMWjZwyJXLf4B>cEHdo4L^V!Br^W z!J$REluzx{sIZ{G8D-GXF`Ya&3k7-J)XeZ+^DM%2p5>Z>>0-IfdE947T1V$g)5*!1 zh+}*iMEc*>fOI5+Ym%X*QhwbG?b4pQIIKv$wXeQ=| zkKd3&Y@|x=JJ8y!or!F=vQl3k`4X3OS=26@KNQdR=24d#(cL_;Z&)62Hd2+eTC!X1${|@C_%pgUP3GnN zyy%$8f;4;0W0v;fma3{MPZEp7QFai4Ep@@;7)ayt1g@R*t@$^4(4zO+-}DB2`wci- zT_GHOZ7kDT0~`ri+2i;qW8K~j64h|cYwDXGJ|Sp`pnR!_<#w0Mead&pmDbb^f}7}I z$31vVUhO~eh!Y;&@=U!!WV3oSn8j-9_gjz#oQ8#)atQpGawE95+pl|tfTyAfRQuYj zxaoB(w|kbTp@cB!`G$w3WmDAHag=o>S%jmJ!kX$syHnP3?kBjR`g3nj=+4FKjb>}D zB2WA9Nxe$rh&3|CO@jW);{{=G-=Pcpa_C=#c$s=S&gob5**QBp*{4i;)>5>J^F7EI zM&nfDmgZQ`CT4X?qq(WE#(m||wHmbY>P&ylDkuBQKT)DF%1vDd%@d!YKBkz_f@D5U zFl-g?KWZC(6|p6Jq(VydSrLe~pwJrvHy=q{u*G72Q z@{N?~6r^<_qoR_UtT>8L0B6vq5o9PDUft=4-14j0u^9ree46KZn;E92DsCJpE0=y? z(!!j5M0hnY>iHE?ocg)v(dP~!gt|*FS&I~e3T8?)yB?#!C=!eW47t)(Yli4+*V6kW zRC%Z5@m+0lZEEjuONNz8xpxeFycHXc5F{vwk9wAq))ysosg8td)h5}(LYh9ob2J-T zUdp7!g?SaYKQtv`FPPzCKTfGeOb9D`{i+@{J#L)OER=xl?B}dzRzyn`RT&`_K5?Uq zRC49xv~ul5XvxuB(c> z(-nct-QpO+dJPNT4R)8bXe@w|-DijSLJ-44sy3s()w%t|fn9R(#hw_c{N2}9$i z-$*>Xwg^0uCcQ)=4JviBxS`Wr)H!^QF8xvI@Z8;X0>>1|1lt+Drwt{iKF8r&LDJ`8 z)2(h6kx`ch3QEp z$Q1Q)_VE1{P5iC{kr8gzp;Fzg59vQ6JlNN9@m-k$Ym)4-r`jEZTieukU+lHGQ0~r@ z+%7g-JNUuHfZ@rJdA!vbQOyiT2Dk+mB3QDfY2 z4W+cod^oZ+j5wvoJUaGB3`zXEHue_xuCQ&4uh##Ve@O+8bYWQJt#XR?82Q(&Q{MUZlt>#L+rvH;(0IUsPl(HU3z9= zfyF~aP~aTvCGmp4SSB=r2oCQr@!-HEcUuEGWh14YX($EULJUTo6Y+Cb5n5f_-=9Bh z;s$rN5fX3lg2dLjC!%SPXDRo-xIEzRGg>&yv^8(M2qcOYQH2QysqxfwusJ<7GveJ> z?vl*?^$ukUX~>A^=qdF;&fd3w{H`VHC)EQ3^*5CS!%55|> zZ}@`nDS!7#IV~n(IGoS?y5};LxTb_8DxzeVfRMP0vU8z|c&zpcVv*b(m{${gN(TcgrdyXopZ z`Ig3<$+~yru<90PIBxQ(4BjA#DPLOMby#7^Q~;vftvL7+*{(-yd<kS-EUk=yI;`3OG4OCQwtPkIzVI($R0-$$oY4*0rk(l$y|z^GN%y)~_x$OI~D z>$s>zX`2qYnq|As&pWh>USTu}Y3d4>#s$Z1tV4FOS$o;8(#kzq+Emk{YV>^N3yEE5 z-gGz+nI1WYR9m^cKZVdF*T%}4M|Dlr)?dWM#uvR=P*Ky&yEXOp`>WG86Yo+0=hTb? zD!$xL{d0B%2fZ;wcYZunX*n1d`z}7sDrx%s887=6TfA0p5ZwHoZOG6j=lPmTmn=4; zGko5v%=;vC)&vGZ^R~cDkgAJ^f4iZJF3i%-)b~%Al7^iE+w@+9yFxknnHDTs*IK^5 zg;hy3&Oyt&z<$4SYILzF3H2BT=&slOYUi+HO7^NREoZF~|NkFMi|-Fl6M zI7)@fBfcs)MqtYBX|P2-UpwlB>b+S>eBh}B7{mTAuKwxw^cBgl=Arju5O`}>^dcry zQ%iO{dBcePg#9V%Lt7P~h(PvEM?WiJVb}fh5k+Y@9|$iGdY6Jf;>Lv-xakM7Eed*# zZaPa&mc~jbg4KIQ(%!5;hF|U8UpBM*(3eeFocJYlII1#7G8QByL|lGQK5+}Q-#+&V2z)7dR=Ne zjB$&&6yql`%fY2zn**#jCFz@@RvpOLm$!l(7FgZsEx(n!NBH$}Syf}9i20-{yiIrL zNrhJcI(sJ0B#3N336Bw{%gQcd@!p~@bsI1%Hce^|a3f-(2$KB#d$2-8HY zc+ya=#3jl?T*(HmiT^%N*ue%Kn`V&u>fVFViqDK&%tsd0^vts;v}x~4bM^2Eo+T|^ zy?(F@Vk7eVAd$hM{w^3ERCpUPor~JFaWYM{7~yLRZgYWcHEi@WY?}A(vu@4}_g}4i zQQN7`%IH zQQ0)=+%IJTiFDHajW16%ZG*QxkM3`XS|>K`f1uc089=pwD`O)+qkB};bSc1 z1-lCkaza{`UmYVAOJU-}i3SvT&N#Bm_r#@HzY*n?F@BolWtq6UL=#`N;8CJYj^*TH z0)-!!#YVEi9zdSvo1cIsed}t_QmPKOn!rHMSHNTzu8@PJ84Si2VKsa!!v{OB1UWI4 zSQgy$Fd6_-sMRHdBNyuM3q^`4R0dg(uGn!>`6^TjIm}Hqy)Y($S13pf87nB5e$jU>K&KaO7D!i zwwne71U=zVkjm25K?Ga@Eb^?aO7cSLG8%6mJYvUN)w)Kjqq66ed(LpQY5`Vbi5$7D zB86c(AD&3)8`I+dcU=KXQj=|wJ`wb9Lri84%utcB9Ak7b@hJ0&oPTnsAKBRJYhz`p zm$&?w-gB8;P+^ApG=4~?8;t0&Z3)GOz2fnVz{sM}Zk2hKKu&*h*4PE(Gn95h6lTQ! z0@n${xP z6oM52py2ETQQ@9MwMyOlibPhe!wFm&se>Qzn}(MW*Xap&&|8=ByaZ!;k_l!3ITiI< z2I#^a+miZH>b@u_z*)BdMsD1cWy}-W+uJ_qh4zBT8NQ{dASGd4fE0jf(&!V?8&&+@GHc6UR@Rbb2j1@ zbYGrmj}(hv(rU${jHbGzb;DhkW+UOt`hbn%RF>oybqPwlDwTt;ExZr>g{01V&1kB< zBOIB1gXHHOGP&rOIqzMsK(AvZ%Ur?BL!pc65z zD}@O;OVlsaCV<};U+piKobtVzg;Y^^cz5gTHTbctwfPFaD)#EHy_mfAXD)D0c>CDW zVzTzk10~@&lX1;Mt!vqOp3`f|ijojuU9%;68w|&I-V9@0bjEoCbvyfz;MG%m*IfF! zPA>edy}0}vOF5ug2TG|UPj={yY?+PMJk>jQs{4aADMnv(1U2bUIk(GLWyfI^kl>6< zoGhtbm}Vb`-~KvZMxC)sU$dxeN<@efQBHLv-9*)EeXP?`Ep33yON+>BC4!Ri#9A;H zLP}0Hp7Rm85o&{Jy2RFZS=lE^E}7NHv*g`$VM1tJOk>{a2(m!)2i8O?xyBW-w>`ga zw^H0%aZ7mVDiNL1xA7L}@q~rfpQ`e*-b-6KteGy{aT560|K3|RJV7)X&A!-pXH!A# zLq7hKzsn@4`>r=IrJ(c)s?8wnf1j6vzso1KY9>qwOHyzV>Pz3`* zF>lUmToE>}h5;%J&dim>$cUs$dx-iwAEYzPlhGK(v`KsgLO(Pw5grW`jL(YU68VL# zi{^S+c{u9>Ejq?`B&9OoS1PL%r~-o>33e#Se1_2Yb+F*`nqVCg^aB#FedwGBf2Uv~ z#r2RJAjY!BeWBCJ4gGz6S(E%s6^zsv{~Puj((cZ`aJwU@mi|RIKhkUO)HZr4KU+Gl zd>0L6@hX06V;+)?{0cV+NPUb?8*9XjzK8?e_Pda$DsEEO*c|OFePzIpW#MMg*|!5? zSYz#c%D5(Ws+rnIh%+AxZ<(n`p16J0Nl~L^Hs3JWk=!ZS*kT`(M+_A6h)FW4?wRV- zK@p_9Yc*7naY7KJ3&oYkHA+RSDMDWKWPK@9=LhjT?i>z1JGcgzg@&&M1IG<0k)UJz zt7)K*d9a@soZF>|OrnFH=vTy7p|NVr!{t{{PBS7~NK_r}ladIkpxLUT-NZIsGyap= zMSIl%(=<`mXKc<=4zK+-S_XH<$RBXY9JyNMJu4l=(m#ETOyf?#{C0e1;v-sN-KJNw z{922Kxa}ehJ3| zBT?TgZI0iPHlkX-;<}9|peCn}wjYTL!FlX^CB@FoVskOAXn&~KS59IL7p#$`1l zH>0vzDS?#m=mEg`=FT&FPUoTz6_2(x(mb2I2KwxqE`n>%c^}ot(+cT}SU`eKRBkGr zURj~RpLlVxc(0aN%j-=78-5@QtoVPIZl1^+?`5Aa$?L&$3py!8PwUBAE4C7>-bk zp!Tz$`D+tzGA)Cc_dPCa7_`8xgl8bpaduAgBI;TON@GTdR{bl>h57>cUP`gA4IUhe zy1b6ZV%&j>7b-FDOT*LxRs$#G*|n(Lr2dwBoi$nt=Q7%xB?BF`^-idbUzEBdLLbGgtzwRt(ybO+t1{nnWog9?sFNv%~Cnm2EcFsOqc# z-^C42O1v&vrKrz?L|{o$d8t{MJ?Z_IV@=S4Exoi8RrNC{+K}4!-=!PfBV!j%TJct%X|9g{IzZB z-?dQ=1^bP*vcW zdCzb(OCTs$hAT8XO`KnsjOxpEnKJRps?MDA^*ig6bELCZdT1hG?pPz}s8IMG+(TOY z`4&hf*|0BT^Z-$iEo!R~dY2goT=KtlhT_=1ksSHl=TA&?6sY?P?Tk@TV_EPVWi>I` z&{{Vb=07Vofkdk$=`#f2(C+Z}esl2F+H+#K>b`zEWNUQQXxCUh92Fk^yy`H%)ySjTE$@%N5E`{uBw2b=J6At~ zPb*5mH@(nVu43YS?h&(yX!mnTQI3uT_+T~3?Yv**HlyvTOS>pCD5KsLxdsO%Ec*A9IRQa)X}f>+ApzEme%CSA6?k^%>*nW@UBb<( zNf7FIK}u#ejC)sm%%a6#JVV~lb9q{@V-7_lEn#(0I?6)z9u292$tVqel067*t96Hq2qj|w6yHp;vrnVR^98j1#*m>SuS z?>1NFBd@w0f$Q-J40_3bI{(s7T9*7u*nM@f>FuFTjV=fkSMY^hX2?bV#y5+P)L#fU za7HP=Tf~p9(04OWg8*&#yJsLV<81RJNKW^NgRn3+B97GJOIT*spDg`Xyg9ASPEe#_ z;LDNfPPSfbfw?eeafE82(k;u4f{c6gvz-m$=fd{IwPapl0fM5*j|T{+vT2h z6>CXsMTOso!x!9H1fwOa<^t-AgRVB^zn+C(OqV8YM|cC#~kV>u=tB>QMz z57k;)biB%ci4S)DRGd!HjG~>B_RG@B$>O;Xnt#(Q#2pLt_ixW|zE|-AGahmauF;<+ zS%8MLwYBlA>?-O;C-{DqsJ-N0T#7G=cKvqsL9F7W&2+-ve0(dSzzxXdJ%aMzi2Ig!oym$_4C%oWnSTt;ymAzaJ{N--jPblTLa`iHKBR< z4!*c*2b>6}vBSQytT_f{kQhgM3WhB*H1lU6J!74X)2h3#O2-~Oj5p0kY`3v0w7 zVSL@30HtdW2`>x=$YW{UL?Pe9^f7f3m|e9Q$@Jw6yZzcJ@xg5hF7Z;cI7>_3y5{W} zEweT!)(S-SJ!VmvwW+!!iQ*%Sp5SEjy-!?R4;$4 zO>RDhD{mgJu?E|rj@4`55__6t_fZ&PZJX>Xf|W`&2bOe5jpeWEcOxrCs1Wvz?s#NJ zerS{xJTd8U7nTx*qMSd-$r@Zne`r-_>8Ai|UBlFrDu8@%oCX`$VQ&g^Ul$U|CJ@|T zx(Mp#3y_VN5ojg@GpzZGy6@%rfsPl~4kIS70%H-LRqjd&vKH~8UfV6y{jRhaQcZYW z11Z@TWo86oSH$6bT&uJjzpFo8=^5vw>0@NJyebKU-X%H`aky1WB0cD)X0{9hd*WGj z0xhsKGI=!$4ieTw|LC0O2Tm*_9Fy&@xF&FBGn`6LpBngmNvB%FjLD>Zei8TcmW5Iei$^0hN9DKU9nOALq4RRf_r|EY|6yVC79P&}-uj$a z4uDDg+iG|vA>CREnft~U)V}S3eV`Vc_^r+{DK0h4i3eQ{&V)u_uz)auiPV*ypOl<< z(0Zer6Pt&0Vto~g)o?D9KUa@M&fGeGMamINn2g$zU}ZF^R$duX{5wSNk`1n6rzhy( zlDPiFZr8|-^=7-%Ou}8P#aoxc|cj9P>iTmY3#6c5)zFyR^nLFh9+J@j&^b@j0Egj7!i&&%%3D zWc6}J!ZJ5iVdSfozR461{UjqK6y@s>IL$g82Q%~8>46;lt6aAJ{Q0Q zBgD>*Eh6u?I<~3~W2&f*YGJMWQq22+sfGVQdXXa z(AcGz8x6`9^{pk}M6~ISnUE`~M`BPzzm5sIaLH>$9Ww&&dbazaQB=MD4V1u-?c;rk zMB=b=d+k}6<$@}^iafG*5zh7|P(hylaWQ|8CSKk6Rp|<0gbil4|Gizs#n6kt&5)+` z2Faz;zW2nbF>eE%Ci4t(ObeO>s^wmz@vNS1CloI|o82fv{;@KyJ{1+etNV@7QtL|P!h9M|G~VFzdlo|IN7Mpo8(fK37vXn%VGf}VHlil z2jw}kKi1JjlWB~+4igm`iX<%J=XYRS~MqlB0a-I(%I&<^?zd@*6B4=V*e{FlgslOix!f zQPtZ#sIxU;S}x;?Y`nakZ_j}R4}7b58ASa2;2b!{^3lrcPB5AlrwwFNhbEG{Sl(1Y z+9o=FDP-O4u7PL7MWcpjqZ`n>o!jO71Sf;q^8Fgrv4{r!d?vrxSuH+kRAqS2i>bOb zYxcZjFE=toiq2j0C5=U7zO7~A?qf;{TRVkj5Bpd{{&j(CWtSogtopuQ4_<2Gw2dl% zxY0S6$buS2vjm3qyjxNAvv0)vQXG|ro<%}#Sbu4#uR+_Hqh%R-z*jG8XP1c&g7R54 zKRmaBpC;yZ%In-47+5soc{6>g6jW)1T5VgNjyP}#m|l|`#x1vBpHdePfKmV2KwqQjI2MF&<$5IHZJt| z%y`hq*Wv55un`{Mv5W?mp9sZtK*o_n+}nAOAgNWgc4@G{DAqZ4kA&nW2$^GHZg{W+ zamG`cQTFzxwKACxVw&$Lflv@Yuw?;fTA_y%wHFkag;KR(aLYI$J>pA+a!;`G6MW>p ze&n2#6}|sni8>xoNbes0KXqGsJe2t!o*@mUX0+NU%#b#;#^|yxDKAm7 z+hrYHbVj)(x)2h>V&2Kv&6M_9a_i{!1A{HNHqUkAv9H<&KihO4 zT-zVQprd8_VhdsV}Sp&{sMmgh0Lk?_tImsPAZO;7tD z1MaawQB$4$F-s#;AJqK9>1!8sZt92Lkh7&C8bU4*l*2;Uj$ZTMOo~^u^T8_Q-E;tW8PYeB|ZH7}5quX4ye2 zoyTTDhd9{W=Lu`tPPXgj{B6Gbh(!^C=MM^Y?|;934VUc{lw`NMK5aPs@>pJH4tBs~ zz?l^Fa(U}L+HN5#9D34y#_)R4;JzyRfY*Jt@@e^8KE<71{~~Xkv2!jx`AVv^*U0+l z!z4wX^YDM-=-N}1H+@G+LTlEVRLgIg751h}SQeK7nQolK$l!QS9F4?tE@tNl91q6;b$I z`?)gS&}a|(AO&ZLTYgxZBIx8hCKj2N$W?MlqgFuAc!Of@;v+>sf+2x{DVZot)@2pJ zmNrsm`!`sQJ648q$Q@u7gFU>lsbZW)daqo;<8RS(f^N)zM<->IN6n0Rz8QnEx=q%(Z|Mm3}uVaUxJ+vrEW-=;`_JXD4fY z;m}8hKi$5PoF5EG*QVo!A>uQFYW|F@AQcbHQ6Bs7KJ`o9# zJWn=G$tvat1QaCfDlZQ?m5`w-Dqs8OAk+JN zn)x^l?$HyRckzAhP)i&;U7gT~H#Mxm z9=@ugoWWHL)@fLj=X%OqVrB#)-+pq29GWiLhgj4qd_rFcJ6;$zzr6js-Qd~2>qfPg zb<^{&-a^HD^-o<_)WzZkE{M;G+7z8!4T6>DH2=Gd?mZ@=&nF>oPEXyg1(eTpw+gJ^ zw)M*;MaXg_1~;0VQHd_?LS*XHfV*C|VB=A)^Y`i%6M~BaOITTp?!c>s@v9jt$tHP z@Vx0+U3)Wd;v(2&T=0n@q-E3~jF4?A(6JXeDFF9e0L zFX|;a*FUZpQ^OW|>Q?=Z{nPY-+{TU9I3?uja7Tu&gOg=4>Glu8-jzBFt0d}CqsiiV zz5MO1OD1Q4QTjq?rL1`N&VWF_HCD4{Er)Yd4f#wH$`m2mCiUD;_Dq@^!>ztWZ)%NB zLb`8|%i|hPk<25=x-7_VVMZ+-D7}0&9cW_ttjzdoJe=iVAXDl$i2a6x2yS2@jCe#w z8rQr=`H|aCQn1puT#i0cA|m%p=HfY3v(;vHa{dc`jd-hztOh#UmCBx4M*e4NT*J}k zrIxO6_NNKr%tUSu`sZ@;)G#NBr1+qWe>v-a7|Cu$Ypjpk2=_LgZL4#1FlRZE+^Y(s z?RnPnrh4&$J&hDl4td8jZDfPb+=CCI=HqD5B_5}(4vd=^$bVoflh{FrOd|`PChS@t zY#SM3z#_G3Mdvik7Wy2tXW)W4sS}fqqMxljhz{sQM zNHOlK8|{YrUps(W`2ocIy{`a&jin>Y39|sQ1R3NOkb(ajNg&XIMHll_fefAh3;i`C zHIpa6z|=4*6}*RUR!_0ypkc*4oS_RB0gkv2bjBC~FkA=25|o;!vB9K1H$l9u9D;#Q z`zt$IQ{j(t#xQQ}i>?tJ!Zesl)hMM}@|gBB3OVOd|DpxUv0PHm@W^IWvl338&P0-N z`l>2%1O`L{0Nx3#WdI>!zG?tF)3Dzc(WuW*5QkBnp;7d2nNy20r$NXdAdG=n>v2FL z7^&e*ErMzVai0_bKac2ZK%STz2CTE8JY?el}_gaXr-!91;}4eq#Q=?mtp%2QRV8nZ6neg;9Cr+2UVbb zHyZd3#vMaSO|{PbsqmzsRVi@Yv;Z3~{(z@s&;a=z`1P8JA4sxg3xVDvKnw*YFEBbm znJxq$z_Td%V@wLV`$k|2ki6Hpg3Gza#el3!x(|kfjMb3CxO@Hi^Huel!cDGsGZ&zT z#n`u@+%H~Ah5@)T`X~2%NA3xM#%>n*<`Z@u=#dIRgW6Ti`UpEL0o0|I3Rp!~z%DY^p{xT@cJG&9V0gG>r(440eJGXV<}FI G$Nd+Ug0yS^ literal 0 HcmV?d00001 diff --git a/versions/web_static_20240712111744.tgz b/versions/web_static_20240712111744.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8a19dabb725c51bb0a9478dc733a6dd7076c4628 GIT binary patch literal 19300 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 G$Nd*5Otd=y literal 0 HcmV?d00001 diff --git a/versions/web_static_20240712111825.tgz b/versions/web_static_20240712111825.tgz new file mode 100644 index 0000000000000000000000000000000000000000..bd2382ff46aec154aa789a567b979a1c22d7e384 GIT binary patch literal 19300 zcmYItW00mzuw~n}ZQGdcp0;h<)3$A6+O}=mwryMQ&i!I{Z$w4LsW_FVvNC^EJx>xw zK>;~9C71z$Ug<)6E30<&nqpHa{8ITPc83%X;wrgNL~jf2Y`^G}uYfTr>zJwI>15yb zT4H;~^^yR1yl_Jv7$wsq^UyzjO;CrQr=FWgh=(-8-YKhYxXz1dz*H6NqwU}A` z(%3mgiS3fgJ5tW~_t6-c2}wG-8CkKnHF%$cJKO_{9UjHuI~tMPJ}z7l?LB@bIWyB( z=AlL-kX-+%tUgwU{Tmhw^c%a-Uk5UQ!y#nr!_26vu3AkE-q9P1*q3?q7^$r^xvCT4 zZHS~Rob2-_ER|GT9@1r+dtl6FDpD{laT>UTTDFcdXg3=DS|-}jV%0sJcF})ci9!Y5 z;*_|GLxJ%FhbF4}Mw1&-qRCgt#u^Ob6h}YgiqsCvFDN6QG9=7sjukSDtG%QD?i&Vb z#2){h>sUcne?i4MWh#Qsia<6E5C=EQB>Lm9kMPQ}Ev>8)@(fym;8xkCJi9vxV9!1Q zD4bpccij9h4z{8N}jpyTjc_2_iX~7 z!fbK2N6h37Gyl6MKNntN|C4Wh&^d*}Yk-yu+W$y#JoxFr%PEKc4$Uk}vZY#QKsC@%A)4O|*d{U3GIv3%=}&xpqA>OC?in%TMVh5#APX zZ|>f*b9d<`5s}tJ@RU?vh4;z|Dx8)P=}je(HpmL07q2ocn9x-lfL0SS4TlXo7)dCt zDgRqYZdm}+#IT68Jj9bn!fb}eb6I(rdRqe*&B{%j{16HfiZRUrC4M8g?LrXb82ERj zaOpKDL<|dtD1!;5iu6D#ez%!~aAv zQsU7}jRkhPidZ>bfsYbaY4TFx$F;KOCmuI9@bgN_f_G4a#{>so%-bh_)uZT;ZIsm! zYQn&@F=oH^felCOZvB@}&;UuVs*BS{wLB(xt`s3Vl^LF%`KT;T^Jepf?M4an5e+y~ zLrG0E2JwCSeN>uKJ*FYrT%CPpOHWOWdIZX+N+=y>1GMYNA{U>yV|dkHYUXw+cQ{Iw z(D`|*xF9&2r}aYI$)M?V^j9Tz_Nwd}x_TaLNi}wjSn*~h)q)}Ypi?v$u=xTN9r|S< z#9LD~oN%`d;F{!LAC1zo@}@>~KNJgjU?YK@ADPhX%qbD6w$rkZ%hOZptLwADKTX%k zbrGX~;keO}NQn=yjp7yS?x~XYJ#3<7-5Qw^HBInc!h*jfN{Coohj_?J@im!M<6G zkN_MO)&+(e7U&q@#PcV||F};MnN$*vr4diPmUt~5HHD{|j-Hf&5sKRa`R7lhp=`za zF7P|paLJd3W5$KfI;#!`SEG2II!W^Ao1+J*@(}YZYqD2!je+#K*mbF}P$NH{j4|a* zh!X?4rULn?6&iQ#Z}DCV29{$w<#{R5qfT7T($LVX6IMxR*piLC?i-b45*XKHqI88s z*gf(@TetF7AhqZ4-dOxC zpjDahAZI9pX!`JI-EA5g;G;JokYOhNv>^)FP!nKx1Xxa#1%`Cjxhpj8p^=x3!Y0-c z?!D83QJU`u^-Dk8!;s@@P$YsA!yT_BzbAuT-OX7YuASJDtrq!^ULm$5iq0DD_1WIA zhKIV0iXStNLfiR6&ty;4}^PnK`(pW>c(XhPcMq9H(Y*?6%#By|>#o zxDZbsdcyNDJ>4SYAh-Yovsvu~*!%zKo1@!ez>RAKecYleLlf~Kd_ z-h|@OIqc95#H`lqLOiiBeAfGQgp=yWEmt7 zBH`lcvQdkV{?0yK*(d2c+NZd!U%Zg#^5?=T)B?iz9iL=tmnZXamLfl8ms$(HqvkplQ2eR<*`F%X@ES;y%C2xn;?bxR`uct1l7DTFEO;af)tB~b)O zRzeACt>svXOSuAQpLtIb4^j@qLmNbXAFBgTJXa|p!Ny;htT8EtoXr1G1V+pi69xGE zKK>AyKGKGJnjN}2L-phtTc$HV%^eE$PkePKLxy$x+Me4ceyr{jCxvT7TYi01i%7jR zi1)N(KCNJ6Gr~X{eJ)TcE_NLoZhQxwu;qJTw4Wa_)nTN29^44|9S|ssdp-z}e;_Lx zmIa!D@sJ{-K6YfAK+`?~3ryB8CGf$qHyR}O)CAX%JZEs{J&#EZSUrCt7`e(Ar+~0o zWE~`0riOTvjpY%h0^KJ|XGen=qybS>*be2Th}t`@>bHYbwd&X&0adx-)olwCBO;>u zVmY~XEDn@piy#FmAPZEf6iL~&b#yEgxVKnitgzrppezR)>cX-vVJhSJ#r+;<2rk3} znC&C7piYdRFfrLTLVV(2fY2LZFkpWMDt2Ywb%fI`xL6cixnPH;=p|No*c2$CZzPfRXiI$gTfWp#Xz`2I&7$f-?9Q3S%kJzdHSk z-s?Q+P7r4mS4t0srmPvE%~t-~9iZIEGJL zn0>#kE2fbD_9=Xhd7FgW_j{`*{~y=8UYq}xf@u7UVUikZqK)L=N%cO+zT!syC1k$J z{om=&&k5=81(&RRf)N2C_{fs~lkw|8z@51JoE~bDh?lGkLN#YnA-R<(sLKK8)$Pu~ zKHz%j$7&rw`m8AMQ%ec>Q4Sl6=>tTb$^58qA~$rHsNCQA=~BM;iWS~J`{8^1sQ=^l z0J^z=^2dEYR~LfQ>1X<|aKZa2g;lQt#v+~?{5E|G}udwp&I9g>HF?QxU0JX&3GmnFRcQAKyL zm~mf(%bM?kQm2`KXU{|cudu|=?a*g$;n?;r7(3F^+d?ccm4S-7)f1GzsID*q=v-7tJId9!s5@~CC}>B=Uu3n938+l67>+`O=BI&S{G3VlC|5P zX#6fXL9qFwylS`?>XnHw7fo0SNB)16aKSv=^hLNjQ1tBf1E_leen5X}OX7R3(++4k z+X0_Be&2{}ww&V9Uxc#BhyY3@*&Dza5wt%50%7Pjyx}>otY3ixLr(#W{Kiq#lWiN& zeww4a)7aRUqAn+gpsJxEalPG{78x5`QX-!#XKHFn?b6=fzO>cuRIb@*rhC3yt1n2y z!I7H5<6?!hRC;=PiW?Ob1xZFGQxH8uHepo%6v|B5Pg|RpxAzhp3}*HDa=p~ya!Hj@ zlG1KAmCnq@%zlxuqmDTC* zw%slGqvF2=p;bZ0@p919+p?ayP%Yb%7SHn86R_`Zy*o&rs@d$kD90)7>t6hPR{B92 z(}D7138_zXX<*Q4_zSuP{X8}{u*lwV8+b3gXVfRn>POOY339r4gdxh;f0?NKh(b8qq7|7%E1 zEg5Ba17d^v?6ew16}i+OMCd9lFYi-VMzyMBP@avI?cqji4aG5T zcI!FN*0Db@tfRD~M8HHwp7|Ws>NcFZDqBs*CMP)~@oTNhOBzBhn@6_3vji*`Gz-2Z z;;yLZ=vo=ZNlblLor6ihcfoPa>u0UL-}kg8?fvoekOR055n{#y^2}ISN@{{{wX32} zsWL^Y*-EwXTUuJ0nzl*1(M;BjD+z1P4QI`S=%v4)pup^N1y(@2j&XSB&bMy%;L%p9 z0(9@#JnN$41N3bKZ8cOHR=kQd#D# zI_+oBU!YpKYFD=2VY_;R`SWn`)4Id`)IV>WoBj1rY2O2QU56F?eppRn4AKH!I+wf; zvAp&EypPUWr9`}Xf6qY_WKEfFvZ^=GOq%$~cA$$a>1Qa%JCGKtU}5`u9T zjll2XAo3*3b21t88y*>`9uMeBOHW zLOh4J=)-DE?lj`Qrsp;ywbO5EGog#f_xuWZnG^vlmha^i82D5AL4|*E2XJ(_gJ@p> z^C^(GV8UGSoD}`2h8+^-)O<2MbT+$uJ%zObK-;;n zQzUN^H@?&Q6BFO{y|l^L#d$QDGGn@Cx0uwJlp~wY-@Ax+%1QEbAZTpac(?oTm|M`5 z3n*9>jlcE7C#jD3r(y9W=yhVqODBDeFu(2ff^fCSXz>=FU?4aj8hvHiSk(ffuKFA( zI=Q;c_dFo&MT|hm?fQTgyf@iv^PMxCmgc%Nyk}hgt*^eD>aCLg`h7+yU+wLzf4$3= zv?{}Jo3P-um!I(+M^DgW@|gOmvTr<-D|7iuv0LbA_3>j%x#)W?bSmTCB&%U;%$?tAcZ<6yq%2YIWTVmMhI!+rP z_Q^e7;>{88#vs(r3=tIku}23lEvzQ_CB5pmguF8g2oDxM0N@i>-vNNyqdoxkdSZT` zkC=I{6(d+p^1Hr5-@suAAVfUwWB6E6J0W5*&;-0cIdgS?n#FMQ<1&y~=b5Mln5ntR zx6>2;rev$LJ?b?UM>|P0G&WrPT!==c(d&1+ZjWS80-B!x;&F|3Yj7|)irwPqLa|IY5&++#7RC75f5G+4BmA_s8QeA0d4_d`}4VKyc zyZ$=trq5-w#X@ELm2(6h0;!hueeim@I!fS5r^98m1JHHN@;J!)Ub~SGO0~`4y4vZ( z?By|~hq`WjiNlq%ozUtMWA|~$ol_K~oA~B29JlyPBwT=rhJ^5KZKC`>4MsISkgLs5 z|Niu=TYP!Gaci>p8L%CFNQxT`W+;>6p1)nbjg3HNZN)&~G4cv+&i0|3Y<7Cp=B14z z%ZVDp*Wy0xH5;N!IvTFv7u^>R75vk6qCnj265i$e)AlVWFR9D&vL`s8Y|sC;v#~vH zU8pj83;6Jxh10yxkxlXzer^6zwm0^E>KHm#zc_4bAb+@bK(A zV$GOym=}bI!P-3>O%j{-`>HfQ`ZTS8W$-*(H09AfKc#)C^%eA*=j?WN2!M9Gj$?t7 zedFOe%RCo8I$jTf)h}((`w)?d(+-_odsrU10G_4XQT28>Qc;-B=X?^+lcgdXS^~*Ih+l@ zEhByv{rrXhN!wnce_rkO`xaUIELFvJtFKzH46jXbWB3Yl%8{HulUC(S7?cZM; z-T7@I7Jj89wl4MCgd!pNZ?+9f!?9ni5_R|O=eN(N$1dQOU)|?V&g0gs&-SX1{$qR1 zCqZ9O6j-q3H)EjwnIA9G(*4|l;8!2vF5vNj_yxd&_eT4n51bG1V@>~UJ=F(g^_Xo0 zs9L>;jwRrg6ZQ5H}M!NcG40*M6Z;S)ChRkn~}>WdbKe4twg^ZMk8cy%PMV6 z3$&dSXTU)1)DdZ6FA{FUDC!9}%`IBgIV3|m>Jcta1c@9J2SruKrQBZP@<_$A-1}-(vY&6aOdEVMvZ zr~QF1f&*P+cnp05IWclr`}YQ_^GQj141sHITo3BJv)-u)O3h7c$5bf8OVVh6!94Yd zw7Cj*dN?Q~hy3`4*2!e{#=z)B>9`5UdHFXIqUUu)lDvJQ$qyGnQtU^)S1dE%AlU3~wtAPPkSrS~S9irWL6( zR}fpOtA&DK6VGB3u)lV32#~-|H&})|FHMl>9ovw(S26=>n6NkC7LFp&J9eilzA)m9 zu$h@-QV=tB=Kp?8_T;LT10$b1EQ`?((7hS(SgB++J9fp(tQ&XTl{7FZYGUoyyUYh4 z;iak(p;SRDOWd#9vUA|%85nXWkBgo8+Pp?}dlcxB9(ZEpVW@x@S^CuWJ$Z%B{cs$QfB4{>>w&QwN#!@h1~0s5`7^F6LVLc_r`kW2&`Yu|fV zkzEmiSP`WUsy{HwF~5fzr4OT+xL7w)c!MQGyE6%TrI!)H%&f7MrA9OR^b^9jgah)WTCJ6n>#)6IB+C*fJ zTY5Ca`VVQ6*ds5d&ne4I4-SmD9);eTu6;OLDymm`84vDTx16;mDFk=PKGTiK4Y<{p zdTct}Cdry8fV?8?&KH(G(2OIX>b!n^`bZ9|<>80UtF7)?hlaOGaJwdc^*(}+F&+ti zp-m4q0zCYt00+m1VpjlXsyp?gUVh;p06dZE+dX#l*$pHZKw$JoVjm|kG6SN9C_Pf+`Cn)Pv3F0it+HO}vsg2Zo=r{}fIaVFJ-Bz={SyLr8{ zTG$fuP=lR;o6L*twO!cv9OyL^s*f3cCJ?Y@dnJX(mO29Kf*8&Ih*i21>I0I1GW2e0 zlw*eK7HQ_ZgOaFT^#0>#hXij^j3RCjORt0*^9c-qc)7z*+drKo0ey1)PxnF6OzPOeYnU_smvzpMey)uFBD&YnwD%Hqr} z9?ewwqyjFfsi}5AtCt*nhRv?BpEh)+wy^U^!C3e^bM032MR=hW+BRDEVQ;s`sUm6~ znsU-{jZpH(#{r=@BYGob=#JPx#`)nonMfCc7i#D)_Ge2cLTJ0^ZwT3lR@~$Hoq`#s z^mUr9J=W9-n0fHgQJ8ZEUR{~;wkf}ggtH{L>zM|!j}xiC^6?YD;cg8eS+XYms_A@F z0eAGGzJ>RQZ>;aL!_(kN?}8@)N8%X(7aG^EpTR{QQKr~FUyQ3a-a+4N|D46piuDX3 z-DtdDK$6PZ#z@cLZ$^sX*nd0L1wkW#fT&9QE;bZw!99pkwXI!A-}tX;R$M!M!oxc^ zu>WcVk;5$ygR-1hc50byy_&7GbBU7nNjvw(S(L{$xrW<@#F zzkhHra5FG%cWE#KjE065EEp6O1@8)(S(pjGG?p?wl3;fWZQiR2t28Kxi@nJsBx-5- z8fsws`drTut3L)tiWOFwfDaj;opjiVi;nj5re=Lv>&7drDrDy8-CEd@i61V4eq?cZ zWB`)M#meJu%u7rS8IQcQBDB4N(I75r3aedKT^Lf0-<*s?$X*zj0KEp`8(`TQ5*RoK zj*B(BmhR7xgu3_g4RC=C*D`bPF%1U7RA^#JYoDBbU!#_DA| zyOF`we;M_%k>P7i`##xnH+*djyc6tY&{+$sl_oR+)xJfj3*mR+~ER{r2YLNI!D($4gRB%aRO#4(XtUdxZR7!oCo?rI^68q=?{s!BU6 zch}U`$5Mw&fa3+8gTam*8(fq;+AFkVaiPqb10SMWjZwyJXLf4B>cEHdo4L^V!Br^W z!J$REluzx{sIZ{G8D-GXF`Ya&3k7-J)XeZ+^DM%2p5>Z>>0-IfdE947T1V$g)5*!1 zh+}*iMEc*>fOI5+Ym%X*QhwbG?b4pQIIKv$wXeQ=| zkKd3&Y@|x=JJ8y!or!F=vQl3k`4X3OS=26@KNQdR=24d#(cL_;Z&)62Hd2+eTC!X1${|@C_%pgUP3GnN zyy%$8f;4;0W0v;fma3{MPZEp7QFai4Ep@@;7)ayt1g@R*t@$^4(4zO+-}DB2`wci- zT_GHOZ7kDT0~`ri+2i;qW8K~j64h|cYwDXGJ|Sp`pnR!_<#w0Mead&pmDbb^f}7}I z$31vVUhO~eh!Y;&@=U!!WV3oSn8j-9_gjz#oQ8#)atQpGawE95+pl|tfTyAfRQuYj zxaoB(w|kbTp@cB!`G$w3WmDAHag=o>S%jmJ!kX$syHnP3?kBjR`g3nj=+4FKjb>}D zB2WA9Nxe$rh&3|CO@jW);{{=G-=Pcpa_C=#c$s=S&gob5**QBp*{4i;)>5>J^F7EI zM&nfDmgZQ`CT4X?qq(WE#(m||wHmbY>P&ylDkuBQKT)DF%1vDd%@d!YKBkz_f@D5U zFl-g?KWZC(6|p6Jq(VydSrLe~pwJrvHy=q{u*G72Q z@{N?~6r^<_qoR_UtT>8L0B6vq5o9PDUft=4-14j0u^9ree46KZn;E92DsCJpE0=y? z(!!j5M0hnY>iHE?ocg)v(dP~!gt|*FS&I~e3T8?)yB?#!C=!eW47t)(Yli4+*V6kW zRC%Z5@m+0lZEEjuONNz8xpxeFycHXc5F{vwk9wAq))ysosg8td)h5}(LYh9ob2J-T zUdp7!g?SaYKQtv`FPPzCKTfGeOb9D`{i+@{J#L)OER=xl?B}dzRzyn`RT&`_K5?Uq zRC49xv~ul5XvxuB(c> z(-nct-QpO+dJPNT4R)8bXe@w|-DijSLJ-44sy3s()w%t|fn9R(#hw_c{N2}9$i z-$*>Xwg^0uCcQ)=4JviBxS`Wr)H!^QF8xvI@Z8;X0>>1|1lt+Drwt{iKF8r&LDJ`8 z)2(h6kx`ch3QEp z$Q1Q)_VE1{P5iC{kr8gzp;Fzg59vQ6JlNN9@m-k$Ym)4-r`jEZTieukU+lHGQ0~r@ z+%7g-JNUuHfZ@rJdA!vbQOyiT2Dk+mB3QDfY2 z4W+cod^oZ+j5wvoJUaGB3`zXEHue_xuCQ&4uh##Ve@O+8bYWQJt#XR?82Q(&Q{MUZlt>#L+rvH;(0IUsPl(HU3z9= zfyF~aP~aTvCGmp4SSB=r2oCQr@!-HEcUuEGWh14YX($EULJUTo6Y+Cb5n5f_-=9Bh z;s$rN5fX3lg2dLjC!%SPXDRo-xIEzRGg>&yv^8(M2qcOYQH2QysqxfwusJ<7GveJ> z?vl*?^$ukUX~>A^=qdF;&fd3w{H`VHC)EQ3^*5CS!%55|> zZ}@`nDS!7#IV~n(IGoS?y5};LxTb_8DxzeVfRMP0vU8z|c&zpcVv*b(m{${gN(TcgrdyXopZ z`Ig3<$+~yru<90PIBxQ(4BjA#DPLOMby#7^Q~;vftvL7+*{(-yd<kS-EUk=yI;`3OG4OCQwtPkIzVI($R0-$$oY4*0rk(l$y|z^GN%y)~_x$OI~D z>$s>zX`2qYnq|As&pWh>USTu}Y3d4>#s$Z1tV4FOS$o;8(#kzq+Emk{YV>^N3yEE5 z-gGz+nI1WYR9m^cKZVdF*T%}4M|Dlr)?dWM#uvR=P*Ky&yEXOp`>WG86Yo+0=hTb? zD!$xL{d0B%2fZ;wcYZunX*n1d`z}7sDrx%s887=6TfA0p5ZwHoZOG6j=lPmTmn=4; zGko5v%=;vC)&vGZ^R~cDkgAJ^f4iZJF3i%-)b~%Al7^iE+w@+9yFxknnHDTs*IK^5 zg;hy3&Oyt&z<$4SYILzF3H2BT=&slOYUi+HO7^NREoZF~|NkFMi|-Fl6M zI7)@fBfcs)MqtYBX|P2-UpwlB>b+S>eBh}B7{mTAuKwxw^cBgl=Arju5O`}>^dcry zQ%iO{dBcePg#9V%Lt7P~h(PvEM?WiJVb}fh5k+Y@9|$iGdY6Jf;>Lv-xakM7Eed*# zZaPa&mc~jbg4KIQ(%!5;hF|U8UpBM*(3eeFocJYlII1#7G8QByL|lGQK5+}Q-#+&V2z)7dR=Ne zjB$&&6yql`%fY2zn**#jCFz@@RvpOLm$!l(7FgZsEx(n!NBH$}Syf}9i20-{yiIrL zNrhJcI(sJ0B#3N336Bw{%gQcd@!p~@bsI1%Hce^|a3f-(2$KB#d$2-8HY zc+ya=#3jl?T*(HmiT^%N*ue%Kn`V&u>fVFViqDK&%tsd0^vts;v}x~4bM^2Eo+T|^ zy?(F@Vk7eVAd$hM{w^3ERCpUPor~JFaWYM{7~yLRZgYWcHEi@WY?}A(vu@4}_g}4i zQQN7`%IH zQQ0)=+%IJTiFDHajW16%ZG*QxkM3`XS|>K`f1uc089=pwD`O)+qkB};bSc1 z1-lCkaza{`UmYVAOJU-}i3SvT&N#Bm_r#@HzY*n?F@BolWtq6UL=#`N;8CJYj^*TH z0)-!!#YVEi9zdSvo1cIsed}t_QmPKOn!rHMSHNTzu8@PJ84Si2VKsa!!v{OB1UWI4 zSQgy$Fd6_-sMRHdBNyuM3q^`4R0dg(uGn!>`6^TjIm}Hqy)Y($S13pf87nB5e$jU>K&KaO7D!i zwwne71U=zVkjm25K?Ga@Eb^?aO7cSLG8%6mJYvUN)w)Kjqq66ed(LpQY5`Vbi5$7D zB86c(AD&3)8`I+dcU=KXQj=|wJ`wb9Lri84%utcB9Ak7b@hJ0&oPTnsAKBRJYhz`p zm$&?w-gB8;P+^ApG=4~?8;t0&Z3)GOz2fnVz{sM}Zk2hKKu&*h*4PE(Gn95h6lTQ! z0@n${xP z6oM52py2ETQQ@9MwMyOlibPhe!wFm&se>Qzn}(MW*Xap&&|8=ByaZ!;k_l!3ITiI< z2I#^a+miZH>b@u_z*)BdMsD1cWy}-W+uJ_qh4zBT8NQ{dASGd4fE0jf(&!V?8&&+@GHc6UR@Rbb2j1@ zbYGrmj}(hv(rU${jHbGzb;DhkW+UOt`hbn%RF>oybqPwlDwTt;ExZr>g{01V&1kB< zBOIB1gXHHOGP&rOIqzMsK(AvZ%Ur?BL!pc65z zD}@O;OVlsaCV<};U+piKobtVzg;Y^^cz5gTHTbctwfPFaD)#EHy_mfAXD)D0c>CDW zVzTzk10~@&lX1;Mt!vqOp3`f|ijojuU9%;68w|&I-V9@0bjEoCbvyfz;MG%m*IfF! zPA>edy}0}vOF5ug2TG|UPj={yY?+PMJk>jQs{4aADMnv(1U2bUIk(GLWyfI^kl>6< zoGhtbm}Vb`-~KvZMxC)sU$dxeN<@efQBHLv-9*)EeXP?`Ep33yON+>BC4!Ri#9A;H zLP}0Hp7Rm85o&{Jy2RFZS=lE^E}7NHv*g`$VM1tJOk>{a2(m!)2i8O?xyBW-w>`ga zw^H0%aZ7mVDiNL1xA7L}@q~rfpQ`e*-b-6KteGy{aT560|K3|RJV7)X&A!-pXH!A# zLq7hKzsn@4`>r=IrJ(c)s?8wnf1j6vzso1KY9>qwOHyzV>Pz3`* zF>lUmToE>}h5;%J&dim>$cUs$dx-iwAEYzPlhGK(v`KsgLO(Pw5grW`jL(YU68VL# zi{^S+c{u9>Ejq?`B&9OoS1PL%r~-o>33e#Se1_2Yb+F*`nqVCg^aB#FedwGBf2Uv~ z#r2RJAjY!BeWBCJ4gGz6S(E%s6^zsv{~Puj((cZ`aJwU@mi|RIKhkUO)HZr4KU+Gl zd>0L6@hX06V;+)?{0cV+NPUb?8*9XjzK8?e_Pda$DsEEO*c|OFePzIpW#MMg*|!5? zSYz#c%D5(Ws+rnIh%+AxZ<(n`p16J0Nl~L^Hs3JWk=!ZS*kT`(M+_A6h)FW4?wRV- zK@p_9Yc*7naY7KJ3&oYkHA+RSDMDWKWPK@9=LhjT?i>z1JGcgzg@&&M1IG<0k)UJz zt7)K*d9a@soZF>|OrnFH=vTy7p|NVr!{t{{PBS7~NK_r}ladIkpxLUT-NZIsGyap= zMSIl%(=<`mXKc<=4zK+-S_XH<$RBXY9JyNMJu4l=(m#ETOyf?#{C0e1;v-sN-KJNw z{922Kxa}ehJ3| zBT?TgZI0iPHlkX-;<}9|peCn}wjYTL!FlX^CB@FoVskOAXn&~KS59IL7p#$`1l zH>0vzDS?#m=mEg`=FT&FPUoTz6_2(x(mb2I2KwxqE`n>%c^}ot(+cT}SU`eKRBkGr zURj~RpLlVxc(0aN%j-=78-5@QtoVPIZl1^+?`5Aa$?L&$3py!8PwUBAE4C7>-bk zp!Tz$`D+tzGA)Cc_dPCa7_`8xgl8bpaduAgBI;TON@GTdR{bl>h57>cUP`gA4IUhe zy1b6ZV%&j>7b-FDOT*LxRs$#G*|n(Lr2dwBoi$nt=Q7%xB?BF`^-idbUzEBdLLbGgtzwRt(ybO+t1{nnWog9?sFNv%~Cnm2EcFsOqc# z-^C42O1v&vrKrz?L|{o$d8t{MJ?Z_IV@=S4Exoi8RrNC{+K}4!-=!PfBV!j%TJct%X|9g{IzZB z-?dQ=1^bP*vcW zdCzb(OCTs$hAT8XO`KnsjOxpEnKJRps?MDA^*ig6bELCZdT1hG?pPz}s8IMG+(TOY z`4&hf*|0BT^Z-$iEo!R~dY2goT=KtlhT_=1ksSHl=TA&?6sY?P?Tk@TV_EPVWi>I` z&{{Vb=07Vofkdk$=`#f2(C+Z}esl2F+H+#K>b`zEWNUQQXxCUh92Fk^yy`H%)ySjTE$@%N5E`{uBw2b=J6At~ zPb*5mH@(nVu43YS?h&(yX!mnTQI3uT_+T~3?Yv**HlyvTOS>pCD5KsLxdsO%Ec*A9IRQa)X}f>+ApzEme%CSA6?k^%>*nW@UBb<( zNf7FIK}u#ejC)sm%%a6#JVV~lb9q{@V-7_lEn#(0I?6)z9u292$tVqel067*t96Hq2qj|w6yHp;vrnVR^98j1#*m>SuS z?>1NFBd@w0f$Q-J40_3bI{(s7T9*7u*nM@f>FuFTjV=fkSMY^hX2?bV#y5+P)L#fU za7HP=Tf~p9(04OWg8*&#yJsLV<81RJNKW^NgRn3+B97GJOIT*spDg`Xyg9ASPEe#_ z;LDNfPPSfbfw?eeafE82(k;u4f{c6gvz-m$=fd{IwPapl0fM5*j|T{+vT2h z6>CXsMTOso!x!9H1fwOa<^t-AgRVB^zn+C(OqV8YM|cC#~kV>u=tB>QMz z57k;)biB%ci4S)DRGd!HjG~>B_RG@B$>O;Xnt#(Q#2pLt_ixW|zE|-AGahmauF;<+ zS%8MLwYBlA>?-O;C-{DqsJ-N0T#7G=cKvqsL9F7W&2+-ve0(dSzzxXdJ%aMzi2Ig!oym$_4C%oWnSTt;ymAzaJ{N--jPblTLa`iHKBR< z4!*c*2b>6}vBSQytT_f{kQhgM3WhB*H1lU6J!74X)2h3#O2-~Oj5p0kY`3v0w7 zVSL@30HtdW2`>x=$YW{UL?Pe9^f7f3m|e9Q$@Jw6yZzcJ@xg5hF7Z;cI7>_3y5{W} zEweT!)(S-SJ!VmvwW+!!iQ*%Sp5SEjy-!?R4;$4 zO>RDhD{mgJu?E|rj@4`55__6t_fZ&PZJX>Xf|W`&2bOe5jpeWEcOxrCs1Wvz?s#NJ zerS{xJTd8U7nTx*qMSd-$r@Zne`r-_>8Ai|UBlFrDu8@%oCX`$VQ&g^Ul$U|CJ@|T zx(Mp#3y_VN5ojg@GpzZGy6@%rfsPl~4kIS70%H-LRqjd&vKH~8UfV6y{jRhaQcZYW z11Z@TWo86oSH$6bT&uJjzpFo8=^5vw>0@NJyebKU-X%H`aky1WB0cD)X0{9hd*WGj z0xhsKGI=!$4ieTw|LC0O2Tm*_9Fy&@xF&FBGn`6LpBngmNvB%FjLD>Zei8TcmW5Iei$^0hN9DKU9nOALq4RRf_r|EY|6yVC79P&}-uj$a z4uDDg+iG|vA>CREnft~U)V}S3eV`Vc_^r+{DK0h4i3eQ{&V)u_uz)auiPV*ypOl<< z(0Zer6Pt&0Vto~g)o?D9KUa@M&fGeGMamINn2g$zU}ZF^R$duX{5wSNk`1n6rzhy( zlDPiFZr8|-^=7-%Ou}8P#aoxc|cj9P>iTmY3#6c5)zFyR^nLFh9+J@j&^b@j0Egj7!i&&%%3D zWc6}J!ZJ5iVdSfozR461{UjqK6y@s>IL$g82Q%~8>46;lt6aAJ{Q0Q zBgD>*Eh6u?I<~3~W2&f*YGJMWQq22+sfGVQdXXa z(AcGz8x6`9^{pk}M6~ISnUE`~M`BPzzm5sIaLH>$9Ww&&dbazaQB=MD4V1u-?c;rk zMB=b=d+k}6<$@}^iafG*5zh7|P(hylaWQ|8CSKk6Rp|<0gbil4|Gizs#n6kt&5)+` z2Faz;zW2nbF>eE%Ci4t(ObeO>s^wmz@vNS1CloI|o82fv{;@KyJ{1+etNV@7QtL|P!h9M|G~VFzdlo|IN7Mpo8(fK37vXn%VGf}VHlil z2jw}kKi1JjlWB~+4igm`iX<%J=XYRS~MqlB0a-I(%I&<^?zd@*6B4=V*e{FlgslOix!f zQPtZ#sIxU;S}x;?Y`nakZ_j}R4}7b58ASa2;2b!{^3lrcPB5AlrwwFNhbEG{Sl(1Y z+9o=FDP-O4u7PL7MWcpjqZ`n>o!jO71Sf;q^8Fgrv4{r!d?vrxSuH+kRAqS2i>bOb zYxcZjFE=toiq2j0C5=U7zO7~A?qf;{TRVkj5Bpd{{&j(CWtSogtopuQ4_<2Gw2dl% zxY0S6$buS2vjm3qyjxNAvv0)vQXG|ro<%}#Sbu4#uR+_Hqh%R-z*jG8XP1c&g7R54 zKRmaBpC;yZ%In-47+5soc{6>g6jW)1T5VgNjyP}#m|l|`#x1vBpHdePfKmV2KwqQjI2MF&<$5IHZJt| z%y`hq*Wv55un`{Mv5W?mp9sZtK*o_n+}nAOAgNWgc4@G{DAqZ4kA&nW2$^GHZg{W+ zamG`cQTFzxwKACxVw&$Lflv@Yuw?;fTA_y%wHFkag;KR(aLYI$J>pA+a!;`G6MW>p ze&n2#6}|sni8>xoNbes0KXqGsJe2t!o*@mUX0+NU%#b#;#^|yxDKAm7 z+hrYHbVj)(x)2h>V&2Kv&6M_9a_i{!1A{HNHqUkAv9H<&KihO4 zT-zVQprd8_VhdsV}Sp&{sMmgh0Lk?_tImsPAZO;7tD z1MaawQB$4$F-s#;AJqK9>1!8sZt92Lkh7&C8bU4*l*2;Uj$ZTMOo~^u^T8_Q-E;tW8PYeB|ZH7}5quX4ye2 zoyTTDhd9{W=Lu`tPPXgj{B6Gbh(!^C=MM^Y?|;934VUc{lw`NMK5aPs@>pJH4tBs~ zz?l^Fa(U}L+HN5#9D34y#_)R4;JzyRfY*Jt@@e^8KE<71{~~Xkv2!jx`AVv^*U0+l z!z4wX^YDM-=-N}1H+@G+LTlEVRLgIg751h}SQeK7nQolK$l!QS9F4?tE@tNl91q6;b$I z`?)gS&}a|(AO&ZLTYgxZBIx8hCKj2N$W?MlqgFuAc!Of@;v+>sf+2x{DVZot)@2pJ zmNrsm`!`sQJ648q$Q@u7gFU>lsbZW)daqo;<8RS(f^N)zM<->IN6n0Rz8QnEx=q%(Z|Mm3}uVaUxJ+vrEW-=;`_JXD4fY z;m}8hKi$5PoF5EG*QVo!A>uQFYW|F@AQcbHQ6Bs7KJ`o9# zJWn=G$tvat1QaCfDlZQ?m5`w-Dqs8OAk+JN zn)x^l?$HyRckzAhP)i&;U7gT~H#Mxm z9=@ugoWWHL)@fLj=X%OqVrB#)-+pq29GWiLhgj4qd_rFcJ6;$zzr6js-Qd~2>qfPg zb<^{&-a^HD^-o<_)WzZkE{M;G+7z8!4T6>DH2=Gd?mZ@=&nF>oPEXyg1(eTpw+gJ^ zw)M*;MaXg_1~;0VQHd_?LS*XHfV*C|VB=A)^Y`i%6M~BaOITTp?!c>s@v9jt$tHP z@Vx0+U3)Wd;v(2&T=0n@q-E3~jF4?A(6JXeDFF9e0L zFX|;a*FUZpQ^OW|>Q?=Z{nPY-+{TU9I3?uja7Tu&gOg=4>Glu8-jzBFt0d}CqsiiV zz5MO1OD1Q4QTjq?rL1`N&VWF_HCD4{Er)Yd4f#wH$`m2mCiUD;_Dq@^!>ztWZ)%NB zLb`8|%i|hPk<25=x-7_VVMZ+-D7}0&9cW_ttjzdoJe=iVAXDl$i2a6x2yS2@jCe#w z8rQr=`H|aCQn1puT#i0cA|m%p=HfY3v(;vHa{dc`jd-hztOh#UmCBx4M*e4NT*J}k zrIxO6_NNKr%tUSu`sZ@;)G#NBr1+qWe>v-a7|Cu$Ypjpk2=_LgZL4#1FlRZE+^Y(s z?RnPnrh4&$J&hDl4td8jZDfPb+=CCI=HqD5B_5}(4vd=^$bVoflh{FrOd|`PChS@t zY#SM3z#_G3Mdvik7Wy2tXW)W4sS}fqqMxljhz{sQM zNHOlK8|{YrUps(W`2ocIy{`a&jin>Y39|sQ1R3NOkb(ajNg&XIMHll_fefAh3;i`C zHIpa6z|=4*6}*RUR!_0ypkc*4oS_RB0gkv2bjBC~FkA=25|o;!vB9K1H$l9u9D;#Q z`zt$IQ{j(t#xQQ}i>?tJ!Zesl)hMM}@|gBB3OVOd|DpxUv0PHm@W^IWvl338&P0-N z`l>2%1O`L{0Nx3#WdI>!zG?tF)3Dzc(WuW*5QkBnp;7d2nNy20r$NXdAdG=n>v2FL z7^&e*ErMzVai0_bKac2ZK%STz2CTE8JY?el}_gaXr-!91;}4eq#Q=?mtp%2QRV8nZ6neg;9Cr+2UVbb zHyZd3#vMaSO|{PbsqmzsRVi@Yv;Z3~{(z@s&;a=z`1P8JA4sxg3xVDvKnw*YFEBbm znJxq$z_Td%V@wLV`$k|2ki6Hpg3Gza#el3!x(|kfjMb3CxO@Hi^Huel!cDGsGZ&zT z#n`u@+%H~Ah5@)T`X~2%NA3xM#%>n*<`Z@u=#dIRgW6Ti`UpEL0o0|I3Rp!~z%DY^p{xT@cJG&9V0gG>r(440eJGXV<}FI G$Nd*OV6xw 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 G$Nd+5uC$^6 literal 0 HcmV?d00001 diff --git a/versions/web_static_20240712112029.tgz b/versions/web_static_20240712112029.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8f88a0a6f56a31390a85a079644076f77d378043 GIT binary patch literal 19300 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 G$Nd+-{IuWz literal 0 HcmV?d00001 diff --git a/versions/web_static_20240712112031.tgz b/versions/web_static_20240712112031.tgz new file mode 100644 index 0000000000000000000000000000000000000000..72c6b78997705964a5ef10fce41170ebe187fcb7 GIT binary patch literal 19300 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 G$Nd*p%e3ME literal 0 HcmV?d00001 From df860521bf2fd4fa90c568056624f83929f8b2b5 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Fri, 12 Jul 2024 11:28:25 -0700 Subject: [PATCH 36/80] update --- versions/web_static_20240712111825.tgz | Bin 19300 -> 0 bytes versions/web_static_20240712111927.tgz | Bin 19300 -> 0 bytes versions/web_static_20240712112029.tgz | Bin 19300 -> 0 bytes versions/web_static_20240712112031.tgz | Bin 19300 -> 0 bytes ...0132.tgz => web_static_20240712112612.tgz} | Bin 19300 -> 19300 bytes ...0133.tgz => web_static_20240712112730.tgz} | Bin 19300 -> 19300 bytes ...1744.tgz => web_static_20240712112732.tgz} | Bin 19300 -> 19300 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 versions/web_static_20240712111825.tgz delete mode 100644 versions/web_static_20240712111927.tgz delete mode 100644 versions/web_static_20240712112029.tgz delete mode 100644 versions/web_static_20240712112031.tgz rename versions/{web_static_20240712110132.tgz => web_static_20240712112612.tgz} (99%) rename versions/{web_static_20240712110133.tgz => web_static_20240712112730.tgz} (99%) rename versions/{web_static_20240712111744.tgz => web_static_20240712112732.tgz} (99%) diff --git a/versions/web_static_20240712111825.tgz b/versions/web_static_20240712111825.tgz deleted file mode 100644 index bd2382ff46aec154aa789a567b979a1c22d7e384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19300 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 G$Nd*OV6xw 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 G$Nd+5uC$^6 diff --git a/versions/web_static_20240712112029.tgz b/versions/web_static_20240712112029.tgz deleted file mode 100644 index 8f88a0a6f56a31390a85a079644076f77d378043..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19300 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 G$Nd+-{IuWz diff --git a/versions/web_static_20240712112031.tgz b/versions/web_static_20240712112031.tgz deleted file mode 100644 index 72c6b78997705964a5ef10fce41170ebe187fcb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19300 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 G$Nd*p%e3ME diff --git a/versions/web_static_20240712110132.tgz b/versions/web_static_20240712112612.tgz similarity index 99% rename from versions/web_static_20240712110132.tgz rename to versions/web_static_20240712112612.tgz index 6cc975e84ce7bdc3a73c17a294b882a6c948d4a1..665cf541beb80cb3bf3aaa06b062404c9086e47d 100644 GIT binary patch delta 17 YcmaDdjq%AeMmG6w4hEOfjcjq=06QNA$N&HU delta 17 YcmaDdjq%AeMmG6w4u+cijcjq=06b9z`Tzg` diff --git a/versions/web_static_20240712110133.tgz b/versions/web_static_20240712112730.tgz similarity index 99% rename from versions/web_static_20240712110133.tgz rename to versions/web_static_20240712112730.tgz index 92a283699df8c3b26c7bf6a05c6a11dc9507b867..119da213750d6c97e81598a9e979b800a6c2cec1 100644 GIT binary patch delta 17 YcmaDdjq%AeMmG6w4u(mk8` Date: Sat, 13 Jul 2024 11:20:02 -0700 Subject: [PATCH 37/80] [update] task 3: full_deploypment --- .3-deploy_web_static.py.swp | Bin 12288 -> 0 bytes .gitignore | 2 + 1-pack_web_static.py | 3 +- 2-do_deploy_web_static.py | 3 +- 3-deploy_web_static.py | 60 +++--------------- __init__.py | 0 __pycache__/1-pack_web_static.cpython-35.pyc | Bin 925 -> 925 bytes .../2-do_deploy_web_static.cpython-35.pyc | Bin 1157 -> 1191 bytes .../3-deploy_web_static.cpython-35.pyc | Bin 2011 -> 779 bytes versions/web_static_20240712112612.tgz | Bin 19300 -> 0 bytes versions/web_static_20240712112730.tgz | Bin 19300 -> 0 bytes versions/web_static_20240712112732.tgz | Bin 19300 -> 0 bytes 12 files changed, 16 insertions(+), 52 deletions(-) delete mode 100644 .3-deploy_web_static.py.swp create mode 100644 .gitignore create mode 100644 __init__.py delete mode 100644 versions/web_static_20240712112612.tgz delete mode 100644 versions/web_static_20240712112730.tgz delete mode 100644 versions/web_static_20240712112732.tgz diff --git a/.3-deploy_web_static.py.swp b/.3-deploy_web_static.py.swp deleted file mode 100644 index e711392a3173ad34be1824a036b4f6ccdf5b63d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2Piqu07{*ft1+gkBJ$Oo|ES<&fZ2zdWMFk5MJyZm#ARdP7Or{$;lMG3A>u#wY z`~=<<97gp$9L5SI@rLnca?iSfO|+yn%<=d6PVO^2=$Nv=*N|+M=t$4Fc^F zA?M<^$zgY4=KEL9Itw}j`gwtnAE1w*KIjFg0Xm!} z74!u(Sn~uj!^lVg2_OL^fCP{L5(J+m4p>G29p? zuEbNr*9X7cTiMHW)D~SHN|qI)TwmF$eGAlxKCjowurt>}THiameoS)~?ech?cDXh} zNz>dv2<%RuHtx~=gN>f$#tRaqGiLpfi!-HnsWL&%Y&+QD)>V9O%wsgM8mSB;64;9g zOecysk0HRoyo~n*G6}guD>1DaPdLdPtRY{jB9{7|Wtujkell)Qv7h8s4G*RjcA-bF zQ!6s=u5xGj2oG?{c4MLa`Jg#OGGCklY+EWjBFA3}W6j^=3KB=Qux89GcZFc|L#jQ$ z9vG_=SNFZz^IBGmYY%H%wWnUOQ~?yuCoFd0d{pR;+pm*Br{{Sz>Bz{!xl;h#W-?AW zl+u(I_tY~kEvGP!#5^f$etn&gM5~N0HJn@JE;|)juC%SJGc1%FDCQ-srQzZ`%f)cQ z;G{@7SQ+A0bm=x(i`q7`G}0U_426U=24-5cI>kFJ&&O?`r#jl5Dm7d?@MLbb*)h7= N60({1Y+K0{@&_XXO40xT diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..f2df68e3d16d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +versions/*.tgz diff --git a/1-pack_web_static.py b/1-pack_web_static.py index c18f0b34e99e..d285e1948e4c 100755 --- a/1-pack_web_static.py +++ b/1-pack_web_static.py @@ -19,6 +19,7 @@ def do_pack(): size = os.path.getsize("versions/{}.tgz".format(archive_name)) print("web_static packed: versions/{}.tgz -> {}Bytes".format( archive_name, size)) - return archive_name + full_path = "versions/{}.tgz".format(archive_name) + return full_path else: return None diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py index 2090d9ba693a..fd6e641b1c1a 100755 --- a/2-do_deploy_web_static.py +++ b/2-do_deploy_web_static.py @@ -6,7 +6,8 @@ from fabric.api import env, run, put, sudo import datetime -env.hosts = ['100.26.152.53', '35.174.208.133'] +if __name__ == "__main__": + env.hosts = ['100.26.152.53', '35.174.208.133'] def do_deploy(archive_path): diff --git a/3-deploy_web_static.py b/3-deploy_web_static.py index cf7318342d36..8b8f0faec5a1 100755 --- a/3-deploy_web_static.py +++ b/3-deploy_web_static.py @@ -1,62 +1,22 @@ #!/usr/bin/python3 """ Fabric script that creates and distributes an archive -to your web servers +to web servers """ import os from fabric.api import local, env, put, sudo import datetime +pack = __import__("1-pack_web_static") +dep = __import__("2-do_deploy_web_static") -env.hosts = ['100.26.152.53', '35.174.208.133'] - - -def do_pack(): - """ function to create .tgz archive """ - - time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") - if not os.path.exists('./versions'): - os.mkdir('./versions') - archive_name = "web_static_" + time_stamp - res = local("tar -czf versions/{}.tgz web_static".format(archive_name)) - print("Packing web_static to versions/{}.tgz".format(archive_name)) - if res.succeeded: - size = os.path.getsize("versions/{}.tgz".format(archive_name)) - print("web_static packed: versions/{}.tgz -> {}Bytes".format( - archive_name, size)) - return archive_name + ".tgz" - else: - return None - - -def do_deploy(archive_path): - """ function to deploy archive """ - if archive_path: - a_name = os.path.basename(archive_path) - a_folder_name = a_name.split('.')[0] - path = "/data/web_static/releases/" - - put(archive_path, "/tmp") - # Uncompress the archive - sudo("mkdir -p /data/web_static/releases/{}".format(a_folder_name)) - sudo("tar -xzf /tmp/{} -C /data/web_static/releases/{}".format( - a_name, a_folder_name)) - sudo("rm /tmp/{}".format(a_name)) - sudo("mv {0}{1}/web_static/* {0}{1}".format(path, a_folder_name)) - sudo("rm -rf /data/web_static/releases/{}/web_static".format( - a_folder_name)) - sudo("rm /data/web_static/current") - - sudo("ln -s {0}{1}/ /data/web_static/current".format( - path, a_folder_name)) - return True - else: - return False +hosts = ['100.26.152.53', '35.174.208.133'] def deploy(): """ function handle full deployment """ - - ar_path = do_pack() - if ar_path is not None: - res = do_deploy("versions/{}".format(ar_path)) - return res + path = pack.do_pack() + if path is not None: + for host in hosts: + env.host_string = host + result = dep.do_deploy(path) + return result return False diff --git a/__init__.py b/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/__pycache__/1-pack_web_static.cpython-35.pyc b/__pycache__/1-pack_web_static.cpython-35.pyc index 83989fa1c088bc3b88d1b09f83cdd9fa0dc2e08d..41a0a53769fd0661b719e52cc8ec2dd69dee9e0e 100644 GIT binary patch delta 16 XcmbQsK9`+cjF*>7vUAc#_G!!jAdUnN delta 16 XcmbQsK9`+cjF*?IJb&Uw_G!!jB7X!@ diff --git a/__pycache__/2-do_deploy_web_static.cpython-35.pyc b/__pycache__/2-do_deploy_web_static.cpython-35.pyc index 134c52d729a85ea5d632b6b473ce49c248027127..a65b4bcd1f78c8eda8ea29e2b09fd86c57956e34 100644 GIT binary patch delta 173 zcmZqWT+XR1#>>m)x^7Zh4GROqV+JI^1Y|n^adGxUWoO+~4u%vKhHNH=qG*N`R)!Qd zhIA%|RAz>FPKFeAh7=Bl76yhWE`}5)hG0$3iR}ekw>aYCa}zW3;^Q}duV-S6nq1DT z%E&o+F0&&e@8tW;20Yxi*yH0<@{{A^i#R4rv*>XGHRL7crpCul_F&N$-~n3A#>m5{ M#K^>mqkvlOhmW6@gF#{4{0fDlS6otw*g^b?|d0!f)Rl*K`n?B zI<}ruyki5`D>xk~o*9#weAsIz2PH>ZnkaA-gf=qOieeFS9V@fiD^T9PYD!Zv2JRng z$<&*oB`rN9Z63xqJ@E?eC)6xg?B9!Wnp_JEk9fox{+v1G{uuw?Ho5)!Y#iZhcmO?y==&v@qeoHH|j|7N_=ZaaUMKM#Jd1N;R` zmx1lCu#}frMF1Yw1R?_x0vwZO9=t$|mA)CSK6GWV{7SBJ=gs0L>S zFbn(!L^ecq_z9CXA;NA`w;hP^UeWCpHPT79CBLOd!6}bJT82C>1Qo+TP#SU;2v*V{ zi)a*=g2$)hS)T?x9L5*S5jnle$DCfWQ(7{9!FcKXgG+(qu2t2NJPeY`WZ6Y!7GqIa zNYk+4{0zykPYQVJ)RnZ0r6sHEuMsjVy$N~QA zZDy3ozUMJDby$6Fyf)!xHWnsErJtRk*1B{ZxkU%#EEI8`Q50(?DW$GBleZ#L+3Nh* zNjp*Jo6dKg6Y02pr6Wd^-UFYKYUz0tbFP@L>_N`cKvcDY$C;>_Ozk>i%n!3eKTPtB`4_wWyN!?mJ}2v>O&s!+JRwc8iKR^%2H(JUAyFQ9-NW%uG$2&`4-F+zIAT`;MHE~k zb518B_yQS21Qjxta>7lDun>W`B6c<)Y#4{PHX&zd!X#*&A*CD`LuqNNVhw4nc1*8>mxza+u?Bf>?`gfxCIZIejva&C&zDNt% z(chW&3i`O~WGc5c&TkNB6@@6%-s}I5aCmy_E8j~m=wy33*_kd+<&(Khy6D>DnEKJl zPL>1Zrb_+LHym@$G9f=oGTJL|hkMlThoj?eoi|Y=?qF3lPEi$&YppDjSa8JHM6zedhs86#`Kr~ diff --git a/versions/web_static_20240712112612.tgz b/versions/web_static_20240712112612.tgz deleted file mode 100644 index 665cf541beb80cb3bf3aaa06b062404c9086e47d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19300 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 G$Nd+I6tsr` diff --git a/versions/web_static_20240712112732.tgz b/versions/web_static_20240712112732.tgz deleted file mode 100644 index 64f21d91bc3d50b3902bd4d059ba6a6b4e602840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19300 zcmYItW00mzuw~n}ZQGdcp0;h<)3$A6+O}=mwryMQ&i!I{Z$w4LsW_FVvNC^EJx>xw zK>;PZB$xq#Ug<)6E30<&nqpHa{8ITPc83%X;wrgNL~jf2Y`^G}uYfTr>zJwI>15yb zT4H;~^^yR1yl_Jv7$wsq^UyzjO;CrQr=FWgh=(-8-YKhYxXz1dz*H6NqwU}A` z(%3mgiS3fgJ5tW~_t6-c2}wG-8CkKnHF%$cJKO_{9UjHuI~tMPJ}z7l?LB@bIWyB( z=AlL-kX-+%tUgwU{Tmhw^c%a-Uk5UQ!y#nr!_26vu3AkE-q9P1*q3?q7^$r^xvCT4 zZHS~Rob2-_ER|GT9@1r+dtl6FDpD{laT>UTTDFcdXg3=DS|-}jV%0sJcF})ci9!Y5 z;*_|GLxJ%FhbF4}Mw1&-qRCgt#u^Ob6h}YgiqsCvFDN6QG9=7sjukSDtG%QD?i&Vb z#2){h>sUcne?i4MWh#Qsia<6E5C=EQB>Lm9kMPQ}Ev>8)@(fym;8xkCJi9vxV9!1Q zD4bpccij9h4z{8N}jpyTjc_2_iX~7 z!fbK2N6h37Gyl6MKNntN|C4Wh&^d*}Yk-yu+W$y#JoxFr%PEKc4$Uk}vZY#QKsC@%A)4O|*d{U3GIv3%=}&xpqA>OC?in%TMVh5#APX zZ|>f*b9d<`5s}tJ@RU?vh4;z|Dx8)P=}je(HpmL07q2ocn9x-lfL0SS4TlXo7)dCt zDgRqYZdm}+#IT68Jj9bn!fb}eb6I(rdRqe*&B{%j{16HfiZRUrC4M8g?LrXb82ERj zaOpKDL<|dtD1!;5iu6D#ez%!~aAv zQsU7}jRkhPidZ>bfsYbaY4TFx$F;KOCmuI9@bgN_f_G4a#{>so%-bh_)uZT;ZIsm! zYQn&@F=oH^felCOZvB@}&;UuVs*BS{wLB(xt`s3Vl^LF%`KT;T^Jepf?M4an5e+y~ zLrG0E2JwCSeN>uKJ*FYrT%CPpOHWOWdIZX+N+=y>1GMYNA{U>yV|dkHYUXw+cQ{Iw z(D`|*xF9&2r}aYI$)M?V^j9Tz_Nwd}x_TaLNi}wjSn*~h)q)}Ypi?v$u=xTN9r|S< z#9LD~oN%`d;F{!LAC1zo@}@>~KNJgjU?YK@ADPhX%qbD6w$rkZ%hOZptLwADKTX%k zbrGX~;keO}NQn=yjp7yS?x~XYJ#3<7-5Qw^HBInc!h*jfN{Coohj_?J@im!M<6G zkN_MO)&+(e7U&q@#PcV||F};MnN$*vr4diPmUt~5HHD{|j-Hf&5sKRa`R7lhp=`za zF7P|paLJd3W5$KfI;#!`SEG2II!W^Ao1+J*@(}YZYqD2!je+#K*mbF}P$NH{j4|a* zh!X?4rULn?6&iQ#Z}DCV29{$w<#{R5qfT7T($LVX6IMxR*piLC?i-b45*XKHqI88s z*gf(@TetF7AhqZ4-dOxC zpjDahAZI9pX!`JI-EA5g;G;JokYOhNv>^)FP!nKx1Xxa#1%`Cjxhpj8p^=x3!Y0-c z?!D83QJU`u^-Dk8!;s@@P$YsA!yT_BzbAuT-OX7YuASJDtrq!^ULm$5iq0DD_1WIA zhKIV0iXStNLfiR6&ty;4}^PnK`(pW>c(XhPcMq9H(Y*?6%#By|>#o zxDZbsdcyNDJ>4SYAh-Yovsvu~*!%zKo1@!ez>RAKecYleLlf~Kd_ z-h|@OIqc95#H`lqLOiiBeAfGQgp=yWEmt7 zBH`lcvQdkV{?0yK*(d2c+NZd!U%Zg#^5?=T)B?iz9iL=tmnZXamLfl8ms$(HqvkplQ2eR<*`F%X@ES;y%C2xn;?bxR`uct1l7DTFEO;af)tB~b)O zRzeACt>svXOSuAQpLtIb4^j@qLmNbXAFBgTJXa|p!Ny;htT8EtoXr1G1V+pi69xGE zKK>AyKGKGJnjN}2L-phtTc$HV%^eE$PkePKLxy$x+Me4ceyr{jCxvT7TYi01i%7jR zi1)N(KCNJ6Gr~X{eJ)TcE_NLoZhQxwu;qJTw4Wa_)nTN29^44|9S|ssdp-z}e;_Lx zmIa!D@sJ{-K6YfAK+`?~3ryB8CGf$qHyR}O)CAX%JZEs{J&#EZSUrCt7`e(Ar+~0o zWE~`0riOTvjpY%h0^KJ|XGen=qybS>*be2Th}t`@>bHYbwd&X&0adx-)olwCBO;>u zVmY~XEDn@piy#FmAPZEf6iL~&b#yEgxVKnitgzrppezR)>cX-vVJhSJ#r+;<2rk3} znC&C7piYdRFfrLTLVV(2fY2LZFkpWMDt2Ywb%fI`xL6cixnPH;=p|No*c2$CZzPfRXiI$gTfWp#Xz`2I&7$f-?9Q3S%kJzdHSk z-s?Q+P7r4mS4t0srmPvE%~t-~9iZIEGJL zn0>#kE2fbD_9=Xhd7FgW_j{`*{~y=8UYq}xf@u7UVUikZqK)L=N%cO+zT!syC1k$J z{om=&&k5=81(&RRf)N2C_{fs~lkw|8z@51JoE~bDh?lGkLN#YnA-R<(sLKK8)$Pu~ zKHz%j$7&rw`m8AMQ%ec>Q4Sl6=>tTb$^58qA~$rHsNCQA=~BM;iWS~J`{8^1sQ=^l z0J^z=^2dEYR~LfQ>1X<|aKZa2g;lQt#v+~?{5E|G}udwp&I9g>HF?QxU0JX&3GmnFRcQAKyL zm~mf(%bM?kQm2`KXU{|cudu|=?a*g$;n?;r7(3F^+d?ccm4S-7)f1GzsID*q=v-7tJId9!s5@~CC}>B=Uu3n938+l67>+`O=BI&S{G3VlC|5P zX#6fXL9qFwylS`?>XnHw7fo0SNB)16aKSv=^hLNjQ1tBf1E_leen5X}OX7R3(++4k z+X0_Be&2{}ww&V9Uxc#BhyY3@*&Dza5wt%50%7Pjyx}>otY3ixLr(#W{Kiq#lWiN& zeww4a)7aRUqAn+gpsJxEalPG{78x5`QX-!#XKHFn?b6=fzO>cuRIb@*rhC3yt1n2y z!I7H5<6?!hRC;=PiW?Ob1xZFGQxH8uHepo%6v|B5Pg|RpxAzhp3}*HDa=p~ya!Hj@ zlG1KAmCnq@%zlxuqmDTC* zw%slGqvF2=p;bZ0@p919+p?ayP%Yb%7SHn86R_`Zy*o&rs@d$kD90)7>t6hPR{B92 z(}D7138_zXX<*Q4_zSuP{X8}{u*lwV8+b3gXVfRn>POOY339r4gdxh;f0?NKh(b8qq7|7%E1 zEg5Ba17d^v?6ew16}i+OMCd9lFYi-VMzyMBP@avI?cqji4aG5T zcI!FN*0Db@tfRD~M8HHwp7|Ws>NcFZDqBs*CMP)~@oTNhOBzBhn@6_3vji*`Gz-2Z z;;yLZ=vo=ZNlblLor6ihcfoPa>u0UL-}kg8?fvoekOR055n{#y^2}ISN@{{{wX32} zsWL^Y*-EwXTUuJ0nzl*1(M;BjD+z1P4QI`S=%v4)pup^N1y(@2j&XSB&bMy%;L%p9 z0(9@#JnN$41N3bKZ8cOHR=kQd#D# zI_+oBU!YpKYFD=2VY_;R`SWn`)4Id`)IV>WoBj1rY2O2QU56F?eppRn4AKH!I+wf; zvAp&EypPUWr9`}Xf6qY_WKEfFvZ^=GOq%$~cA$$a>1Qa%JCGKtU}5`u9T zjll2XAo3*3b21t88y*>`9uMeBOHW zLOh4J=)-DE?lj`Qrsp;ywbO5EGog#f_xuWZnG^vlmha^i82D5AL4|*E2XJ(_gJ@p> z^C^(GV8UGSoD}`2h8+^-)O<2MbT+$uJ%zObK-;;n zQzUN^H@?&Q6BFO{y|l^L#d$QDGGn@Cx0uwJlp~wY-@Ax+%1QEbAZTpac(?oTm|M`5 z3n*9>jlcE7C#jD3r(y9W=yhVqODBDeFu(2ff^fCSXz>=FU?4aj8hvHiSk(ffuKFA( zI=Q;c_dFo&MT|hm?fQTgyf@iv^PMxCmgc%Nyk}hgt*^eD>aCLg`h7+yU+wLzf4$3= zv?{}Jo3P-um!I(+M^DgW@|gOmvTr<-D|7iuv0LbA_3>j%x#)W?bSmTCB&%U;%$?tAcZ<6yq%2YIWTVmMhI!+rP z_Q^e7;>{88#vs(r3=tIku}23lEvzQ_CB5pmguF8g2oDxM0N@i>-vNNyqdoxkdSZT` zkC=I{6(d+p^1Hr5-@suAAVfUwWB6E6J0W5*&;-0cIdgS?n#FMQ<1&y~=b5Mln5ntR zx6>2;rev$LJ?b?UM>|P0G&WrPT!==c(d&1+ZjWS80-B!x;&F|3Yj7|)irwPqLa|IY5&++#7RC75f5G+4BmA_s8QeA0d4_d`}4VKyc zyZ$=trq5-w#X@ELm2(6h0;!hueeim@I!fS5r^98m1JHHN@;J!)Ub~SGO0~`4y4vZ( z?By|~hq`WjiNlq%ozUtMWA|~$ol_K~oA~B29JlyPBwT=rhJ^5KZKC`>4MsISkgLs5 z|Niu=TYP!Gaci>p8L%CFNQxT`W+;>6p1)nbjg3HNZN)&~G4cv+&i0|3Y<7Cp=B14z z%ZVDp*Wy0xH5;N!IvTFv7u^>R75vk6qCnj265i$e)AlVWFR9D&vL`s8Y|sC;v#~vH zU8pj83;6Jxh10yxkxlXzer^6zwm0^E>KHm#zc_4bAb+@bK(A zV$GOym=}bI!P-3>O%j{-`>HfQ`ZTS8W$-*(H09AfKc#)C^%eA*=j?WN2!M9Gj$?t7 zedFOe%RCo8I$jTf)h}((`w)?d(+-_odsrU10G_4XQT28>Qc;-B=X?^+lcgdXS^~*Ih+l@ zEhByv{rrXhN!wnce_rkO`xaUIELFvJtFKzH46jXbWB3Yl%8{HulUC(S7?cZM; z-T7@I7Jj89wl4MCgd!pNZ?+9f!?9ni5_R|O=eN(N$1dQOU)|?V&g0gs&-SX1{$qR1 zCqZ9O6j-q3H)EjwnIA9G(*4|l;8!2vF5vNj_yxd&_eT4n51bG1V@>~UJ=F(g^_Xo0 zs9L>;jwRrg6ZQ5H}M!NcG40*M6Z;S)ChRkn~}>WdbKe4twg^ZMk8cy%PMV6 z3$&dSXTU)1)DdZ6FA{FUDC!9}%`IBgIV3|m>Jcta1c@9J2SruKrQBZP@<_$A-1}-(vY&6aOdEVMvZ zr~QF1f&*P+cnp05IWclr`}YQ_^GQj141sHITo3BJv)-u)O3h7c$5bf8OVVh6!94Yd zw7Cj*dN?Q~hy3`4*2!e{#=z)B>9`5UdHFXIqUUu)lDvJQ$qyGnQtU^)S1dE%AlU3~wtAPPkSrS~S9irWL6( zR}fpOtA&DK6VGB3u)lV32#~-|H&})|FHMl>9ovw(S26=>n6NkC7LFp&J9eilzA)m9 zu$h@-QV=tB=Kp?8_T;LT10$b1EQ`?((7hS(SgB++J9fp(tQ&XTl{7FZYGUoyyUYh4 z;iak(p;SRDOWd#9vUA|%85nXWkBgo8+Pp?}dlcxB9(ZEpVW@x@S^CuWJ$Z%B{cs$QfB4{>>w&QwN#!@h1~0s5`7^F6LVLc_r`kW2&`Yu|fV zkzEmiSP`WUsy{HwF~5fzr4OT+xL7w)c!MQGyE6%TrI!)H%&f7MrA9OR^b^9jgah)WTCJ6n>#)6IB+C*fJ zTY5Ca`VVQ6*ds5d&ne4I4-SmD9);eTu6;OLDymm`84vDTx16;mDFk=PKGTiK4Y<{p zdTct}Cdry8fV?8?&KH(G(2OIX>b!n^`bZ9|<>80UtF7)?hlaOGaJwdc^*(}+F&+ti zp-m4q0zCYt00+m1VpjlXsyp?gUVh;p06dZE+dX#l*$pHZKw$JoVjm|kG6SN9C_Pf+`Cn)Pv3F0it+HO}vsg2Zo=r{}fIaVFJ-Bz={SyLr8{ zTG$fuP=lR;o6L*twO!cv9OyL^s*f3cCJ?Y@dnJX(mO29Kf*8&Ih*i21>I0I1GW2e0 zlw*eK7HQ_ZgOaFT^#0>#hXij^j3RCjORt0*^9c-qc)7z*+drKo0ey1)PxnF6OzPOeYnU_smvzpMey)uFBD&YnwD%Hqr} z9?ewwqyjFfsi}5AtCt*nhRv?BpEh)+wy^U^!C3e^bM032MR=hW+BRDEVQ;s`sUm6~ znsU-{jZpH(#{r=@BYGob=#JPx#`)nonMfCc7i#D)_Ge2cLTJ0^ZwT3lR@~$Hoq`#s z^mUr9J=W9-n0fHgQJ8ZEUR{~;wkf}ggtH{L>zM|!j}xiC^6?YD;cg8eS+XYms_A@F z0eAGGzJ>RQZ>;aL!_(kN?}8@)N8%X(7aG^EpTR{QQKr~FUyQ3a-a+4N|D46piuDX3 z-DtdDK$6PZ#z@cLZ$^sX*nd0L1wkW#fT&9QE;bZw!99pkwXI!A-}tX;R$M!M!oxc^ zu>WcVk;5$ygR-1hc50byy_&7GbBU7nNjvw(S(L{$xrW<@#F zzkhHra5FG%cWE#KjE065EEp6O1@8)(S(pjGG?p?wl3;fWZQiR2t28Kxi@nJsBx-5- z8fsws`drTut3L)tiWOFwfDaj;opjiVi;nj5re=Lv>&7drDrDy8-CEd@i61V4eq?cZ zWB`)M#meJu%u7rS8IQcQBDB4N(I75r3aedKT^Lf0-<*s?$X*zj0KEp`8(`TQ5*RoK zj*B(BmhR7xgu3_g4RC=C*D`bPF%1U7RA^#JYoDBbU!#_DA| zyOF`we;M_%k>P7i`##xnH+*djyc6tY&{+$sl_oR+)xJfj3*mR+~ER{r2YLNI!D($4gRB%aRO#4(XtUdxZR7!oCo?rI^68q=?{s!BU6 zch}U`$5Mw&fa3+8gTam*8(fq;+AFkVaiPqb10SMWjZwyJXLf4B>cEHdo4L^V!Br^W z!J$REluzx{sIZ{G8D-GXF`Ya&3k7-J)XeZ+^DM%2p5>Z>>0-IfdE947T1V$g)5*!1 zh+}*iMEc*>fOI5+Ym%X*QhwbG?b4pQIIKv$wXeQ=| zkKd3&Y@|x=JJ8y!or!F=vQl3k`4X3OS=26@KNQdR=24d#(cL_;Z&)62Hd2+eTC!X1${|@C_%pgUP3GnN zyy%$8f;4;0W0v;fma3{MPZEp7QFai4Ep@@;7)ayt1g@R*t@$^4(4zO+-}DB2`wci- zT_GHOZ7kDT0~`ri+2i;qW8K~j64h|cYwDXGJ|Sp`pnR!_<#w0Mead&pmDbb^f}7}I z$31vVUhO~eh!Y;&@=U!!WV3oSn8j-9_gjz#oQ8#)atQpGawE95+pl|tfTyAfRQuYj zxaoB(w|kbTp@cB!`G$w3WmDAHag=o>S%jmJ!kX$syHnP3?kBjR`g3nj=+4FKjb>}D zB2WA9Nxe$rh&3|CO@jW);{{=G-=Pcpa_C=#c$s=S&gob5**QBp*{4i;)>5>J^F7EI zM&nfDmgZQ`CT4X?qq(WE#(m||wHmbY>P&ylDkuBQKT)DF%1vDd%@d!YKBkz_f@D5U zFl-g?KWZC(6|p6Jq(VydSrLe~pwJrvHy=q{u*G72Q z@{N?~6r^<_qoR_UtT>8L0B6vq5o9PDUft=4-14j0u^9ree46KZn;E92DsCJpE0=y? z(!!j5M0hnY>iHE?ocg)v(dP~!gt|*FS&I~e3T8?)yB?#!C=!eW47t)(Yli4+*V6kW zRC%Z5@m+0lZEEjuONNz8xpxeFycHXc5F{vwk9wAq))ysosg8td)h5}(LYh9ob2J-T zUdp7!g?SaYKQtv`FPPzCKTfGeOb9D`{i+@{J#L)OER=xl?B}dzRzyn`RT&`_K5?Uq zRC49xv~ul5XvxuB(c> z(-nct-QpO+dJPNT4R)8bXe@w|-DijSLJ-44sy3s()w%t|fn9R(#hw_c{N2}9$i z-$*>Xwg^0uCcQ)=4JviBxS`Wr)H!^QF8xvI@Z8;X0>>1|1lt+Drwt{iKF8r&LDJ`8 z)2(h6kx`ch3QEp z$Q1Q)_VE1{P5iC{kr8gzp;Fzg59vQ6JlNN9@m-k$Ym)4-r`jEZTieukU+lHGQ0~r@ z+%7g-JNUuHfZ@rJdA!vbQOyiT2Dk+mB3QDfY2 z4W+cod^oZ+j5wvoJUaGB3`zXEHue_xuCQ&4uh##Ve@O+8bYWQJt#XR?82Q(&Q{MUZlt>#L+rvH;(0IUsPl(HU3z9= zfyF~aP~aTvCGmp4SSB=r2oCQr@!-HEcUuEGWh14YX($EULJUTo6Y+Cb5n5f_-=9Bh z;s$rN5fX3lg2dLjC!%SPXDRo-xIEzRGg>&yv^8(M2qcOYQH2QysqxfwusJ<7GveJ> z?vl*?^$ukUX~>A^=qdF;&fd3w{H`VHC)EQ3^*5CS!%55|> zZ}@`nDS!7#IV~n(IGoS?y5};LxTb_8DxzeVfRMP0vU8z|c&zpcVv*b(m{${gN(TcgrdyXopZ z`Ig3<$+~yru<90PIBxQ(4BjA#DPLOMby#7^Q~;vftvL7+*{(-yd<kS-EUk=yI;`3OG4OCQwtPkIzVI($R0-$$oY4*0rk(l$y|z^GN%y)~_x$OI~D z>$s>zX`2qYnq|As&pWh>USTu}Y3d4>#s$Z1tV4FOS$o;8(#kzq+Emk{YV>^N3yEE5 z-gGz+nI1WYR9m^cKZVdF*T%}4M|Dlr)?dWM#uvR=P*Ky&yEXOp`>WG86Yo+0=hTb? zD!$xL{d0B%2fZ;wcYZunX*n1d`z}7sDrx%s887=6TfA0p5ZwHoZOG6j=lPmTmn=4; zGko5v%=;vC)&vGZ^R~cDkgAJ^f4iZJF3i%-)b~%Al7^iE+w@+9yFxknnHDTs*IK^5 zg;hy3&Oyt&z<$4SYILzF3H2BT=&slOYUi+HO7^NREoZF~|NkFMi|-Fl6M zI7)@fBfcs)MqtYBX|P2-UpwlB>b+S>eBh}B7{mTAuKwxw^cBgl=Arju5O`}>^dcry zQ%iO{dBcePg#9V%Lt7P~h(PvEM?WiJVb}fh5k+Y@9|$iGdY6Jf;>Lv-xakM7Eed*# zZaPa&mc~jbg4KIQ(%!5;hF|U8UpBM*(3eeFocJYlII1#7G8QByL|lGQK5+}Q-#+&V2z)7dR=Ne zjB$&&6yql`%fY2zn**#jCFz@@RvpOLm$!l(7FgZsEx(n!NBH$}Syf}9i20-{yiIrL zNrhJcI(sJ0B#3N336Bw{%gQcd@!p~@bsI1%Hce^|a3f-(2$KB#d$2-8HY zc+ya=#3jl?T*(HmiT^%N*ue%Kn`V&u>fVFViqDK&%tsd0^vts;v}x~4bM^2Eo+T|^ zy?(F@Vk7eVAd$hM{w^3ERCpUPor~JFaWYM{7~yLRZgYWcHEi@WY?}A(vu@4}_g}4i zQQN7`%IH zQQ0)=+%IJTiFDHajW16%ZG*QxkM3`XS|>K`f1uc089=pwD`O)+qkB};bSc1 z1-lCkaza{`UmYVAOJU-}i3SvT&N#Bm_r#@HzY*n?F@BolWtq6UL=#`N;8CJYj^*TH z0)-!!#YVEi9zdSvo1cIsed}t_QmPKOn!rHMSHNTzu8@PJ84Si2VKsa!!v{OB1UWI4 zSQgy$Fd6_-sMRHdBNyuM3q^`4R0dg(uGn!>`6^TjIm}Hqy)Y($S13pf87nB5e$jU>K&KaO7D!i zwwne71U=zVkjm25K?Ga@Eb^?aO7cSLG8%6mJYvUN)w)Kjqq66ed(LpQY5`Vbi5$7D zB86c(AD&3)8`I+dcU=KXQj=|wJ`wb9Lri84%utcB9Ak7b@hJ0&oPTnsAKBRJYhz`p zm$&?w-gB8;P+^ApG=4~?8;t0&Z3)GOz2fnVz{sM}Zk2hKKu&*h*4PE(Gn95h6lTQ! z0@n${xP z6oM52py2ETQQ@9MwMyOlibPhe!wFm&se>Qzn}(MW*Xap&&|8=ByaZ!;k_l!3ITiI< z2I#^a+miZH>b@u_z*)BdMsD1cWy}-W+uJ_qh4zBT8NQ{dASGd4fE0jf(&!V?8&&+@GHc6UR@Rbb2j1@ zbYGrmj}(hv(rU${jHbGzb;DhkW+UOt`hbn%RF>oybqPwlDwTt;ExZr>g{01V&1kB< zBOIB1gXHHOGP&rOIqzMsK(AvZ%Ur?BL!pc65z zD}@O;OVlsaCV<};U+piKobtVzg;Y^^cz5gTHTbctwfPFaD)#EHy_mfAXD)D0c>CDW zVzTzk10~@&lX1;Mt!vqOp3`f|ijojuU9%;68w|&I-V9@0bjEoCbvyfz;MG%m*IfF! zPA>edy}0}vOF5ug2TG|UPj={yY?+PMJk>jQs{4aADMnv(1U2bUIk(GLWyfI^kl>6< zoGhtbm}Vb`-~KvZMxC)sU$dxeN<@efQBHLv-9*)EeXP?`Ep33yON+>BC4!Ri#9A;H zLP}0Hp7Rm85o&{Jy2RFZS=lE^E}7NHv*g`$VM1tJOk>{a2(m!)2i8O?xyBW-w>`ga zw^H0%aZ7mVDiNL1xA7L}@q~rfpQ`e*-b-6KteGy{aT560|K3|RJV7)X&A!-pXH!A# zLq7hKzsn@4`>r=IrJ(c)s?8wnf1j6vzso1KY9>qwOHyzV>Pz3`* zF>lUmToE>}h5;%J&dim>$cUs$dx-iwAEYzPlhGK(v`KsgLO(Pw5grW`jL(YU68VL# zi{^S+c{u9>Ejq?`B&9OoS1PL%r~-o>33e#Se1_2Yb+F*`nqVCg^aB#FedwGBf2Uv~ z#r2RJAjY!BeWBCJ4gGz6S(E%s6^zsv{~Puj((cZ`aJwU@mi|RIKhkUO)HZr4KU+Gl zd>0L6@hX06V;+)?{0cV+NPUb?8*9XjzK8?e_Pda$DsEEO*c|OFePzIpW#MMg*|!5? zSYz#c%D5(Ws+rnIh%+AxZ<(n`p16J0Nl~L^Hs3JWk=!ZS*kT`(M+_A6h)FW4?wRV- zK@p_9Yc*7naY7KJ3&oYkHA+RSDMDWKWPK@9=LhjT?i>z1JGcgzg@&&M1IG<0k)UJz zt7)K*d9a@soZF>|OrnFH=vTy7p|NVr!{t{{PBS7~NK_r}ladIkpxLUT-NZIsGyap= zMSIl%(=<`mXKc<=4zK+-S_XH<$RBXY9JyNMJu4l=(m#ETOyf?#{C0e1;v-sN-KJNw z{922Kxa}ehJ3| zBT?TgZI0iPHlkX-;<}9|peCn}wjYTL!FlX^CB@FoVskOAXn&~KS59IL7p#$`1l zH>0vzDS?#m=mEg`=FT&FPUoTz6_2(x(mb2I2KwxqE`n>%c^}ot(+cT}SU`eKRBkGr zURj~RpLlVxc(0aN%j-=78-5@QtoVPIZl1^+?`5Aa$?L&$3py!8PwUBAE4C7>-bk zp!Tz$`D+tzGA)Cc_dPCa7_`8xgl8bpaduAgBI;TON@GTdR{bl>h57>cUP`gA4IUhe zy1b6ZV%&j>7b-FDOT*LxRs$#G*|n(Lr2dwBoi$nt=Q7%xB?BF`^-idbUzEBdLLbGgtzwRt(ybO+t1{nnWog9?sFNv%~Cnm2EcFsOqc# z-^C42O1v&vrKrz?L|{o$d8t{MJ?Z_IV@=S4Exoi8RrNC{+K}4!-=!PfBV!j%TJct%X|9g{IzZB z-?dQ=1^bP*vcW zdCzb(OCTs$hAT8XO`KnsjOxpEnKJRps?MDA^*ig6bELCZdT1hG?pPz}s8IMG+(TOY z`4&hf*|0BT^Z-$iEo!R~dY2goT=KtlhT_=1ksSHl=TA&?6sY?P?Tk@TV_EPVWi>I` z&{{Vb=07Vofkdk$=`#f2(C+Z}esl2F+H+#K>b`zEWNUQQXxCUh92Fk^yy`H%)ySjTE$@%N5E`{uBw2b=J6At~ zPb*5mH@(nVu43YS?h&(yX!mnTQI3uT_+T~3?Yv**HlyvTOS>pCD5KsLxdsO%Ec*A9IRQa)X}f>+ApzEme%CSA6?k^%>*nW@UBb<( zNf7FIK}u#ejC)sm%%a6#JVV~lb9q{@V-7_lEn#(0I?6)z9u292$tVqel067*t96Hq2qj|w6yHp;vrnVR^98j1#*m>SuS z?>1NFBd@w0f$Q-J40_3bI{(s7T9*7u*nM@f>FuFTjV=fkSMY^hX2?bV#y5+P)L#fU za7HP=Tf~p9(04OWg8*&#yJsLV<81RJNKW^NgRn3+B97GJOIT*spDg`Xyg9ASPEe#_ z;LDNfPPSfbfw?eeafE82(k;u4f{c6gvz-m$=fd{IwPapl0fM5*j|T{+vT2h z6>CXsMTOso!x!9H1fwOa<^t-AgRVB^zn+C(OqV8YM|cC#~kV>u=tB>QMz z57k;)biB%ci4S)DRGd!HjG~>B_RG@B$>O;Xnt#(Q#2pLt_ixW|zE|-AGahmauF;<+ zS%8MLwYBlA>?-O;C-{DqsJ-N0T#7G=cKvqsL9F7W&2+-ve0(dSzzxXdJ%aMzi2Ig!oym$_4C%oWnSTt;ymAzaJ{N--jPblTLa`iHKBR< z4!*c*2b>6}vBSQytT_f{kQhgM3WhB*H1lU6J!74X)2h3#O2-~Oj5p0kY`3v0w7 zVSL@30HtdW2`>x=$YW{UL?Pe9^f7f3m|e9Q$@Jw6yZzcJ@xg5hF7Z;cI7>_3y5{W} zEweT!)(S-SJ!VmvwW+!!iQ*%Sp5SEjy-!?R4;$4 zO>RDhD{mgJu?E|rj@4`55__6t_fZ&PZJX>Xf|W`&2bOe5jpeWEcOxrCs1Wvz?s#NJ zerS{xJTd8U7nTx*qMSd-$r@Zne`r-_>8Ai|UBlFrDu8@%oCX`$VQ&g^Ul$U|CJ@|T zx(Mp#3y_VN5ojg@GpzZGy6@%rfsPl~4kIS70%H-LRqjd&vKH~8UfV6y{jRhaQcZYW z11Z@TWo86oSH$6bT&uJjzpFo8=^5vw>0@NJyebKU-X%H`aky1WB0cD)X0{9hd*WGj z0xhsKGI=!$4ieTw|LC0O2Tm*_9Fy&@xF&FBGn`6LpBngmNvB%FjLD>Zei8TcmW5Iei$^0hN9DKU9nOALq4RRf_r|EY|6yVC79P&}-uj$a z4uDDg+iG|vA>CREnft~U)V}S3eV`Vc_^r+{DK0h4i3eQ{&V)u_uz)auiPV*ypOl<< z(0Zer6Pt&0Vto~g)o?D9KUa@M&fGeGMamINn2g$zU}ZF^R$duX{5wSNk`1n6rzhy( zlDPiFZr8|-^=7-%Ou}8P#aoxc|cj9P>iTmY3#6c5)zFyR^nLFh9+J@j&^b@j0Egj7!i&&%%3D zWc6}J!ZJ5iVdSfozR461{UjqK6y@s>IL$g82Q%~8>46;lt6aAJ{Q0Q zBgD>*Eh6u?I<~3~W2&f*YGJMWQq22+sfGVQdXXa z(AcGz8x6`9^{pk}M6~ISnUE`~M`BPzzm5sIaLH>$9Ww&&dbazaQB=MD4V1u-?c;rk zMB=b=d+k}6<$@}^iafG*5zh7|P(hylaWQ|8CSKk6Rp|<0gbil4|Gizs#n6kt&5)+` z2Faz;zW2nbF>eE%Ci4t(ObeO>s^wmz@vNS1CloI|o82fv{;@KyJ{1+etNV@7QtL|P!h9M|G~VFzdlo|IN7Mpo8(fK37vXn%VGf}VHlil z2jw}kKi1JjlWB~+4igm`iX<%J=XYRS~MqlB0a-I(%I&<^?zd@*6B4=V*e{FlgslOix!f zQPtZ#sIxU;S}x;?Y`nakZ_j}R4}7b58ASa2;2b!{^3lrcPB5AlrwwFNhbEG{Sl(1Y z+9o=FDP-O4u7PL7MWcpjqZ`n>o!jO71Sf;q^8Fgrv4{r!d?vrxSuH+kRAqS2i>bOb zYxcZjFE=toiq2j0C5=U7zO7~A?qf;{TRVkj5Bpd{{&j(CWtSogtopuQ4_<2Gw2dl% zxY0S6$buS2vjm3qyjxNAvv0)vQXG|ro<%}#Sbu4#uR+_Hqh%R-z*jG8XP1c&g7R54 zKRmaBpC;yZ%In-47+5soc{6>g6jW)1T5VgNjyP}#m|l|`#x1vBpHdePfKmV2KwqQjI2MF&<$5IHZJt| z%y`hq*Wv55un`{Mv5W?mp9sZtK*o_n+}nAOAgNWgc4@G{DAqZ4kA&nW2$^GHZg{W+ zamG`cQTFzxwKACxVw&$Lflv@Yuw?;fTA_y%wHFkag;KR(aLYI$J>pA+a!;`G6MW>p ze&n2#6}|sni8>xoNbes0KXqGsJe2t!o*@mUX0+NU%#b#;#^|yxDKAm7 z+hrYHbVj)(x)2h>V&2Kv&6M_9a_i{!1A{HNHqUkAv9H<&KihO4 zT-zVQprd8_VhdsV}Sp&{sMmgh0Lk?_tImsPAZO;7tD z1MaawQB$4$F-s#;AJqK9>1!8sZt92Lkh7&C8bU4*l*2;Uj$ZTMOo~^u^T8_Q-E;tW8PYeB|ZH7}5quX4ye2 zoyTTDhd9{W=Lu`tPPXgj{B6Gbh(!^C=MM^Y?|;934VUc{lw`NMK5aPs@>pJH4tBs~ zz?l^Fa(U}L+HN5#9D34y#_)R4;JzyRfY*Jt@@e^8KE<71{~~Xkv2!jx`AVv^*U0+l z!z4wX^YDM-=-N}1H+@G+LTlEVRLgIg751h}SQeK7nQolK$l!QS9F4?tE@tNl91q6;b$I z`?)gS&}a|(AO&ZLTYgxZBIx8hCKj2N$W?MlqgFuAc!Of@;v+>sf+2x{DVZot)@2pJ zmNrsm`!`sQJ648q$Q@u7gFU>lsbZW)daqo;<8RS(f^N)zM<->IN6n0Rz8QnEx=q%(Z|Mm3}uVaUxJ+vrEW-=;`_JXD4fY z;m}8hKi$5PoF5EG*QVo!A>uQFYW|F@AQcbHQ6Bs7KJ`o9# zJWn=G$tvat1QaCfDlZQ?m5`w-Dqs8OAk+JN zn)x^l?$HyRckzAhP)i&;U7gT~H#Mxm z9=@ugoWWHL)@fLj=X%OqVrB#)-+pq29GWiLhgj4qd_rFcJ6;$zzr6js-Qd~2>qfPg zb<^{&-a^HD^-o<_)WzZkE{M;G+7z8!4T6>DH2=Gd?mZ@=&nF>oPEXyg1(eTpw+gJ^ zw)M*;MaXg_1~;0VQHd_?LS*XHfV*C|VB=A)^Y`i%6M~BaOITTp?!c>s@v9jt$tHP z@Vx0+U3)Wd;v(2&T=0n@q-E3~jF4?A(6JXeDFF9e0L zFX|;a*FUZpQ^OW|>Q?=Z{nPY-+{TU9I3?uja7Tu&gOg=4>Glu8-jzBFt0d}CqsiiV zz5MO1OD1Q4QTjq?rL1`N&VWF_HCD4{Er)Yd4f#wH$`m2mCiUD;_Dq@^!>ztWZ)%NB zLb`8|%i|hPk<25=x-7_VVMZ+-D7}0&9cW_ttjzdoJe=iVAXDl$i2a6x2yS2@jCe#w z8rQr=`H|aCQn1puT#i0cA|m%p=HfY3v(;vHa{dc`jd-hztOh#UmCBx4M*e4NT*J}k zrIxO6_NNKr%tUSu`sZ@;)G#NBr1+qWe>v-a7|Cu$Ypjpk2=_LgZL4#1FlRZE+^Y(s z?RnPnrh4&$J&hDl4td8jZDfPb+=CCI=HqD5B_5}(4vd=^$bVoflh{FrOd|`PChS@t zY#SM3z#_G3Mdvik7Wy2tXW)W4sS}fqqMxljhz{sQM zNHOlK8|{YrUps(W`2ocIy{`a&jin>Y39|sQ1R3NOkb(ajNg&XIMHll_fefAh3;i`C zHIpa6z|=4*6}*RUR!_0ypkc*4oS_RB0gkv2bjBC~FkA=25|o;!vB9K1H$l9u9D;#Q z`zt$IQ{j(t#xQQ}i>?tJ!Zesl)hMM}@|gBB3OVOd|DpxUv0PHm@W^IWvl338&P0-N z`l>2%1O`L{0Nx3#WdI>!zG?tF)3Dzc(WuW*5QkBnp;7d2nNy20r$NXdAdG=n>v2FL z7^&e*ErMzVai0_bKac2ZK%STz2CTE8JY?el}_gaXr-!91;}4eq#Q=?mtp%2QRV8nZ6neg;9Cr+2UVbb zHyZd3#vMaSO|{PbsqmzsRVi@Yv;Z3~{(z@s&;a=z`1P8JA4sxg3xVDvKnw*YFEBbm znJxq$z_Td%V@wLV`$k|2ki6Hpg3Gza#el3!x(|kfjMb3CxO@Hi^Huel!cDGsGZ&zT z#n`u@+%H~Ah5@)T`X~2%NA3xM#%>n*<`Z@u=#dIRgW6Ti`UpEL0o0|I3Rp!~z%DY^p{xT@cJG&9V0gG>r(440eJGXV<}FI G$Nd)| Date: Sat, 13 Jul 2024 11:28:44 -0700 Subject: [PATCH 38/80] [update] task2: deploy web_static --- 2-do_deploy_web_static.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py index fd6e641b1c1a..2090d9ba693a 100755 --- a/2-do_deploy_web_static.py +++ b/2-do_deploy_web_static.py @@ -6,8 +6,7 @@ from fabric.api import env, run, put, sudo import datetime -if __name__ == "__main__": - env.hosts = ['100.26.152.53', '35.174.208.133'] +env.hosts = ['100.26.152.53', '35.174.208.133'] def do_deploy(archive_path): From 705924d84c2d96c9ae919362ebeb2a7e95790631 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 15 Jul 2024 09:50:14 -0700 Subject: [PATCH 39/80] [update] task3: full_deployement --- 2-do_deploy_web_static.py | 17 +++++++++-------- .../2-do_deploy_web_static.cpython-35.pyc | Bin 1191 -> 1191 bytes 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py index 2090d9ba693a..f92de8ac71b9 100755 --- a/2-do_deploy_web_static.py +++ b/2-do_deploy_web_static.py @@ -6,7 +6,8 @@ from fabric.api import env, run, put, sudo import datetime -env.hosts = ['100.26.152.53', '35.174.208.133'] +if __name__ == "__main__": + env.hosts = ['100.26.152.53', '35.174.208.133'] def do_deploy(archive_path): @@ -18,16 +19,16 @@ def do_deploy(archive_path): put(archive_path, "/tmp") # Uncompress the archive - sudo("mkdir -p /data/web_static/releases/{}".format(a_folder_name)) - sudo("tar -xzf /tmp/{} -C /data/web_static/releases/{}".format( + run("mkdir -p /data/web_static/releases/{}".format(a_folder_name)) + run("tar -xzf /tmp/{} -C /data/web_static/releases/{}".format( a_name, a_folder_name)) - sudo("rm /tmp/{}".format(a_name)) - sudo("mv {0}{1}/web_static/* {0}{1}".format(path, a_folder_name)) - sudo("rm -rf /data/web_static/releases/{}/web_static".format( + run("rm /tmp/{}".format(a_name)) + run("mv {0}{1}/web_static/* {0}{1}".format(path, a_folder_name)) + run("rm -rf /data/web_static/releases/{}/web_static".format( a_folder_name)) - sudo("rm /data/web_static/current") + run("rm /data/web_static/current") - sudo("ln -s {0}{1}/ /data/web_static/current".format( + run("ln -s {0}{1}/ /data/web_static/current".format( path, a_folder_name)) return True else: diff --git a/__pycache__/2-do_deploy_web_static.cpython-35.pyc b/__pycache__/2-do_deploy_web_static.cpython-35.pyc index a65b4bcd1f78c8eda8ea29e2b09fd86c57956e34..d8b7fc6fdf7450ac68c54c83be87bbdcb310a1a3 100644 GIT binary patch delta 25 gcmZ3^xtxzOqe0a>R8p#T5? From 0706b32be577f17b9c488ff8b838cc9136a0bcba Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 15 Jul 2024 10:10:07 -0700 Subject: [PATCH 40/80] [update] task2 --- 2-do_deploy_web_static.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/2-do_deploy_web_static.py b/2-do_deploy_web_static.py index f92de8ac71b9..7c06afb44813 100755 --- a/2-do_deploy_web_static.py +++ b/2-do_deploy_web_static.py @@ -6,8 +6,7 @@ from fabric.api import env, run, put, sudo import datetime -if __name__ == "__main__": - env.hosts = ['100.26.152.53', '35.174.208.133'] +env.hosts = ['100.26.152.53', '35.174.208.133'] def do_deploy(archive_path): From b7e2310e9c3753ddea4fdf5e13b9bf3f8a8a2bd1 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 15 Jul 2024 10:28:40 -0700 Subject: [PATCH 41/80] [update] task3 --- 3-deploy_web_static.py | 52 ++++++++++++++++-- .../3-deploy_web_static.cpython-35.pyc | Bin 779 -> 2097 bytes 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/3-deploy_web_static.py b/3-deploy_web_static.py index 8b8f0faec5a1..5ddf10dd8c8e 100755 --- a/3-deploy_web_static.py +++ b/3-deploy_web_static.py @@ -3,20 +3,62 @@ to web servers """ import os -from fabric.api import local, env, put, sudo +from fabric.api import local, env, put, sudo, runs_once, run import datetime -pack = __import__("1-pack_web_static") -dep = __import__("2-do_deploy_web_static") hosts = ['100.26.152.53', '35.174.208.133'] +@runs_once +def do_pack(): + """ function to create .tgz archive """ + + time_stamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + if not os.path.exists('./versions'): + os.mkdir('./versions') + archive_name = "web_static_" + time_stamp + res = local("tar -czf versions/{}.tgz web_static".format(archive_name)) + print("Packing web_static to versions/{}.tgz".format(archive_name)) + if res.succeeded: + size = os.path.getsize("versions/{}.tgz".format(archive_name)) + print("web_static packed: versions/{}.tgz -> {}Bytes".format( + archive_name, size)) + full_path = "versions/{}.tgz".format(archive_name) + return full_path + else: + return None + + +def do_deploy(archive_path): + """ function to deploy archive """ + if archive_path: + a_name = os.path.basename(archive_path) + a_folder_name = a_name.split('.')[0] + path = "/data/web_static/releases/" + + put(archive_path, "/tmp") + # Uncompress the archive + run("mkdir -p /data/web_static/releases/{}".format(a_folder_name)) + run("tar -xzf /tmp/{} -C /data/web_static/releases/{}".format( + a_name, a_folder_name)) + run("rm /tmp/{}".format(a_name)) + run("mv {0}{1}/web_static/* {0}{1}".format(path, a_folder_name)) + run("rm -rf /data/web_static/releases/{}/web_static".format( + a_folder_name)) + run("rm /data/web_static/current") + + run("ln -s {0}{1}/ /data/web_static/current".format( + path, a_folder_name)) + return True + else: + return False + def deploy(): """ function handle full deployment """ - path = pack.do_pack() + path = do_pack() if path is not None: for host in hosts: env.host_string = host - result = dep.do_deploy(path) + result = do_deploy(path) return result return False diff --git a/__pycache__/3-deploy_web_static.cpython-35.pyc b/__pycache__/3-deploy_web_static.cpython-35.pyc index 718cede061dd2b736a11161230c8eb3bdecaaf98..aaedb8a2322eccdd27c85b7adcb9e2464a5d0800 100644 GIT binary patch literal 2097 zcmaKtPj4GV6u{r?KieBSK`pdR)4 zoHm>I6vQ{+L+}MSa^=W2&<|55Epqn*e{q z+|S1T7uc#_P%wZHB>`qZMj*rvJ~m_)Ti$tbnK{1EZOj8=j{rV!ev~G95@8(_BebN28yIcFgK&Kczs&D~w9#t}yX%f|s zWGrYusfYC9{or(BB3)V4-EZRLC@uDNwPv1r;u{|I(oIEw&VGa;IQ#Ub6YW2xr<3gy zL}RDdR!xS`$TY_a7v)RUL~e#=XqA<6MzK6l9)E>6Rm#neSSo~t1y$a#6nQL_I}&Lj zRjV2&3FnM6)!655zaI|1 zOvQGw9VJ;=@aTABu-RvPl$9sZ)%JqXiE6MC9h0L4&Dnhv;M^m(NQe039detr$O^U& zSt5=lmho*uvv_GP6Ha(rxYliAqNVWDt zqG|ux|9ki%zp$-W^J99tHaT6N%rE7mnXV4dv@bC98y9;z?^v(s&^K+9u@JnF^#@r& z`_;vCZ?yaN`A)APG+CmJLN)g=D~4US8fB>znjg{7VhKgh2`>rPEQelfNDn)4G%Pd5 zg&CSyhVrSnr$e_8<7t83!(sIh1y~+}e4BVy$I>8ouzv^ted1esgg~#N)#Zt6<3P7( z*eWgX#61Un#A-?j9JN4v4zC`8B=FUbD>JmE1BN;vpgQD%67R)Cox$90xnHYy*lm2l zQdyI&`e30_<_Y6*znk3u>1SJH`^451rmBYKSc?SO1Y=+X3;~VS@gR~NEM9NXrgu1P`0LuykEMK zZ6;+?IVPlB5vMm@`2rDUk9N7@{`{e6SdG96NI*j3k$K_}F{3-BP*KKsQfEwANt(UW t)qR!cH5toRFIGNdtzJJ7k}=`xxbTcnBW7BJ|D~9P`6Yi%FVWWu>@USFYe4`2 From 2aca0b393f8eee529ccfdfba610405846285a722 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 15 Jul 2024 10:34:22 -0700 Subject: [PATCH 42/80] update --- versions/web_static_20240715102746.tgz | Bin 0 -> 19300 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 versions/web_static_20240715102746.tgz diff --git a/versions/web_static_20240715102746.tgz b/versions/web_static_20240715102746.tgz new file mode 100644 index 0000000000000000000000000000000000000000..34af40003fd83fc51428e743bf5d6af898f7fdf1 GIT binary patch literal 19300 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 G$Nd+mv9t03 literal 0 HcmV?d00001 From c36387bc3201e470a89ed6839f38ee8283c0d823 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 15 Jul 2024 20:22:16 +0000 Subject: [PATCH 43/80] [update] task3: --- install_conf | 15 +++++++++++++++ versions/web_static_20240715102746.tgz | Bin 19300 -> 0 bytes 2 files changed, 15 insertions(+) create mode 100755 install_conf delete mode 100644 versions/web_static_20240715102746.tgz diff --git a/install_conf b/install_conf new file mode 100755 index 000000000000..34a400847d25 --- /dev/null +++ b/install_conf @@ -0,0 +1,15 @@ +#!/usr/bin/bash + +pip3 uninstall Fabric +sudo apt-get install libffi-dev +sudo apt-get install libssl-dev +sudo apt-get install build-essential +sudo apt-get install python3.4-dev +sudo apt-get install libpython3-dev +pip3 install pyparsing +pip3 install appdirs +pip3 install setuptools==40.1.0 +pip3 install cryptography==2.8 +pip3 install bcrypt==3.1.7 +pip3 install PyNaCl==1.3.0 +pip3 install Fabric3==1.14.post1 diff --git a/versions/web_static_20240715102746.tgz b/versions/web_static_20240715102746.tgz deleted file mode 100644 index 34af40003fd83fc51428e743bf5d6af898f7fdf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19300 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 G$Nd+mv9t03 From 82e510ebc94aabcb8db56d8102bae1f18c3f578f Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 15 Jul 2024 20:23:44 +0000 Subject: [PATCH 44/80] [update] task3: --- 3-deploy_web_static.py | 1 + 1 file changed, 1 insertion(+) diff --git a/3-deploy_web_static.py b/3-deploy_web_static.py index 5ddf10dd8c8e..8ae4a3d9213d 100755 --- a/3-deploy_web_static.py +++ b/3-deploy_web_static.py @@ -8,6 +8,7 @@ hosts = ['100.26.152.53', '35.174.208.133'] + @runs_once def do_pack(): """ function to create .tgz archive """ From 66fcaea5ce97178269294fce8fa5bc6de85d8cc6 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 15 Jul 2024 20:29:27 +0000 Subject: [PATCH 45/80] update full deployemnt --- 3-deploy_web_static.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/3-deploy_web_static.py b/3-deploy_web_static.py index 8ae4a3d9213d..643c8a08fb1c 100755 --- a/3-deploy_web_static.py +++ b/3-deploy_web_static.py @@ -6,7 +6,7 @@ from fabric.api import local, env, put, sudo, runs_once, run import datetime -hosts = ['100.26.152.53', '35.174.208.133'] +env.hosts = ['100.26.152.53', '35.174.208.133'] @runs_once @@ -58,8 +58,6 @@ def deploy(): """ function handle full deployment """ path = do_pack() if path is not None: - for host in hosts: - env.host_string = host - result = do_deploy(path) + result = do_deploy(path) return result return False From 9dcecb5ab61e09f5231f237a6e0d9edf6f57e3a7 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 15 Jul 2024 20:35:34 +0000 Subject: [PATCH 46/80] update full_deployment --- 3-deploy_web_static.py | 1 - versions/web_static_20240715203346.tgz | Bin 0 -> 20270 bytes 2 files changed, 1 deletion(-) create mode 100644 versions/web_static_20240715203346.tgz diff --git a/3-deploy_web_static.py b/3-deploy_web_static.py index 643c8a08fb1c..eb929dc2a775 100755 --- a/3-deploy_web_static.py +++ b/3-deploy_web_static.py @@ -8,7 +8,6 @@ env.hosts = ['100.26.152.53', '35.174.208.133'] - @runs_once def do_pack(): """ function to create .tgz archive """ diff --git a/versions/web_static_20240715203346.tgz b/versions/web_static_20240715203346.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ac5a6f90f540311aca63c192bb366609e305e1be GIT binary patch literal 20270 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 H0N?=tcMVM+ literal 0 HcmV?d00001 From 3c704ab92ee3f851edcc4e44b965fda5d4354eff Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 20 Jul 2024 14:43:32 +0530 Subject: [PATCH 47/80] update on MySQL --- console.py | 21 +++++++++++------- models/__pycache__/__init__.cpython-310.pyc | Bin 502 -> 502 bytes models/__pycache__/amenity.cpython-310.pyc | Bin 460 -> 460 bytes models/__pycache__/base_model.cpython-310.pyc | Bin 2823 -> 2831 bytes models/__pycache__/city.cpython-310.pyc | Bin 900 -> 900 bytes models/__pycache__/place.cpython-310.pyc | Bin 1659 -> 1659 bytes models/__pycache__/review.cpython-310.pyc | Bin 923 -> 923 bytes models/__pycache__/state.cpython-310.pyc | Bin 1195 -> 1195 bytes models/__pycache__/user.cpython-310.pyc | Bin 904 -> 904 bytes models/base_model.py | 2 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 199 -> 199 bytes .../__pycache__/db_storage.cpython-310.pyc | Bin 2820 -> 2820 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 2848 -> 2848 bytes 13 files changed, 15 insertions(+), 8 deletions(-) diff --git a/console.py b/console.py index 6f1ad25fb4e3..17cdb3bdc0de 100755 --- a/console.py +++ b/console.py @@ -144,11 +144,7 @@ def do_create(self, args): kwargs[key] = value new_instance = HBNBCommand.classes[arr[0]]() new_instance.__dict__.update(kwargs) - if os.getenv('HBNB_TYPE_STORAGE') == 'db': - storage = DBStorage() - storage.reload() - else: - storage = FileStorage() + storage.reload() storage.new(new_instance) storage.save() print(new_instance.id) @@ -233,13 +229,22 @@ def do_all(self, args): if args not in HBNBCommand.classes: print("** class doesn't exist **") return + # args is in string format cls = HBNBCommand.classes.get(args) + wanted_dic = {} for k, v in storage.all(cls).items(): if k.split('.')[0] == args: - print_list.append(str(v)) + _dict = BaseModel.to_dict(v) + obj = cls() + obj.__dict__ = _dict + print_list.append(str(obj)) else: - for k, v in storage.all().items(): - print_list.append(str(v)) + for _, v in storage.all().items(): + _dict = BaseModel.to_dict(v) + obj = cls() + obj.__dict__ = _dict + print_list.append(str(obj)) + print("[{}]".format(", ".join(print_list))) # print(print_list) diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc index 3e866b10b03b9866e10051ef025bc853d2cce7a4..8121e1f2e0963ae90f5d0b5637f45c7328ea0e1f 100644 GIT binary patch delta 20 acmeyy{EeAApO=@50SH#4&EClUnh^jz%LU>9 delta 20 acmeyy{EeAApO=@50SGp-)o$c|%?JQGGzDz{ diff --git a/models/__pycache__/amenity.cpython-310.pyc b/models/__pycache__/amenity.cpython-310.pyc index 40bbc0ca0acc62acdf8d2a581a19b2fbab061c01..3f070275105e76814a397a41ab91a3cb8311bb92 100644 GIT binary patch delta 20 acmX@Ze1@4jpO=@50SH#4&ECj;kP!ejI|XC_ delta 20 acmX@Ze1@4jpO=@50SJ~b)NbTH$Or&4B?R06 diff --git a/models/__pycache__/base_model.cpython-310.pyc b/models/__pycache__/base_model.cpython-310.pyc index bf2e56f07470aecbd2d03c6f4bb828812363ece5..6771add5d45629a6e0ceea090cd239621a49068d 100644 GIT binary patch delta 74 zcmZn{>lfqA=jG*M00RE{*=fETd5zf_^Cmm8XELQQPF}`-NK_0c#lpnH$i^tg$o8L) ciI0(kiEVQ=2R|dD=j3kA%Zz-JeDnf@*1-(Eus(+ diff --git a/models/__pycache__/city.cpython-310.pyc b/models/__pycache__/city.cpython-310.pyc index 4dee8f1242f912adb9081eba6e2dfd3c4fc5957b..a3cc4f93f71d5dd5ce8ebed3991d138e57c5733b 100644 GIT binary patch delta 20 acmZo+Z(--o=jG*M0D={1vo~^AG6MiBjRcke delta 20 ZcmZo+Z(--o=jG*M0D`m~^&7b>nE@*w1d0Fv diff --git a/models/__pycache__/place.cpython-310.pyc b/models/__pycache__/place.cpython-310.pyc index b204a1229d460d213ca521700e34efc6bbd44696..86f6ad23596477f619844402314c68e37b5e40ff 100644 GIT binary patch delta 20 acmey(^P7h|pO=@50SH#4&ECjezy<(4+y#gL delta 20 acmey(^P7h|pO=@50SIc3)^Fr4U;_X?T?L>3 diff --git a/models/__pycache__/review.cpython-310.pyc b/models/__pycache__/review.cpython-310.pyc index 412bfbf4eb4232c0cca91effeada78e9f0679647..b63ae0673727f39bf90e20af966c8bc0776a7aa2 100644 GIT binary patch delta 20 acmbQuKAW98pO=@50SH#4&ECj8ff)cVB?Q|5 delta 20 acmbQuKAW98pO=@50SK-htKY~yff)cY6a`EG diff --git a/models/__pycache__/state.cpython-310.pyc b/models/__pycache__/state.cpython-310.pyc index 8a615143657bf398291871377463b27ae8b91385..c0cecdbe86c156811f3b3aff9aece73023ea486e 100644 GIT binary patch delta 20 acmZ3@xtfzZpO=@50SH#4&ECkpfCT_C?gbD4 delta 20 acmZ3@xtfzZpO=@50SFvrYd3N)U;zLu(F8&O diff --git a/models/__pycache__/user.cpython-310.pyc b/models/__pycache__/user.cpython-310.pyc index e4abd099eff80f61d607089fd07854ea5a8681ba..66b1f80aea2f47bf1333e6dbb54fed8fc7b4c05c 100644 GIT binary patch delta 20 acmeBR?_lT7=jG*M0D={1vo~_rG6MiCEd-(f delta 20 acmeBR?_lT7=jG*M0D>n+>o;=OG6MiFe+3}` diff --git a/models/base_model.py b/models/base_model.py index a94f722153f3..43f0f2a4b064 100644 --- a/models/base_model.py +++ b/models/base_model.py @@ -64,8 +64,10 @@ def to_dict(self): (str(type(self)).split('.')[-1]).split('\'')[0]}) dictionary['created_at'] = self.created_at.isoformat() dictionary['updated_at'] = self.updated_at.isoformat() + if '_sa_instance_state' in dictionary: del dictionary['_sa_instance_state'] + del dictionary['__class__'] return dictionary def delete(self): diff --git a/models/engine/__pycache__/__init__.cpython-310.pyc b/models/engine/__pycache__/__init__.cpython-310.pyc index 2c827144297f4260384ff0de83fdc73a2385565b..795cca7a3bff5e1cb146278edf0a47167d7b7f74 100644 GIT binary patch delta 19 ZcmX@kc$|?tpO=@50SH#4&7R1;2LLa61uy^r delta 19 ZcmX@kc$|?tpO=@50SJ~b)K28y0{|@S1gHQ2 diff --git a/models/engine/__pycache__/db_storage.cpython-310.pyc b/models/engine/__pycache__/db_storage.cpython-310.pyc index 91cf00977b3452f466fe6e9b7b120a91c81369af..4e5951ea0662db021c656dc31b48377bf96df70b 100644 GIT binary patch delta 20 acmZn>YZ2ql=jG*M0D={1vo~`8YZ2ql=jG*M0D_5YYd3QL Date: Sat, 27 Jul 2024 10:59:07 +0530 Subject: [PATCH 48/80] [add] web_flask --- web_flask/0-hello_route.py | 15 +++++++++++++++ web_flask/README.md | 1 + web_flask/__init__.py | 0 3 files changed, 16 insertions(+) create mode 100644 web_flask/0-hello_route.py create mode 100644 web_flask/README.md create mode 100644 web_flask/__init__.py diff --git a/web_flask/0-hello_route.py b/web_flask/0-hello_route.py new file mode 100644 index 000000000000..1bfeaa236ad5 --- /dev/null +++ b/web_flask/0-hello_route.py @@ -0,0 +1,15 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" + +from flask import Flask +app = Flask(__name__) + +@app.route("/", strict_slashes=False) +def hello(): + return "Hello HBNB!" + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/web_flask/README.md b/web_flask/README.md new file mode 100644 index 000000000000..d324e1f6cf18 --- /dev/null +++ b/web_flask/README.md @@ -0,0 +1 @@ +flask_application diff --git a/web_flask/__init__.py b/web_flask/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 From 29eb54f171266e00034e30c965e4de22ec084013 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 11:00:42 +0530 Subject: [PATCH 49/80] [add] web_flask --- web_flask/0-hello_route.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web_flask/0-hello_route.py b/web_flask/0-hello_route.py index 1bfeaa236ad5..3279590ff8ec 100644 --- a/web_flask/0-hello_route.py +++ b/web_flask/0-hello_route.py @@ -2,14 +2,14 @@ """ python script that starts a Flask web application """ - from flask import Flask app = Flask(__name__) + @app.route("/", strict_slashes=False) def hello(): return "Hello HBNB!" if __name__ == "__main__": - app.run(host='0.0.0.0', port=5000) \ No newline at end of file + app.run(host='0.0.0.0', port=5000) From 09c4e4abf88ad6826247ef0418bd152f6ff651f3 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 11:03:36 +0530 Subject: [PATCH 50/80] [add] task 1: web_flask --- web_flask/1-hbnb_route.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 web_flask/1-hbnb_route.py diff --git a/web_flask/1-hbnb_route.py b/web_flask/1-hbnb_route.py new file mode 100644 index 000000000000..e69de29bb2d1 From be45ce5a5ae652d62e39f153039302072c37a407 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 11:10:36 +0530 Subject: [PATCH 51/80] add task1: web flask --- web_flask/1-hbnb_route.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/web_flask/1-hbnb_route.py b/web_flask/1-hbnb_route.py index e69de29bb2d1..fe2812100ca7 100644 --- a/web_flask/1-hbnb_route.py +++ b/web_flask/1-hbnb_route.py @@ -0,0 +1,20 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" +from flask import Flask +app = Flask(__name__) + + +@app.route("/", strict_slashes=False) +def hello(): + return "Hello HBNB!" + + +@app.route("/hbnb", strict_slashes=False) +def hbnb(): + return "HBNB" + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) From 094fcfac3e0e8f46c5b36abd532a2f6a861359c3 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 11:24:19 +0530 Subject: [PATCH 52/80] add task 2: c is fun --- web_flask/2-c_route.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 web_flask/2-c_route.py diff --git a/web_flask/2-c_route.py b/web_flask/2-c_route.py new file mode 100644 index 000000000000..909960d3cfcf --- /dev/null +++ b/web_flask/2-c_route.py @@ -0,0 +1,26 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" +from flask import Flask +app = Flask(__name__) + + +@app.route("/", strict_slashes=False) +def hello(): + return "Hello HBNB!" + + +@app.route("/hbnb", strict_slashes=False) +def hbnb(): + return "HBNB" + + +@app.route("/c/", strict_slashes=False) +def C(txt): + txt = txt.replace("_", " ") + return "C {}".format(txt) + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) From f0cfe9db1f135252dfc882b5224865203d02f948 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 11:46:53 +0530 Subject: [PATCH 53/80] add task 3: python is cool --- web_flask/3-python_route.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 web_flask/3-python_route.py diff --git a/web_flask/3-python_route.py b/web_flask/3-python_route.py new file mode 100644 index 000000000000..b4838f52b177 --- /dev/null +++ b/web_flask/3-python_route.py @@ -0,0 +1,33 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" +from flask import Flask +app = Flask(__name__) + + +@app.route("/", strict_slashes=False) +def hello(): + return "Hello HBNB!" + + +@app.route("/hbnb", strict_slashes=False) +def hbnb(): + return "HBNB" + + +@app.route("/c/", strict_slashes=False) +def C(txt): + txt = txt.replace("_", " ") + return "C {}".format(txt) + + +@app.route("/python/", defaults={'txt': 'is cool'}) +@app.route("/python/", strict_slashes=False) +def Python(txt): + txt = txt.replace("_", " ") + return "Python {}".format(txt) + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) From 6dddb89fba2611225e109a5022a50b5c651d9a10 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 12:17:39 +0530 Subject: [PATCH 54/80] add task4 --- web_flask/4-number_route.py | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 web_flask/4-number_route.py diff --git a/web_flask/4-number_route.py b/web_flask/4-number_route.py new file mode 100644 index 000000000000..dc890b3e5a12 --- /dev/null +++ b/web_flask/4-number_route.py @@ -0,0 +1,43 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" +from flask import Flask +app = Flask(__name__) + + +@app.route("/", strict_slashes=False) +def hello(): + return "Hello HBNB!" + + +@app.route("/hbnb", strict_slashes=False) +def hbnb(): + return "HBNB" + + +@app.route("/c/", strict_slashes=False) +def C(txt): + txt = txt.replace("_", " ") + return "C {}".format(txt) + + +@app.route("/python/", defaults={'txt': 'is cool'}) +@app.route("/python/", strict_slashes=False) +def Python(txt): + txt = txt.replace("_", " ") + return "Python {}".format(txt) + + +@app.route("/number/", strict_slashes=False) +def Number(n): + try: + n = int(n) + return "{} is a number".format(n) + except ValueError: + pass + + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) From a706d5833dcfb394c291eb36b658e41efa1ab441 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 12:40:34 +0530 Subject: [PATCH 55/80] update task4 --- web_flask/4-number_route.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/web_flask/4-number_route.py b/web_flask/4-number_route.py index dc890b3e5a12..bb60a07a7aa0 100644 --- a/web_flask/4-number_route.py +++ b/web_flask/4-number_route.py @@ -2,7 +2,7 @@ """ python script that starts a Flask web application """ -from flask import Flask +from flask import Flask, abort app = Flask(__name__) @@ -35,8 +35,7 @@ def Number(n): n = int(n) return "{} is a number".format(n) except ValueError: - pass - + abort(404) if __name__ == "__main__": From ef9bf1e1102490c6d504d5758c9e3b4ff3c7082a Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 13:06:16 +0530 Subject: [PATCH 56/80] update task 5: render_template --- main_place_amenities.py | 49 +++++++++++ models/__pycache__/amenity.cpython-310.pyc | Bin 460 -> 787 bytes models/__pycache__/base_model.cpython-310.pyc | Bin 2831 -> 2854 bytes models/__pycache__/place.cpython-310.pyc | Bin 1659 -> 2549 bytes models/__pycache__/review.cpython-310.pyc | Bin 923 -> 923 bytes models/amenity.py | 13 ++- models/base_model.py | 12 +-- models/place.py | 80 ++++++++++++++---- web_flask/5-number_template.py | 51 +++++++++++ web_flask/templates/5-number.html | 9 ++ 10 files changed, 190 insertions(+), 24 deletions(-) create mode 100644 main_place_amenities.py create mode 100644 web_flask/5-number_template.py create mode 100644 web_flask/templates/5-number.html diff --git a/main_place_amenities.py b/main_place_amenities.py new file mode 100644 index 000000000000..b2dd91e3231a --- /dev/null +++ b/main_place_amenities.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 +""" Test link Many-To-Many Place <> Amenity +""" +from models.base_model import BaseModel +from models.amenity import Amenity +from models.place import Place +from models.review import Review +from models.user import User +from models.city import City +from models.state import State + +# creation of a State +state = State(name="California") +state.save() + +# creation of a City +city = City(state_id=state.id, name="San Francisco") +city.save() + +# creation of a User +user = User(email="john@snow.com", password="johnpwd") +user.save() + +# creation of 2 Places +place_1 = Place(user_id=user.id, city_id=city.id, name="House 1") +place_1.save() +place_2 = Place(user_id=user.id, city_id=city.id, name="House 2") +place_2.save() + +# creation of 3 various Amenity +amenity_1 = Amenity(name="Wifi") +amenity_1.save() +amenity_2 = Amenity(name="Cable") +amenity_2.save() +amenity_3 = Amenity(name="Oven") +amenity_3.save() + +# link place_1 with 2 amenities +place_1.amenities.append(amenity_1) +place_1.amenities.append(amenity_2) + +# link place_2 with 3 amenities +place_2.amenities.append(amenity_1) +place_2.amenities.append(amenity_2) +place_2.amenities.append(amenity_3) + +storage.save() + +print("OK") diff --git a/models/__pycache__/amenity.cpython-310.pyc b/models/__pycache__/amenity.cpython-310.pyc index 3f070275105e76814a397a41ab91a3cb8311bb92..5c0bbe84f330ba154291a5930652f7c674dfbcf5 100644 GIT binary patch literal 787 zcmZWoyN(kv6t(A_C<%dL5fyIJB+}LhksuZtR!G@u8p|2qYzF+udL}@&LR#AW1Ac(d zp`Dg$e}M+BX961uOP;y+T-)cI>lr&7_6d&7_}lsiCFG}1jz^5i3!K#%J|xMBq%u%c z2YH~wJfuDkRixuQ)=8eUd8AUE>^TUWb-Y-F-oxGnAE?ol;_@po!lpQ9v`?`WHX!_wFhvtdYX) zo6$-XANba8cW4EwbEM5UH@KGbrq4N&VWTh}aDKHD>QG5Jm$pE7$a(F#I^0F5!FlIR zY1F))n~r6>-v*$z+Rcl(g65Aw}lH3`tKdh=A~Ph z1uv8}z(1b;m$&_?W(T{|?cSwGl;NyKZ4l9jj%h*z+W+0w(6xJnrRHI`ce=tW_trtV z0C5-kV!yglLKPd(`y-#Ddvt1@ZXLIW-h1q#$Nr4$S=Z3#_{o#X{{ddgm=5Sk_y-oV B)tCSP delta 299 zcmY*VK}rKb5bU0rY<9(nf=@7nTzr8@^dbm)iKo2`F+CxH-7M^=;8|~;WN-Qb{fjS{ zs~@p?@t_Ue(=}Ap6w_s2_NEz)b_n&cdSAWZ{8sR{9KZ}6k1&Kv5*AZ&ZA!y*L1M){ zlel1>Y-wdMr)l>3FuCMZoG)UyY9v%kDE}1$&CqclBT&ikHNwyv=xrLF)nU82drWja zb=@0}_uO_-hfit?2->0>m~~~bW@@4dbIQ5Z8wk?Sduf*5r-NFbkH@!2;`_Zd;Pk{_ ZD}}wO{zA%6z`C!(sV0o-?s%6E?GFK{Htqlb diff --git a/models/__pycache__/base_model.cpython-310.pyc b/models/__pycache__/base_model.cpython-310.pyc index 6771add5d45629a6e0ceea090cd239621a49068d..c9c1d2fb474ac9f7d2b26f8ba61f4c5c84673f1e 100644 GIT binary patch delta 579 zcmYL_J5L)y6oqGIU$Y~2g={e9B_86n!~`M>2q++hhJrFuD6N%uE!G0BH9HVlvXqvN z;&vzn6i`q>mpTP~Dy01f{0F3DuCZXH`R3@Jd#}#yMd`NWrJg5<{w52*8g~!gvO(|Q zv$3(yzmdr3vNIwBWnYOdi_B3HS=S8J7ZTY$Z?o^&Z=S6^r|0eJP6uv`sp4LjG`%ao z%dROUk=`7*@MKhkd)kgd71u%q%xvl%gvc^TQ;p4OX|e(8Q=t!Mf-=hg;SDe5QgOiL zJT_q}iOJVEe%AK@2iEH=0<11W!>!N*0QY;f*WqCG{SUn5mLJflB5;Y^LhQg_F#=VwGCagB?hN>H PP?rN=?xH&hr{eNIj*NK4 delta 537 zcmYL_K`#SA6vuaFcW0*?yM)-PN?SqLS{mAvP`6$joFpzTBwI-ZmFb2^D!u@5m|Gp_ z#lg)%;w<4q>=*DcYW{68$^7!(|Gk;{zj^lVJ*VL~wx-tb&BM{otCQDBTdwQnHEUOk z*puC&p`Ox0qeBr@el_z?Gb>uiTJ%B_W!1sto1PupXlcjJliQ*lLbOobo65>0u-?I6tG{ zQ!ytw%aMZg*?V;ox(84o3nUd{{j7Ew8_mOu8csm&b-9Ro7)Df5D9Jf%gPh3&t4>2A zKdm5}LTwQUfF*zcgE2<<N`Px<>3CO0-}p?OLY8hq9!c zNRWX5&NV>KMGwv~e`&8h=s}gWxIJfA0M5BJ`IO zW}i9;cY%sOV4x^K6jLq10ft{a(NaCoQxXs?^&~M;GcZ#tuu?m)(^^nVoxn-!L0x?} z5;tuG4UAZwnvCod-oMUl^cooamdU`a=@59w6GH?dOQLna&7k z+Em*@erJ5m+f1S!^M1(bFk#+K&b@EfHrBiW&-Ylb^j?DlXv5b;Z7nJoSg}M9$@-=+ z@8!ub&4jsC@;K`Y>$|LEea3~eo^uxWv+vnR80$$MmBQGLx(V~Ka5+n&GS0JNHy((_ zK<*w!Da+z=BFe9D?YO4IVmYSk+i(Os8zzZdM$`v9P9r`FAHfdJbaoiiv0L#m zlaqS#?6Z#v!d;+Z10%!`z<~md;s8Q&WKiuTfb&S>6G{S;SM7j3GWUuy8hN54 zQ!3p4dGmg_wf*D6)d%;5M!UkS;N=Z~WL)dTWd+;1k9kw7>|w#U1oHJW5Mx9T+U9^9 z@-<~3EXsDGVNwe66IeoWHM>#oQ8>s4L&z~!2y#zmmHCkE$LxtP)PCc7lq5GjNMu$r zSm`1xD6C#o^dicHwOXYjmnAG(YQ{7@;dH((Y6a`%8HMDlX4-P;JWECb^aRO2RrRjN2`kE+M}6k0V7h4s4D+sR0);T*lBETQR)>TZQ(;Df0n4aw2vV?Qr2cdxS&jKx zwifo1JY(Vht@q^0gB1nO@?a#aYVYD}*shStj)BFiiH@%a7^e$LcuYC_KejQHWTl^#VQDNmD zOYRdGME$hU75r1Fz5#=8a$oWaxoQ6!DG>N)Qh!qp%35Nf0O8BPiQ388?t@s&!B9ob zfvCy2X>W->ZdH*xvF&MKcl=0R2U4+za!@nx* zFwEfaVJMt1gtUQM4tO^V9}lBs`o#)En)g7h<%KYzs#vx!8ev$<%cip7vV^(J6K=r( z4Fft0+&IFLO-eFE8j3n)MUTe=dBbse65(dUv z!nFpsVRsZ}aeueuww!Ov>#`g|Z>m8x^c7o$Mg9j7MD8!ls(bPkP^n13RmyXSpKO0s zjA!C?8nh1B%LZ6%z+fYSo0#AQc-!zcr>_fjM1Wk7O{~G|yd?$!-Mg=*LEh9HOq?d> za&5oEzl0zD6%3*??K@rg`yioU36}}PWd;eSc$`E@ZNDP7(KZ58%Jt;yw%_UB@D#_sN&e}bRY%UQt z*BnA0<3VqVApQ=2LX(?#$PW+%FIG=N*fexe&s*JZbvONI;$OI&*J>k-#+R*=t*Xb^ zF9XBFC3s9z#>dO|Z*m44+^pIOSnDhbj(X2n$!Lb9krNG7!_RKG%_S7?l=ap5sOluvB4coL_8t_*eZpQe2DBA>zL zr&$>L%nzXP))EDk#$f^`VTxK`gXTKJIhcl-LpI>&9L;L?RhG1IztMWq>Y1!nd;m#g?tu=Zi>83U^gxLWGO|(?03vz zwRe6MZRJvX+gMkN!H%MPJcBQo$>_bx*_ATk8#(*S|^9y3?G@NlOY9%2Yigr^N>&5 F{{ipe#)JR> diff --git a/models/__pycache__/review.cpython-310.pyc b/models/__pycache__/review.cpython-310.pyc index b63ae0673727f39bf90e20af966c8bc0776a7aa2..46cb425f86b161a38a52b0db5202e7ee5a2d170f 100644 GIT binary patch delta 20 acmbQuKAW98pO=@50SL_b=WOJjzzhH?2?P`X delta 20 acmbQuKAW98pO=@50SH#4&ECj8ff)cVB?Q|5 diff --git a/models/amenity.py b/models/amenity.py index a181095e4170..787e16c58767 100644 --- a/models/amenity.py +++ b/models/amenity.py @@ -1,7 +1,14 @@ #!/usr/bin/python3 """ State Module for HBNB project """ -from models.base_model import BaseModel +from models.base_model import BaseModel, Base +from sqlalchemy import Column, String +from sqlalchemy.orm import relationship -class Amenity(BaseModel): - name = "" +class Amenity(BaseModel, Base): + """ The amenity model class """ + __tablename__ = "amenities" + name = Column(String(128), nullable=False) + place_amenities = relationship("Place", secondary="place_amenity", + back_populates="amenities") + diff --git a/models/base_model.py b/models/base_model.py index 43f0f2a4b064..ee9fbfa7304c 100644 --- a/models/base_model.py +++ b/models/base_model.py @@ -34,10 +34,12 @@ def __init__(self, *args, **kwargs): self.created_at = datetime.now() self.updated_at = datetime.now() else: - kwargs['updated_at'] = datetime.strptime(kwargs['updated_at'], - '%Y-%m-%dT%H:%M:%S.%f') - kwargs['created_at'] = datetime.strptime(kwargs['created_at'], - '%Y-%m-%dT%H:%M:%S.%f') + if 'update_at' in kwargs: + kwargs['updated_at'] = datetime.strptime(kwargs['updated_at'], + '%Y-%m-%dT%H:%M:%S.%f') + if 'created_at' in kwargs: + kwargs['created_at'] = datetime.strptime(kwargs['created_at'], + '%Y-%m-%dT%H:%M:%S.%f') if '__class__' in kwargs: del kwargs['__class__'] for key, value in kwargs.items(): @@ -67,7 +69,7 @@ def to_dict(self): if '_sa_instance_state' in dictionary: del dictionary['_sa_instance_state'] - del dictionary['__class__'] + # del dictionary['__class__'] return dictionary def delete(self): diff --git a/models/place.py b/models/place.py index 5cef102119a7..2873a6573fd7 100644 --- a/models/place.py +++ b/models/place.py @@ -2,30 +2,60 @@ """ Place Module for HBNB project """ import os from models.base_model import BaseModel, Base -from sqlalchemy import Column, String, Integer, ForeignKey, Float +from sqlalchemy import Column, String, Integer, ForeignKey, Float, Table from sqlalchemy.orm import relationship + +place_amenity = Table('place_amenity', Base.metadata, + Column('place_id', + String(60), + ForeignKey('places.id'), + nullable=False, + primary_key=True), + Column('amenity_id', + String(60), + ForeignKey('amenities.id'), + nullable=False, + primary_key=True) + ) + + class Place(BaseModel, Base): """ A place to stay """ - __tablename__ = 'places' - city_id = Column(String(60), ForeignKey('cities.id'), nullable=False) - user_id = Column(String(60), ForeignKey('users.id'), nullable=False) - name = Column(String(128), nullable=False) - description = Column(String(1024), nullable=True) - number_rooms = Column(Integer, nullable=False, default=0) - number_bathrooms = Column(Integer, nullable=False, default=0) - max_guest = Column(Integer, nullable=False, default=0) - price_by_night = Column(Integer, nullable=False, default=0) - latitude = Column(Float, nullable=True) - longitude = Column(Float, nullable=True) - amenity_ids = [] - user = relationship("User", back_populates="places") - cities = relationship("City", back_populates="places") - if os.getenv('HBNB_TYPE_STORAGE') == 'db': + __tablename__ = 'places' + city_id = Column(String(60), ForeignKey('cities.id'), nullable=False) + user_id = Column(String(60), ForeignKey('users.id'), nullable=False) + name = Column(String(128), nullable=False) + description = Column(String(1024), nullable=True) + number_rooms = Column(Integer, nullable=False, default=0) + number_bathrooms = Column(Integer, nullable=False, default=0) + max_guest = Column(Integer, nullable=False, default=0) + price_by_night = Column(Integer, nullable=False, default=0) + latitude = Column(Float, nullable=True) + longitude = Column(Float, nullable=True) + amenity_ids = [] + user = relationship("User", back_populates="places") + cities = relationship("City", back_populates="places") reviews = relationship("Review", back_populates="place", cascade="all, delete") + amenities = relationship("Amenity", secondary="place_amenity", + back_populates="place_amenities", + viewonly=False) + else: + city_id = "" + user_id = "" + name = "" + description = "" + number_rooms = 0 + number_bathrooms = 0 + max_guest = 0 + price_by_night = 0 + latitude = 0.0 + longitude = 0.0 + amenity_ids = [] + @property def reviews(self): """ review getter attribut for Filestorage """ @@ -36,4 +66,22 @@ def reviews(self): review_list.append(v) return review_list + @property + def amenities(self): + """ amenities getter attribute for Filestorage """ + from models.engine.file_storage import FileStorage + amenity_list = [] + for _, v in FileStorage.__objects.items(): + for id in self.amenity_ids: + if v.id == id: + amenity_list.append(v) + return amenity_list + + @amenities.setter + def amenities(self, obj): + """ amenities setter attribute """ + if type(obj) == "Amenity": + self.amenity_ids.append(obj.id) + + diff --git a/web_flask/5-number_template.py b/web_flask/5-number_template.py new file mode 100644 index 000000000000..10301e437d80 --- /dev/null +++ b/web_flask/5-number_template.py @@ -0,0 +1,51 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" +from flask import Flask, abort, render_template +app = Flask(__name__) + + +@app.route("/", strict_slashes=False) +def hello(): + return "Hello HBNB!" + + +@app.route("/hbnb", strict_slashes=False) +def hbnb(): + return "HBNB" + + +@app.route("/c/", strict_slashes=False) +def C(txt): + txt = txt.replace("_", " ") + return "C {}".format(txt) + + +@app.route("/python/", defaults={'txt': 'is cool'}) +@app.route("/python/", strict_slashes=False) +def Python(txt): + txt = txt.replace("_", " ") + return "Python {}".format(txt) + + +@app.route("/number/", strict_slashes=False) +def Number(n): + try: + n = int(n) + return "{} is a number".format(n) + except ValueError: + abort(404) + + +@app.route("/number_template/", strict_slashes=False) +def Number_template(n): + try: + n = int(n) + return render_template('5-number.html', n=n) + except ValueError: + abort(404) + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) diff --git a/web_flask/templates/5-number.html b/web_flask/templates/5-number.html new file mode 100644 index 000000000000..57887ff74693 --- /dev/null +++ b/web_flask/templates/5-number.html @@ -0,0 +1,9 @@ + + + + HBNB + + +

Number: {{ n }}

+ + From 6120d58a4bab94af544bbe1c7d0d386174889628 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 13:19:41 +0530 Subject: [PATCH 57/80] update task 6 --- web_flask/6-number_odd_or_even.py | 60 +++++++++++++++++++ web_flask/templates/6-number_odd_or_even.html | 13 ++++ 2 files changed, 73 insertions(+) create mode 100644 web_flask/6-number_odd_or_even.py create mode 100644 web_flask/templates/6-number_odd_or_even.html diff --git a/web_flask/6-number_odd_or_even.py b/web_flask/6-number_odd_or_even.py new file mode 100644 index 000000000000..a333f339a958 --- /dev/null +++ b/web_flask/6-number_odd_or_even.py @@ -0,0 +1,60 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" +from flask import Flask, abort, render_template +app = Flask(__name__) + + +@app.route("/", strict_slashes=False) +def hello(): + return "Hello HBNB!" + + +@app.route("/hbnb", strict_slashes=False) +def hbnb(): + return "HBNB" + + +@app.route("/c/", strict_slashes=False) +def C(txt): + txt = txt.replace("_", " ") + return "C {}".format(txt) + + +@app.route("/python/", defaults={'txt': 'is cool'}) +@app.route("/python/", strict_slashes=False) +def Python(txt): + txt = txt.replace("_", " ") + return "Python {}".format(txt) + + +@app.route("/number/", strict_slashes=False) +def Number(n): + try: + n = int(n) + return "{} is a number".format(n) + except ValueError: + abort(404) + + +@app.route("/number_template/", strict_slashes=False) +def Number_template(n): + try: + n = int(n) + return render_template('5-number.html', n=n) + except ValueError: + abort(404) + + +@app.route("/number_odd_or_even/", strict_slashes=False) +def Number_odd_even(n): + try: + n = int(n) + return render_template('6-number_odd_or_even.html', n=n) + except ValueError: + abort(404) + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) diff --git a/web_flask/templates/6-number_odd_or_even.html b/web_flask/templates/6-number_odd_or_even.html new file mode 100644 index 000000000000..46d72bcd8fc0 --- /dev/null +++ b/web_flask/templates/6-number_odd_or_even.html @@ -0,0 +1,13 @@ + + + + HBNB + + + {{% if n % 2 == 0 %}} +

Number: {{ n }} is even

+ {{% else %}} +

Number: {{ n }} is odd

+ {{% endif %}} + + From 0cd8911146679d4117008ce89e40de79ad9b15b1 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 13:23:22 +0530 Subject: [PATCH 58/80] =?UTF-8?q?=C3=BCpdate=20task6:=20agofelaw=20,=20wag?= =?UTF-8?q?ayen=20agegnew?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web_flask/templates/6-number_odd_or_even.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web_flask/templates/6-number_odd_or_even.html b/web_flask/templates/6-number_odd_or_even.html index 46d72bcd8fc0..f65238a6fbe5 100644 --- a/web_flask/templates/6-number_odd_or_even.html +++ b/web_flask/templates/6-number_odd_or_even.html @@ -4,10 +4,10 @@ HBNB - {{% if n % 2 == 0 %}} + {% if n % 2 == 0 %}

Number: {{ n }} is even

- {{% else %}} + {% else %}

Number: {{ n }} is odd

- {{% endif %}} + {% endif %} From 6c9a24fa3d71c6197fff39a4e03cf4b05db64c8d Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 22:32:43 +0530 Subject: [PATCH 59/80] update task 7 --- models/engine/db_storage.py | 5 +++++ models/engine/file_storage.py | 6 +++++- models/state.py | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 2fece5c281f1..69391f1b19c1 100644 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -75,3 +75,8 @@ def reload(self): SessionFactory = scoped_session(sessionmaker(bind=self.__engine, expire_on_commit=False)) self.__session = SessionFactory() + + def close(self): + """close method ro manage resources""" + if self.__session: + self.__session.remove() \ No newline at end of file diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 4bedf51f1a65..7cf9278b70eb 100644 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -84,4 +84,8 @@ def delete(self, obj=None): break if flag: del self.__objects[wanted_key] - self.save() \ No newline at end of file + self.save() + + def close(self): + """ close method""" + self.reload() \ No newline at end of file diff --git a/models/state.py b/models/state.py index fc17e4ebecbc..88ef7e227e75 100644 --- a/models/state.py +++ b/models/state.py @@ -17,7 +17,7 @@ class State(BaseModel, Base): if not os.getenv('HBNB_TYPE_STORAGE') == 'db': @property def cities(self): - """ getter attribut for FileStorage r/n + """ getter attribut for FileStorage linked between State and City """ list_city = [] for _, value in storage.__objects.items(): From 5026c093e74d1b07e1e32d9be03f81c0d0807dd6 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sat, 27 Jul 2024 23:32:44 +0530 Subject: [PATCH 60/80] add task 7: close() --- models/__pycache__/__init__.cpython-310.pyc | Bin 502 -> 502 bytes models/__pycache__/state.cpython-310.pyc | Bin 1195 -> 1198 bytes .../__pycache__/db_storage.cpython-310.pyc | Bin 2820 -> 2956 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 2848 -> 2989 bytes models/engine/db_storage.py | 9 ++++----- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc index 8121e1f2e0963ae90f5d0b5637f45c7328ea0e1f..fa1283620171a1b88a5cec798fe4a40ba4ef9aec 100644 GIT binary patch delta 20 acmeyy{EeAApO=@50SF`wmTu&J%?JQD&;=&| delta 20 acmeyy{EeAApO=@50SH#4&EClUnh^jz%LU>9 diff --git a/models/__pycache__/state.cpython-310.pyc b/models/__pycache__/state.cpython-310.pyc index c0cecdbe86c156811f3b3aff9aece73023ea486e..420aadb93510e7d1f78ddb5d593dc79986b5f74d 100644 GIT binary patch delta 40 ucmZ3@xsH=JpO=@50SNx7FHQ5@$g9l6=snqxNs%olGcP+eWpgM~7!v@@@CteW delta 37 rcmZ3-xtfzVpO=@50SH#4%}#UM$g9l6=rP%lNs+loKW}pcQy3Efr@090 diff --git a/models/engine/__pycache__/db_storage.cpython-310.pyc b/models/engine/__pycache__/db_storage.cpython-310.pyc index 4e5951ea0662db021c656dc31b48377bf96df70b..9d4ed4be18d2664c69baf2caddfb616df2e15cc9 100644 GIT binary patch delta 490 zcmYLEy=ogl5Z+ns-R-S)u^a~pRD^?&;vfV9sSN&!6k-dETsYM=;m~Ys97zXzvI`-D z!76PqEVxLOfL#RAguIB0RCx_OfIVXfnPtBDpKo^Fyl5q5k{ChKdwcu&>#syX{*fXp zazK$wguI3_SEK>fP|Zai;tB>B&LNL5LQNTsF&eTlRhF<$6@v*rq0AC4V}ooR<-W+C z{vN;`cz{Hnf!j=#}wwk5@iv`bp85g?!(iV>Uwh#4Ho zZ?%~?Qr{_>1nlu~mvSaPg_DTl@Eq9p?bt%spT+GKZ*#900)kAsCi`7J!T*V$jYE*2 z?;CR3c;DHdl&(0iubmy11rC5Z{|Wni93SS^2{JiN2g9BvqFOH5svj*2mjr_NU8 zu^ZT`PjpQEH*|JXo>;fZv@e6lxjo+Wj$pd{pZT$pK|f1;WIBy4?&&aWGxYqOY56b4 eyx>o0p@5&3CehEeGD-(^?LsPLvD@|6X8ZtDM`*bK delta 325 zcmWknJxc>Y5Z&3^yW8Enizy_ELP8+Ti3oP7Oo$p%h=tc(Bf+_dALQUJO(a&iLPSB> z(m!BfBU<}I@)!IG7CJk_d-LW!cIRoMYD9SyX-4%nd7X4WA^~S7v}G&>WGP2T9ptGX zxagp$SnA;#y69Dq`skx1N1{SaQ&AFNNQuS>YvcsT6BgG$Z(!s>X}HfP>~T?>2gnJ?jpdN^PmU8f&HOp h>Da7vyS+|QG6A+F*O6>Wp+)Ex9tE)~My44|{{aKfM7jU~ diff --git a/models/engine/__pycache__/file_storage.cpython-310.pyc b/models/engine/__pycache__/file_storage.cpython-310.pyc index b27e2aa63aaf5bdef36ef5c242ed19b39b41f2eb..4441a649436801a51457559608224e1e2aa32211 100644 GIT binary patch delta 264 zcmZ1=wpN@spO=@50SFW|mZlX<Mlq)_MX_WuM6sp_Ogyb9 zE|9{L!rQ_a#g)RB!r#IW#ht<&%%CZ_@pmL=eKI4+ASeK_nSj_Ch>LlEL=D3NhJ_4_ z3@MC24NO(M3duS7#i delta 136 zcmZ20zCesOpO=@50SH#4%}&#p$h$ Date: Sun, 28 Jul 2024 01:29:23 +0530 Subject: [PATCH 61/80] udpate task 7 --- models/__pycache__/base_model.cpython-310.pyc | Bin 2854 -> 3069 bytes models/base_model.py | 5 ++++- .../__pycache__/db_storage.cpython-310.pyc | Bin 2956 -> 2986 bytes models/engine/db_storage.py | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/models/__pycache__/base_model.cpython-310.pyc b/models/__pycache__/base_model.cpython-310.pyc index c9c1d2fb474ac9f7d2b26f8ba61f4c5c84673f1e..50d7ee60e158f3595076eb24575c55c34d33acc0 100644 GIT binary patch delta 481 zcmYLDO-sW-5Z&E0X^d?wQuN|Skyea{D%65X{c6RVf_M?Mgpi~VNll#%LfaG%3LZV| z4^R(!@aEsiFAxO(f#5764!rkvW_WM*b?STCjPiMdVC9crI;**Nv!R*_wko29;QQiK zt&~0OjwIwldCEMKeR4}j%*#Hh3B{R~uxI6jSh{#n_ikK@roWOw8N>;K&mjdE(jGr& zBMeBWN3JQLCQPs^h7r_a>7>maJGkVrbLsjvO6;ea8^nRn!NdqlNm+FjEPTSUBsu)0 z2|{j2YBapSjoql*+pgn^Go(2(s5Bk!A4Z-ZR&9(0+padk$aO-#UHx|qa%aO)yRzD$fSpO=@50SIJ;=A^CS-pFUe%EtucvI4O)5EmOwj$l<4TEJYxSi_LT0>rEf znS&WL*(NV!bxf_|iLS1VRnVxe)l>jtwjvpzmRl?(l?AD{Sc?mCGD~i;rR5jpCYBV* z17(U-fP^Mfks3%9b8=2`5g$ktOz?xm*yH1iON!#-4S}3u79gR(B*Zvbn*BAaDUf3} znVaLC&Ml$%;>7sOyyB9?yyR4%`oxk{O^zZ}paQV@U^f)$gSZBh#WHjsxW@B2Q#ki0EUioBcW6xj9q$;X%9 zzU1|2@2@@e0fPq+0v51Pz$(yz_mK#zNQd4dfhw#c@3Dw0qLKHpNGhta_e7*sreg>; zfhH^`#yU|@K2@Nd55^Q6!oh_h&{XZw7I;3cQBf4XGo7EI@^jSxkXUccv6|^_z3gps`Nou}$ahmNdAT7( z+2OCvUG#!n8lhKmv(x|j9+hxn*8b5|ySMIHAwdSs5B%=tj6ICP4aPnN^0M{Pb)}m- zmAda+;(fCpS8&GsiEqFKQ;@CeK8hI^ywBy_dBSI1OfFklHlN8a*fNJnqviqB($zhPvbu_hFQD7jsvv?`(5r&tjNme}%SLTcp5PZy z5OVVccMk>ITWLRscY81R0ea}sWE2k;4CKc@PxAjiNxpZTbcMArK`9#?_myi Q7zvo5x>)qYvMT%42Ol?owEzGB diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 7d64b0c48dd7..3ac1aed318c3 100644 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -27,6 +27,7 @@ def __init__(self): def all(self, cls=None): """ query on current db session """ + print("ere all new") from models.user import User from models.place import Place from models.review import Review From 9ab8fa6dd143583b7269cb3d1ab7512bce275c8f Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sun, 28 Jul 2024 10:42:37 +0530 Subject: [PATCH 62/80] update task7: state update --- models/engine/db_storage.py | 1 - 1 file changed, 1 deletion(-) diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 3ac1aed318c3..7d64b0c48dd7 100644 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -27,7 +27,6 @@ def __init__(self): def all(self, cls=None): """ query on current db session """ - print("ere all new") from models.user import User from models.place import Place from models.review import Review From 519b526df983132af03b99c2c0a60bc65a2db290 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sun, 28 Jul 2024 21:06:19 +0530 Subject: [PATCH 63/80] [update] tasks --- 7-states_list.sql | 95 ++++++++++++++++++ file.json | 1 - main.py | 37 +++++++ models/__pycache__/base_model.cpython-310.pyc | Bin 3069 -> 3074 bytes models/__pycache__/place.cpython-310.pyc | Bin 2549 -> 2553 bytes models/__pycache__/user.cpython-310.pyc | Bin 904 -> 904 bytes models/base_model.py | 3 +- .../__pycache__/db_storage.cpython-310.pyc | Bin 2986 -> 2956 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 2989 -> 2989 bytes models/place.py | 56 ++++------- web_flask/7-states_list.py | 24 +++++ web_flask/templates/7-states_list.html | 14 +++ 12 files changed, 192 insertions(+), 38 deletions(-) create mode 100644 7-states_list.sql delete mode 100644 file.json create mode 100644 main.py create mode 100644 web_flask/7-states_list.py create mode 100644 web_flask/templates/7-states_list.html diff --git a/7-states_list.sql b/7-states_list.sql new file mode 100644 index 000000000000..4187e014887b --- /dev/null +++ b/7-states_list.sql @@ -0,0 +1,95 @@ +-- MySQL dump 10.13 Distrib 5.7.8-rc, for Linux (x86_64) +-- +-- Host: localhost Database: hbnb_dev_db +-- ------------------------------------------------------ +-- Server version 5.7.8-rc + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- Drop database +DROP DATABASE IF EXISTS hbnb_dev_db; + +-- Create database + user if doesn't exist +CREATE DATABASE IF NOT EXISTS hbnb_dev_db; +CREATE USER IF NOT EXISTS 'hbnb_dev'@'localhost'; +SET PASSWORD FOR 'hbnb_dev'@'localhost' = 'hbnb_dev_pwd'; +GRANT ALL ON hbnb_dev_db.* TO 'hbnb_dev'@'localhost'; +GRANT SELECT ON performance_schema.* TO 'hbnb_dev'@'localhost'; +FLUSH PRIVILEGES; + +USE hbnb_dev_db; + +-- +-- Table structure for table `cities` +-- + +DROP TABLE IF EXISTS `cities`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `cities` ( + `id` varchar(60) NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `name` varchar(128) NOT NULL, + `state_id` varchar(60) NOT NULL, + PRIMARY KEY (`id`), + KEY `state_id` (`state_id`), + CONSTRAINT `cities_ibfk_1` FOREIGN KEY (`state_id`) REFERENCES `states` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cities` +-- + +LOCK TABLES `cities` WRITE; +/*!40000 ALTER TABLE `cities` DISABLE KEYS */; +INSERT INTO `cities` VALUES ('521a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Akron','421a55f4-7d82-47d9-b54c-a76916479545'),('521a55f4-7d82-47d9-b54c-a76916479546','2017-03-25 19:42:40','2017-03-25 19:42:40','Douglas','421a55f4-7d82-47d9-b54c-a76916479546'),('521a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','San Francisco','421a55f4-7d82-47d9-b54c-a76916479547'),('521a55f4-7d82-47d9-b54c-a76916479548','2017-03-25 19:42:41','2017-03-25 19:42:41','Denver','421a55f4-7d82-47d9-b54c-a76916479548'),('521a55f4-7d82-47d9-b54c-a76916479549','2017-03-25 19:42:41','2017-03-25 19:42:41','Miami','421a55f4-7d82-47d9-b54c-a76916479549'),('521a55f4-7d82-47d9-b54c-a76916479551','2017-03-25 19:42:41','2017-03-25 19:42:41','Honolulu','421a55f4-7d82-47d9-b54c-a76916479551'),('521a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Chicago','421a55f4-7d82-47d9-b54c-a76916479552'),('521a55f4-7d82-47d9-b54c-a76916479554','2017-03-25 19:42:41','2017-03-25 19:42:41','New Orleans','421a55f4-7d82-47d9-b54c-a76916479554'),('521a55f4-7d82-47d9-b54c-a76916479555','2017-03-25 19:42:41','2017-03-25 19:42:41','Saint Paul','421a55f4-7d82-47d9-b54c-a76916479555'),('521a55f4-7d82-47d9-b54c-a76916479556','2017-03-25 19:42:41','2017-03-25 19:42:41','Jackson','421a55f4-7d82-47d9-b54c-a76916479556'),('521a55f4-7d82-47d9-b54c-a76916479557','2017-03-25 19:42:41','2017-03-25 19:42:41','Portland','421a55f4-7d82-47d9-b54c-a76916479557'),('531a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Babbie','421a55f4-7d82-47d9-b54c-a76916479545'),('531a55f4-7d82-47d9-b54c-a76916479546','2017-03-25 19:42:40','2017-03-25 19:42:40','Kearny','421a55f4-7d82-47d9-b54c-a76916479546'),('531a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','San Jose','421a55f4-7d82-47d9-b54c-a76916479547'),('531a55f4-7d82-47d9-b54c-a76916479549','2017-03-25 19:42:41','2017-03-25 19:42:41','Orlando','421a55f4-7d82-47d9-b54c-a76916479549'),('531a55f4-7d82-47d9-b54c-a76916479551','2017-03-25 19:42:41','2017-03-25 19:42:41','Kailua','421a55f4-7d82-47d9-b54c-a76916479551'),('531a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Peoria','421a55f4-7d82-47d9-b54c-a76916479552'),('531a55f4-7d82-47d9-b54c-a76916479554','2017-03-25 19:42:41','2017-03-25 19:42:41','Baton rouge','421a55f4-7d82-47d9-b54c-a76916479554'),('531a55f4-7d82-47d9-b54c-a76916479556','2017-03-25 19:42:41','2017-03-25 19:42:41','Tupelo','421a55f4-7d82-47d9-b54c-a76916479556'),('531a55f4-7d82-47d9-b54c-a76916479557','2017-03-25 19:42:41','2017-03-25 19:42:41','Eugene','421a55f4-7d82-47d9-b54c-a76916479557'),('541a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Calera','421a55f4-7d82-47d9-b54c-a76916479545'),('541a55f4-7d82-47d9-b54c-a76916479546','2017-03-25 19:42:40','2017-03-25 19:42:40','Tempe','421a55f4-7d82-47d9-b54c-a76916479546'),('541a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','Fremont','421a55f4-7d82-47d9-b54c-a76916479547'),('541a55f4-7d82-47d9-b54c-a76916479551','2017-03-25 19:42:41','2017-03-25 19:42:41','Pearl city','421a55f4-7d82-47d9-b54c-a76916479551'),('541a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Naperville','421a55f4-7d82-47d9-b54c-a76916479552'),('541a55f4-7d82-47d9-b54c-a76916479554','2017-03-25 19:42:41','2017-03-25 19:42:41','Lafayette','421a55f4-7d82-47d9-b54c-a76916479554'),('541a55f4-7d82-47d9-b54c-a76916479556','2017-03-25 19:42:41','2017-03-25 19:42:41','Meridian','421a55f4-7d82-47d9-b54c-a76916479556'),('551a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Fairfield','421a55f4-7d82-47d9-b54c-a76916479545'),('551a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','Napa','421a55f4-7d82-47d9-b54c-a76916479547'),('551a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Urbana','421a55f4-7d82-47d9-b54c-a76916479552'),('561a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','Sonoma','421a55f4-7d82-47d9-b54c-a76916479547'),('561a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Joliet','421a55f4-7d82-47d9-b54c-a76916479552'); +/*!40000 ALTER TABLE `cities` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `states` +-- + +DROP TABLE IF EXISTS `states`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `states` ( + `id` varchar(60) NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `name` varchar(128) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `states` +-- + +LOCK TABLES `states` WRITE; +/*!40000 ALTER TABLE `states` DISABLE KEYS */; +INSERT INTO `states` VALUES ('421a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Alabama'),('421a55f4-7d82-47d9-b54c-a76916479546','2017-03-25 19:42:40','2017-03-25 19:42:40','Arizona'),('421a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','California'),('421a55f4-7d82-47d9-b54c-a76916479548','2017-03-25 19:42:40','2017-03-25 19:42:40','Colorado'),('421a55f4-7d82-47d9-b54c-a76916479549','2017-03-25 19:42:40','2017-03-25 19:42:40','Florida'),('421a55f4-7d82-47d9-b54c-a76916479550','2017-03-25 19:42:40','2017-03-25 19:42:40','Georgia'),('421a55f4-7d82-47d9-b54c-a76916479551','2017-03-25 19:42:40','2017-03-25 19:42:40','Hawaii'),('421a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:40','2017-03-25 19:42:40','Illinois'),('421a55f4-7d82-47d9-b54c-a76916479553','2017-03-25 19:42:40','2017-03-25 19:42:40','Indiana'),('421a55f4-7d82-47d9-b54c-a76916479554','2017-03-25 19:42:40','2017-03-25 19:42:40','Louisiana'),('421a55f4-7d82-47d9-b54c-a76916479555','2017-03-25 19:42:40','2017-03-25 19:42:40','Minnesota'),('421a55f4-7d82-47d9-b54c-a76916479556','2017-03-25 19:42:40','2017-03-25 19:42:40','Mississippi'),('421a55f4-7d82-47d9-b54c-a76916479557','2017-03-25 19:42:40','2017-03-25 19:42:40','Oregon'); +/*!40000 ALTER TABLE `states` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2017-03-25 19:42:51 diff --git a/file.json b/file.json deleted file mode 100644 index f08dc6f5178a..000000000000 --- a/file.json +++ /dev/null @@ -1 +0,0 @@ -{"Place.d636f410-16a7-4d37-80f6-f7d6a788b58f": {"id": "d636f410-16a7-4d37-80f6-f7d6a788b58f", "created_at": "2024-06-26T11:21:21.231381", "updated_at": "2024-06-26T11:21:21.231424", "city_id": "0001", "user_id": "0001", "name": "My little house", "number_rooms": "4", "number_bathrooms": "2", "max_guest": "10", "price_by_night": "300", "latitude": "37.773972", "longitude": "-122.431297", "__class__": "Place"}, "Place.715e9ede-9490-4a7b-a74f-b5341dbd8b49": {"id": "715e9ede-9490-4a7b-a74f-b5341dbd8b49", "created_at": "2024-06-26T11:23:37.238801", "updated_at": "2024-06-26T11:23:37.238819", "city_id": "0001", "user_id": "0001", "name": "My little house", "number_rooms": 4, "number_bathrooms": 2, "max_guest": 10, "price_by_night": 300, "latitude": 37.773972, "longitude": -122.431297, "__class__": "Place"}, "State.139b2ce1-9d85-4f58-8227-8c94f454143c": {"id": "139b2ce1-9d85-4f58-8227-8c94f454143c", "created_at": "2024-06-27T17:24:13.627118", "updated_at": "2024-06-27T17:24:13.627125", "__class__": "State"}} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 000000000000..cdb234e90d63 --- /dev/null +++ b/main.py @@ -0,0 +1,37 @@ +#!/usr/bin/python3 +""" + Test cities access from a state +""" +from models import storage +from models.state import State +from models.city import City + +""" + Objects creations +""" +state_1 = State(name="California") +print("New state: {}".format(state_1)) +state_1.save() +state_2 = State(name="Arizona") +print("New state: {}".format(state_2)) +state_2.save() + +city_1_1 = City(state_id=state_1.id, name="Napa") +print("New city: {} in the state: {}".format(city_1_1, state_1)) +city_1_1.save() +city_1_2 = City(state_id=state_1.id, name="Sonoma") +print("New city: {} in the state: {}".format(city_1_2, state_1)) +city_1_2.save() +city_2_1 = City(state_id=state_2.id, name="Page") +print("New city: {} in the state: {}".format(city_2_1, state_2)) +city_2_1.save() + + +""" + Verification +""" +print("") +all_states = storage.all(State) +for state_id, state in all_states.items(): + for city in state.cities: + print("Find the city {} in the state {}".format(city, state)) diff --git a/models/__pycache__/base_model.cpython-310.pyc b/models/__pycache__/base_model.cpython-310.pyc index 50d7ee60e158f3595076eb24575c55c34d33acc0..11f882e9af033afbc08d7ee76580787bdb79016d 100644 GIT binary patch delta 93 zcmew>-Xy`B&&$ij00hA)%hJp@@`|u2G2ar3FHVfl%quQQ%u7y<2T~=ex7d<1OEOc7 ui==>RC)=^zVPu>v&HkRzVly{~A0wmv<|s}zMn>Psja=s$*(V2buK@rKMjMC# delta 88 zcmZpY_$$tv&&$ij00g{&OVbQC@`|v@GTjo2FHVfl%quQQ%u7y<2T~=ex7d<1OEOc7 qCp)vMmu*{w5)a~s17 z-F1iYo%FOJ?5yBT{{jz!M~l}T#IpxQ#W!W{hY5t|dEV!JpZ81hJ^v$bx6^5p(e-YA z|G{o*$F9Qu&e*Lv1k_sgQpU>w6DdpzzL*sn>LQ6o7leUk7chkurneKM+edolSnqN# zcY|RTb6X5^LKU182bEb?cXmE>2I|nuqG+`Iz>k`%;{LoJ3V9ROIwQcCU>+dz6a-I2 z#p5E5Q7Jl!oFWpaZL6MsLQNj2Mqkwrx#F39PHUq{U5b|?ZqWo_F`HQDxR^Or z%o58T4slN4`~vd^#2}_oL7M^!gfoY@C`!9SnB4=+JyL>AsyLX(0UV_0GO+>{u|&%Z zZF8@JXJ(nGcCd_vN(_#u>XC(2HkvRS7b3OC6IFYDvCU zhoLAxss*s*fjVLr$F@V(*$b%*grmde2a3rx^~|CVnOb@Ihyit=Y-^#3vEv?(gjX)AD1e$on@dVa}o zS^zb9FF6g@<;&z1d60Z-^^|tl(-uS|mRIEqeKPA%Rw)jhqKD47{G!*+sy1k#&~5%v zxCx430yk|4Vskwo#MWR&UNGh+%i-ge-)cM*OY7reEgC=Zy9Oz;_4FkX`RGS}V8vaI Xd}WL}=LvE;SQcD5q6NAtKO5D*`AE@) delta 924 zcmZWnOKVd>6uxKf-1j3lkG5%()>yC@DuN)=QmKmg0HKIaxVZ3=GnT~k;Z3Nvq*O?k z78+(JE}DfqxBdzj;zlsw#+~k6xGA2S*0jYLzPac7X1;S~?#!R;@2tP#dA35W5xjf0 z>vsGiyzNZic_19r1+V!+M?)BBwn12EwE=B((B08U_XfIuq_=sPx}{(WgKY%^p$bk) zfb70fPIta;$tt|sS^z~6N(iWg3?Za7dm6GXp!%G}E##pt3}K?yuc=dRs=uR#_Axct z$${$hRr`>$(Cu@FxJxb;(k_KhYd!QSM~c|i5e-gErcba8vFu@z+_89QQ3;2|2py4Q zKn3y?rw`*%iZhtS91c;jF=E3wf_W-Gy2HZ)p1!Z(*rU+KvCtv71P{G1MFh(#RVR@y+xia3F%`f))NYU5b?$C9+=NolDC`9{qbR_jqkG-8h~b;GJun^n;` zU&Whch<$lgErBm1b^4NiPpnnN%bwO>zTrgm`neK{x@d|ri}Pge8I`C}iBR;6YfECe z+FXwv`Awa?*q<~L_sVj8y{9ZD?l`bBW!j!BshAzy%xFYYwujmEm@h6>{>I zHf0X%6Z(vNtgjYsB*x6ZXp=FqvVE?~A9@Vq@}V&YcV)-8;;@xQPhX^?FR#hZ#z(np zUdW`$nw+$;K!d4p`fp#%iCNHrQMdQG#^L|Y7!|Q>;IOfJ7$#lOF6%U1vZ diff --git a/models/__pycache__/user.cpython-310.pyc b/models/__pycache__/user.cpython-310.pyc index 66b1f80aea2f47bf1333e6dbb54fed8fc7b4c05c..1f4ba16a4b055009d173f7e15cc948d26b897a11 100644 GIT binary patch delta 20 acmeBR?_lT7=jG*M0D|R7%QkY?G6MiCMFgk- delta 20 acmeBR?_lT7=jG*M0D={1vo~_rG6MiCEd-(f diff --git a/models/base_model.py b/models/base_model.py index 631d0494e97b..41eb77d82af2 100644 --- a/models/base_model.py +++ b/models/base_model.py @@ -50,8 +50,7 @@ def __str__(self): """Returns a string representation of the instance""" cls = (str(type(self)).split('.')[-1]).split('\'')[0] - filtered_dict = {key: value for key, value in self.__dict__.items() if key not in ['_sa_instance_state', 'cities']} - + filtered_dict = {key: value for key, value in self.__dict__.items() if key not in ['_sa_instance_state', 'cities', '__class__']} return '[{}] ({}) {}'.format(cls, self.id, filtered_dict) def save(self): diff --git a/models/engine/__pycache__/db_storage.cpython-310.pyc b/models/engine/__pycache__/db_storage.cpython-310.pyc index dcfd6b7e7b550b0ff57125e1c45cdabb042726d3..103c1294e8f34d9a01383de25f50b3c3bdd7fa08 100644 GIT binary patch delta 577 zcmaKoPfHvz7{-&CNhXt-as2~|rK@`=Evu_6f(mtQtqLMY3+=T9r89!d%r2Yt56T<- z0t$uPYQ^0{LA{mwIlOq%yWj`#;L&6h4;C88k0)>PJa3ZIzP-M%9)=w0F?8{J_2-{3 z@9f^_RfHoeK`E9NHrh_C)RuOpoy19rbTUm6n!1u?nkFpuB+ay&@YI(sMr%kiu)qZZ z6l`!J_KQjnu=oh58ni;dZQSZ;Bgui!qi>zkhh4v#t9Bls$OFIHb$||S8GsKAf(mL( z0sDf$YjwAgK0f%>l7S2#qr!ip{+G1e_-wL@d?#OMY{X)_P_GrfZwR5vB&U|hGVb|% zMhZALs=woi^;k?jIWn)YiCK+VbHjsxW@B2Q#ki0EUioBcW6xj9q$;X%9 zzU1|2@2@@e0fPq+0v51Pz$(yz_mK#zNQd4dfhw#c@3Dw0qLKHpNGhta_e7*sreg>; zfhH^`#yU|@K2@Nd55^Q6!oh_h&{XZw7I;3cQBf4XGo7EI@^jSxkXUccv6|^_z3gps`Nou}$ahmNdAT7( z+2OCvUG#!n8lhKmv(x|j9+hxn*8b5|ySMIHAwdSs5B%=tj6ICP4aPnN^0M{Pb)}m- zmAda+;(fCpS8&GsiEqFKQ;@CeK8hI^ywBy_dBSI1OfFklHlN8a*fNJnqviq + + + HBNB + + +

States

+
    + {% for _, state_obj in _dict.items() %} +
  • {{ state_obj.id }}: {{ state_obj.name }}
  • + {% endfor %} +
+ + From be689ab1c59086177a470adf92470c348268115d Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sun, 28 Jul 2024 23:31:17 +0530 Subject: [PATCH 64/80] [update] task7 --- file.json | 1 + main.py | 5 +-- models/__pycache__/__init__.cpython-310.pyc | Bin 502 -> 502 bytes models/__pycache__/amenity.cpython-310.pyc | Bin 787 -> 694 bytes models/__pycache__/base_model.cpython-310.pyc | Bin 3074 -> 3004 bytes models/__pycache__/place.cpython-310.pyc | Bin 2553 -> 2287 bytes models/__pycache__/state.cpython-310.pyc | Bin 1198 -> 1222 bytes models/__pycache__/user.cpython-310.pyc | Bin 904 -> 904 bytes models/amenity.py | 4 +-- models/base_model.py | 21 ++++++------ .../__pycache__/file_storage.cpython-310.pyc | Bin 2989 -> 2994 bytes models/engine/file_storage.py | 5 ++- models/place.py | 30 +++++++++--------- models/state.py | 8 ++--- web_flask/7-states_list.py | 10 +++--- 15 files changed, 39 insertions(+), 45 deletions(-) create mode 100644 file.json diff --git a/file.json b/file.json new file mode 100644 index 000000000000..a93f434eedf8 --- /dev/null +++ b/file.json @@ -0,0 +1 @@ +{"State.76bc48a8-3230-4371-b1b1-dce3029f498a": {"id": "76bc48a8-3230-4371-b1b1-dce3029f498a", "name": "California", "created_at": "2024-07-28T23:30:40.695659", "updated_at": "2024-07-28T23:30:40.695734", "__class__": "State"}, "State.cdb9972f-51a7-47c3-a41d-271499388fa7": {"id": "cdb9972f-51a7-47c3-a41d-271499388fa7", "name": "Arizona", "created_at": "2024-07-28T23:30:40.698652", "updated_at": "2024-07-28T23:30:40.698713", "__class__": "State"}, "City.2217f853-ac9d-4d50-8cef-ebae0bd81a17": {"id": "2217f853-ac9d-4d50-8cef-ebae0bd81a17", "state_id": "76bc48a8-3230-4371-b1b1-dce3029f498a", "name": "Napa", "created_at": "2024-07-28T23:30:40.700543", "updated_at": "2024-07-28T23:30:40.700589", "__class__": "City"}, "City.eb32437e-c203-43f0-a038-c6519953fe6b": {"id": "eb32437e-c203-43f0-a038-c6519953fe6b", "state_id": "76bc48a8-3230-4371-b1b1-dce3029f498a", "name": "Sonoma", "created_at": "2024-07-28T23:30:40.702733", "updated_at": "2024-07-28T23:30:40.702779", "__class__": "City"}, "City.5ad98604-57e7-4beb-ac66-e1ab9e7996f8": {"id": "5ad98604-57e7-4beb-ac66-e1ab9e7996f8", "state_id": "cdb9972f-51a7-47c3-a41d-271499388fa7", "name": "Page", "created_at": "2024-07-28T23:30:40.706187", "updated_at": "2024-07-28T23:30:40.706258", "__class__": "City"}} \ No newline at end of file diff --git a/main.py b/main.py index cdb234e90d63..c0ae89aac0f2 100644 --- a/main.py +++ b/main.py @@ -27,11 +27,8 @@ city_2_1.save() -""" - Verification -""" -print("") all_states = storage.all(State) +print(all_states) for state_id, state in all_states.items(): for city in state.cities: print("Find the city {} in the state {}".format(city, state)) diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc index fa1283620171a1b88a5cec798fe4a40ba4ef9aec..cce464a86188e404812d81664ff4259a955ec6c8 100644 GIT binary patch delta 20 acmeyy{EeAApO=@50SGvYmu=*J%?JQE_XS%3 delta 20 acmeyy{EeAApO=@50SF`wmTu&J%?JQD&;=&| diff --git a/models/__pycache__/amenity.cpython-310.pyc b/models/__pycache__/amenity.cpython-310.pyc index 5c0bbe84f330ba154291a5930652f7c674dfbcf5..de484e6ff0a74e3cf7364808f0d80eb540f8299e 100644 GIT binary patch delta 144 zcmbQtwvClHpO=@50SFFdElayPk@qSW3y|Xg#KkHT-zc-Cumv+{vQJiKbY%9^r?GYg{t5b`jJF#`ZTJsDE~ delta 209 zcmdnSI+=|(pO=@50SGb#=A>Pm$a|HG707V_;$owTZji!wTz-C_;MNlZ??#ajTP;uCXI^D;{+HJNU47N;iX=cObTRo>!DN=(jqk8&y$(m^rc z57b6nWj5}ETR*|QPzx9Sh~C@LNkg6LbI$F)_uP-u->0H}r4m~B-0yvD?v;rFFdDh!?Frjy8&o|*tvgIl25+MlN@P(UjiTLIJV&T9zQWLJGt%hp!yMqU}welX_nkLmzdxOll za?oih6T~sq#4(&B&ujLfniiJqHgO$Ju zY6L}i8yAKtlbuX(sFPe&(a0y$!3xr4T@8M`Dgw=sJ5O+hfDw%L2?D7IjQ4hs;{IWg zTuK8s2o?ya*pynb|1SfLLjCnhX`Zd>xb&+=8H;R1bKxEjcf3FSJiN{}^rvuZiPD2l pa1!iflvy&C2q*#EBUsbp<@JeEfgku|5mZqU5j-SkM!zn9`3sXqv6TP- delta 854 zcmYLGO-~d-5bf@n>6smtfkgRO0bPlrg9~WTKn(anym$ajNW7?-OqhYJ?y_rj3(*Xc zNaERKZk~28CVC@YJ$Uot$zvakf5AVXR?QNaq+eIPs#Lw#^L6CyXwd5K_Zfcc$;Zuw z@?kJ;?MqA@JP+`w&j^`NV+l`0gEje{#hDh`>eyX&z%v#(T6Wwn!^k_1N{P455-Srs z3_@i6OeA)NB~DjRw8Row)E16v^0+3K*nZ*`#ar0wF5~h}UzgouPyHui&)#!%Ib)ff zIR_}@#Y)DW^>>0ybUA0VG%UTY+}~C@*4w%s>r_?a>UO$YZMKrM0UXVI;>K0F1@TsD zN-x_9Hbt>EelJX-ICt&QDSrb}tYE55DT+24u~JdA77iF$j8ZU+v+|mK{$T|J7)3Ci z($LoRW@?S&Yr$}0q5DG z%meP@@r2I>_x_#Sk`E$3$iMuwhxzask`N$-mJzd8A*6gd|LdIPH}VO&QX5CY*!oo) zrKxtKu7MW7B++uS1jczk zN_Evb(oH&OdH%<{#Bb-7(ywvyRro13hfYt~(W{*DYkW1o<3E}w$KVp2xH{2sg$j!V kBp;Ru?&fd$M)KeO%+P7i_1tm*gGh$~tWb3#pX~eaA41{56#xJL diff --git a/models/__pycache__/place.cpython-310.pyc b/models/__pycache__/place.cpython-310.pyc index 877f97c991bbcdad3ce62429487ef622fa7a313e..c3d70d37c50ec99eba94b546b7a7b9ec614360f3 100644 GIT binary patch delta 637 zcmZvXv2W8r6vprDOKhh})g)~Rv4he=TTYP>Vql1>QiKFsmkvl-BG>PV9Jxt!c8kJ* zklM9FbsK*G5;GGE11ro3ZbC3IF|+aRP^%1_^*+D%?)!e0|1^Ksdy`tNLhyVWy*d1_ zK*&!s%%2htyIA??qW84*gn$SB83A9of}OI#5;*&W2Nz#dn9Rpae-&-0AN1>kLaaao zny?Hj=kA~l;XV-|tirW3a!Lnn>|1c%_K}E29cW)p#>pcUxa*x?+sJ(pBx#X~{7wpw zIo1C7ILqRLOsGfh%UTl++Dqa*i9x7@J5K?D%d2>uwWUUf5AqQhM-tnR@SM<1(1{U~SVe zl-1hxeRs=8mD`bC)0Lh2L+mK~R9*LAKcD0tYEgqc{uybiR%iv2oH1mzXq~^m`xpnH z0{w6f1`f^I2vvhH1jCSm^M|5Vg$o-DM_~l22dv9!e-uVxEY7P~-5!JSKb2-W6H(om z9F|4uvY%~uVe%$x4wof@q8G-KJ42MHOv4QtE}+V+Cf_de8ZPyo2WcHsWdm%qTR>kc zW2Lp{;iGoT??jIIj!#8j%xX#&w0T(!RHw8{PNF8&eJ==qyfj0#7( zu`9jUD|AWtGKhnMJEAPZI4rm;qBz<>%wzr?Vm`;5+|qb}xjU#9bRU*n&~&YtU3T9; zONtt={1J9mi6K_3nMxN89HJ}8P!BTv1U>SE*3o`+g**6|cF=L@1glC1dQQij0y^{a z8s6RX%$O#L5XH0Fxk$u0Pqmk3Nyh6wG(d8zsy1O4toTgk#rJHNxqep$`^x%_i3GFW@< ZEt|XNg0Fy4>5u^mLlBlNnC(G@`~W~Ca$o=e delta 476 zcmYjNO-mdx7|xq{Cz}~}R$1CPbn9V3(8YfsB7%j|OA!`I87k9p6LHs!tH~$`D-_y4 zunhF9haT*q|Dl)Oyi59DwoS%^=7opn$@}rV$)D&~luVN(ChjcOe;mD=C##UnH~Tv! z%NP&=0#&Qz8E<%~qB73nhBLL4Exje8CHOZYxTG@pidkE*AsIyT?_2YSduDNOTwT>a zVF*|+Al;b24ZS6A$iea_dQGo`DwyCbn1m-(r!%-=v)~qhoVV(2`r%{CEoGPUVO3Nz z&!>kIIjW2e$CWIN<~~Ws!gAB(9b?7WnLHH(v}mL{vXL5_Dj&HGEaW!4EYyX(Bf3}r zrRB@6>o;u&h+Swy4D<`q`XG3pqPx_gACIR+DK+zYwf-Hv+UD{nPcD2S5Iq cWn=DrE#G#v7fSAcQ>NnpVZ}w;1&1{F4?h-a{r~^~ diff --git a/models/__pycache__/user.cpython-310.pyc b/models/__pycache__/user.cpython-310.pyc index 1f4ba16a4b055009d173f7e15cc948d26b897a11..b75e38e7676c82525aad34fc76f8870d4e00a410 100644 GIT binary patch delta 19 YcmeBR?_lT3=jG*M0D`BP8@cM30Vl`=MgRZ+ delta 19 YcmeBR?_lT3=jG*M0D|R78@cM30VXj70RR91 diff --git a/models/amenity.py b/models/amenity.py index 787e16c58767..2c4abb0a12d7 100644 --- a/models/amenity.py +++ b/models/amenity.py @@ -9,6 +9,6 @@ class Amenity(BaseModel, Base): """ The amenity model class """ __tablename__ = "amenities" name = Column(String(128), nullable=False) - place_amenities = relationship("Place", secondary="place_amenity", - back_populates="amenities") + # place_amenities = relationship("Place", secondary="place_amenity", + # back_populates="amenities") diff --git a/models/base_model.py b/models/base_model.py index 41eb77d82af2..0f677325a962 100644 --- a/models/base_model.py +++ b/models/base_model.py @@ -28,23 +28,20 @@ class BaseModel: def __init__(self, *args, **kwargs): """Instatntiates a new model""" + self.id = str(uuid.uuid4()) if not kwargs: - from models import storage - self.id = str(uuid.uuid4()) self.created_at = datetime.now() self.updated_at = datetime.now() else: - if 'update_at' in kwargs: - kwargs['updated_at'] = datetime.strptime(kwargs['updated_at'], - '%Y-%m-%dT%H:%M:%S.%f') - if 'created_at' in kwargs: - kwargs['created_at'] = datetime.strptime(kwargs['created_at'], - '%Y-%m-%dT%H:%M:%S.%f') - if '__class__' in kwargs: - del kwargs['__class__'] for key, value in kwargs.items(): - setattr(self, key, value) - self.__dict__.update(kwargs) + if key == "created_at" or key == "updated_at": + value = datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f") + if key != "__class__": + setattr(self, key, value) + if 'created_at' not in kwargs: + self.created_at = datetime.now() + if 'updated_at' not in kwargs: + self.updated_at = datetime.now() def __str__(self): """Returns a string representation of the instance""" diff --git a/models/engine/__pycache__/file_storage.cpython-310.pyc b/models/engine/__pycache__/file_storage.cpython-310.pyc index 1eac39b2ac11025a09e999d3fd08d279895702b7..d841793fb35d9a9a445c30185a6dd20875519812 100644 GIT binary patch delta 773 zcmZXS&ubGw6vt;alVr2mO&hRDYhv1m zY_JeKi;jn${BaRHi0IvaWKaGDJ$dk?&YK`g++jbweedyoyzlJC{Fl7p8HR?$Gym*; z8{-4s#rC<|P1ILI)Y9J?@6a-OnAuSJT0b3R!t?-#ct>HiFdeF)b`3qb6sl_| z7~?tR0FU!e%1d60t>Y4Z9qZ%Myhtjlj#aGe6U^)66`tYWNTD<-hDI@OtHnwp8e&@J zT-vMfsrdIh$DuF*$N^43m9%`%jfmZCcg#4GBDfKefVMlV2o14a%Ndm18Ik8$i;=;VX}OY6+mVIFb@D1*crfxu?a?D z%vn+L7rB<2(~CdJzD@{Meq|JXIrU+AQPj-DP<<98q}VYLMWo?a+mY6@+<@AfJ9O_q zd9f}HXr0e$VF4~?v?2b;@qBuZf7R|jm8;9Eoq^6d01RhKfGdEjfWIrq2!0UhT|xx@ n5djqu3`bMcqbgBT+LUg{4l~BCLpS(4wEG{eI3%a}i*)ffR5ha$ delta 754 zcmZ9K&rcIU6vttv`oVC74{;BNBayj>BfO*V)yRx! zWGteW3lUvM;i#~bk2o!kl=nofvrt@9ALB`}ul8_R*rZ?>*uoSmZ-^o)W0kWhK_^p_@oo3rf@k9h~#Uy0SHa`ai z>Tb;&lq5lImzBh-b{qc^?=&x6k#_ZPI2>t=y2hTeUliuhz1c^|wbs!b3hG^q5!@T{ z=|>3)$6mks7lpd6csuk2&x>Q4FT|MhY1zG+bapavy6L;j3(A|dfIUyvd|o*8*77BA zq5w*O8Ht#9e$DNB%)>stvhA^|AFlYFmV1|TpF4J9Rcaj5>8m+7ISVKQz&5`O7?`BS z87NXzBUw#}`(|z}M+w!9GnSnU$x-<-l){+$ bQyV-a6ER(s6Yh9y3CmreNf7zJol^e-!rh-z diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 7cf9278b70eb..697c22fcdf1c 100644 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -27,11 +27,9 @@ def all(self, cls=None): } if cls: new_dict = {} - for key, value in self.__objects.items(): - cls = classes.get(cls) + for key, value in self.__objects.items(): if type(value) == cls: new_dict[key] = value - return new_dict else: return FileStorage.__objects @@ -72,6 +70,7 @@ def reload(self): self.all()[key] = classes[val['__class__']](**val) except FileNotFoundError: pass + print(self.__objects) def delete(self, obj=None): """ delete object """ diff --git a/models/place.py b/models/place.py index c48de88f75f2..717af2fd47b4 100644 --- a/models/place.py +++ b/models/place.py @@ -7,18 +7,18 @@ from sqlalchemy.ext.declarative import declarative_base -place_amenity = Table('place_amenity', Base.metadata, - Column('place_id', - String(60), - ForeignKey('places.id'), - nullable=False, - primary_key=True), - Column('amenity_id', - String(60), - ForeignKey('amenities.id'), - nullable=False, - primary_key=True) - ) +# place_amenity = Table('place_amenity', Base.metadata, +# Column('place_id', +# String(60), +# ForeignKey('places.id'), +# nullable=False, +# primary_key=True), +# Column('amenity_id', +# String(60), +# ForeignKey('amenities.id'), +# nullable=False, +# primary_key=True) +# ) class Place(BaseModel, Base): @@ -41,9 +41,9 @@ class Place(BaseModel, Base): if os.getenv('HBNB_TYPE_STORAGE') == 'db': reviews = relationship("Review", back_populates="place", cascade="all, delete") - amenities = relationship("Amenity", secondary="place_amenity", - back_populates="place_amenities", - viewonly=False) + # amenities = relationship("Amenity", secondary="place_amenity", + # back_populates="place_amenities", + # viewonly=False) else: @property def reviews(self): diff --git a/models/state.py b/models/state.py index 88ef7e227e75..10fc4965d481 100644 --- a/models/state.py +++ b/models/state.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 """ State Module for HBNB project """ from models.base_model import BaseModel, Base +from models.city import City from sqlalchemy import Column, String from sqlalchemy.orm import relationship from models import storage @@ -20,8 +21,7 @@ def cities(self): """ getter attribut for FileStorage linked between State and City """ list_city = [] - for _, value in storage.__objects.items(): - if State.id == value.state_id: - list_city.append(value) - + for city in storage.all(City).values(): + if city.state_id == self.id: + list_city.append(city) return list_city \ No newline at end of file diff --git a/web_flask/7-states_list.py b/web_flask/7-states_list.py index e138085bd84b..c4e722fa4791 100644 --- a/web_flask/7-states_list.py +++ b/web_flask/7-states_list.py @@ -7,11 +7,6 @@ from flask import Flask, abort, render_template app = Flask(__name__) -@app.teardown_appcontext -def teardown_db(exception=None): - """close the database connection """ - storage.close() - @app.route('/states_list', strict_slashes=False) def State(): @@ -20,5 +15,10 @@ def State(): return render_template("7-states_list.html", _dict=new_dict) +@app.teardown_appcontext +def teardown_db(exception): + """close the database connection """ + storage.close() + if __name__ == "__main__": app.run(host='0.0.0.0', port=5000) From c5a5fa4a89b856dfb7050448962cbe3fbb42baf7 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sun, 28 Jul 2024 23:54:36 +0530 Subject: [PATCH 65/80] udpate task7 filter state --- 7-dump.sql | 95 ++++++++++++++++++ .../__pycache__/db_storage.cpython-310.pyc | Bin 2956 -> 2998 bytes models/engine/db_storage.py | 2 + web_flask/7-states_list.py | 9 +- web_flask/templates/7-states_list.html | 4 +- 5 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 7-dump.sql diff --git a/7-dump.sql b/7-dump.sql new file mode 100644 index 000000000000..4187e014887b --- /dev/null +++ b/7-dump.sql @@ -0,0 +1,95 @@ +-- MySQL dump 10.13 Distrib 5.7.8-rc, for Linux (x86_64) +-- +-- Host: localhost Database: hbnb_dev_db +-- ------------------------------------------------------ +-- Server version 5.7.8-rc + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- Drop database +DROP DATABASE IF EXISTS hbnb_dev_db; + +-- Create database + user if doesn't exist +CREATE DATABASE IF NOT EXISTS hbnb_dev_db; +CREATE USER IF NOT EXISTS 'hbnb_dev'@'localhost'; +SET PASSWORD FOR 'hbnb_dev'@'localhost' = 'hbnb_dev_pwd'; +GRANT ALL ON hbnb_dev_db.* TO 'hbnb_dev'@'localhost'; +GRANT SELECT ON performance_schema.* TO 'hbnb_dev'@'localhost'; +FLUSH PRIVILEGES; + +USE hbnb_dev_db; + +-- +-- Table structure for table `cities` +-- + +DROP TABLE IF EXISTS `cities`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `cities` ( + `id` varchar(60) NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `name` varchar(128) NOT NULL, + `state_id` varchar(60) NOT NULL, + PRIMARY KEY (`id`), + KEY `state_id` (`state_id`), + CONSTRAINT `cities_ibfk_1` FOREIGN KEY (`state_id`) REFERENCES `states` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cities` +-- + +LOCK TABLES `cities` WRITE; +/*!40000 ALTER TABLE `cities` DISABLE KEYS */; +INSERT INTO `cities` VALUES ('521a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Akron','421a55f4-7d82-47d9-b54c-a76916479545'),('521a55f4-7d82-47d9-b54c-a76916479546','2017-03-25 19:42:40','2017-03-25 19:42:40','Douglas','421a55f4-7d82-47d9-b54c-a76916479546'),('521a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','San Francisco','421a55f4-7d82-47d9-b54c-a76916479547'),('521a55f4-7d82-47d9-b54c-a76916479548','2017-03-25 19:42:41','2017-03-25 19:42:41','Denver','421a55f4-7d82-47d9-b54c-a76916479548'),('521a55f4-7d82-47d9-b54c-a76916479549','2017-03-25 19:42:41','2017-03-25 19:42:41','Miami','421a55f4-7d82-47d9-b54c-a76916479549'),('521a55f4-7d82-47d9-b54c-a76916479551','2017-03-25 19:42:41','2017-03-25 19:42:41','Honolulu','421a55f4-7d82-47d9-b54c-a76916479551'),('521a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Chicago','421a55f4-7d82-47d9-b54c-a76916479552'),('521a55f4-7d82-47d9-b54c-a76916479554','2017-03-25 19:42:41','2017-03-25 19:42:41','New Orleans','421a55f4-7d82-47d9-b54c-a76916479554'),('521a55f4-7d82-47d9-b54c-a76916479555','2017-03-25 19:42:41','2017-03-25 19:42:41','Saint Paul','421a55f4-7d82-47d9-b54c-a76916479555'),('521a55f4-7d82-47d9-b54c-a76916479556','2017-03-25 19:42:41','2017-03-25 19:42:41','Jackson','421a55f4-7d82-47d9-b54c-a76916479556'),('521a55f4-7d82-47d9-b54c-a76916479557','2017-03-25 19:42:41','2017-03-25 19:42:41','Portland','421a55f4-7d82-47d9-b54c-a76916479557'),('531a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Babbie','421a55f4-7d82-47d9-b54c-a76916479545'),('531a55f4-7d82-47d9-b54c-a76916479546','2017-03-25 19:42:40','2017-03-25 19:42:40','Kearny','421a55f4-7d82-47d9-b54c-a76916479546'),('531a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','San Jose','421a55f4-7d82-47d9-b54c-a76916479547'),('531a55f4-7d82-47d9-b54c-a76916479549','2017-03-25 19:42:41','2017-03-25 19:42:41','Orlando','421a55f4-7d82-47d9-b54c-a76916479549'),('531a55f4-7d82-47d9-b54c-a76916479551','2017-03-25 19:42:41','2017-03-25 19:42:41','Kailua','421a55f4-7d82-47d9-b54c-a76916479551'),('531a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Peoria','421a55f4-7d82-47d9-b54c-a76916479552'),('531a55f4-7d82-47d9-b54c-a76916479554','2017-03-25 19:42:41','2017-03-25 19:42:41','Baton rouge','421a55f4-7d82-47d9-b54c-a76916479554'),('531a55f4-7d82-47d9-b54c-a76916479556','2017-03-25 19:42:41','2017-03-25 19:42:41','Tupelo','421a55f4-7d82-47d9-b54c-a76916479556'),('531a55f4-7d82-47d9-b54c-a76916479557','2017-03-25 19:42:41','2017-03-25 19:42:41','Eugene','421a55f4-7d82-47d9-b54c-a76916479557'),('541a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Calera','421a55f4-7d82-47d9-b54c-a76916479545'),('541a55f4-7d82-47d9-b54c-a76916479546','2017-03-25 19:42:40','2017-03-25 19:42:40','Tempe','421a55f4-7d82-47d9-b54c-a76916479546'),('541a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','Fremont','421a55f4-7d82-47d9-b54c-a76916479547'),('541a55f4-7d82-47d9-b54c-a76916479551','2017-03-25 19:42:41','2017-03-25 19:42:41','Pearl city','421a55f4-7d82-47d9-b54c-a76916479551'),('541a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Naperville','421a55f4-7d82-47d9-b54c-a76916479552'),('541a55f4-7d82-47d9-b54c-a76916479554','2017-03-25 19:42:41','2017-03-25 19:42:41','Lafayette','421a55f4-7d82-47d9-b54c-a76916479554'),('541a55f4-7d82-47d9-b54c-a76916479556','2017-03-25 19:42:41','2017-03-25 19:42:41','Meridian','421a55f4-7d82-47d9-b54c-a76916479556'),('551a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Fairfield','421a55f4-7d82-47d9-b54c-a76916479545'),('551a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','Napa','421a55f4-7d82-47d9-b54c-a76916479547'),('551a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Urbana','421a55f4-7d82-47d9-b54c-a76916479552'),('561a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','Sonoma','421a55f4-7d82-47d9-b54c-a76916479547'),('561a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:41','2017-03-25 19:42:41','Joliet','421a55f4-7d82-47d9-b54c-a76916479552'); +/*!40000 ALTER TABLE `cities` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `states` +-- + +DROP TABLE IF EXISTS `states`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `states` ( + `id` varchar(60) NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `name` varchar(128) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `states` +-- + +LOCK TABLES `states` WRITE; +/*!40000 ALTER TABLE `states` DISABLE KEYS */; +INSERT INTO `states` VALUES ('421a55f4-7d82-47d9-b54c-a76916479545','2017-03-25 19:42:40','2017-03-25 19:42:40','Alabama'),('421a55f4-7d82-47d9-b54c-a76916479546','2017-03-25 19:42:40','2017-03-25 19:42:40','Arizona'),('421a55f4-7d82-47d9-b54c-a76916479547','2017-03-25 19:42:40','2017-03-25 19:42:40','California'),('421a55f4-7d82-47d9-b54c-a76916479548','2017-03-25 19:42:40','2017-03-25 19:42:40','Colorado'),('421a55f4-7d82-47d9-b54c-a76916479549','2017-03-25 19:42:40','2017-03-25 19:42:40','Florida'),('421a55f4-7d82-47d9-b54c-a76916479550','2017-03-25 19:42:40','2017-03-25 19:42:40','Georgia'),('421a55f4-7d82-47d9-b54c-a76916479551','2017-03-25 19:42:40','2017-03-25 19:42:40','Hawaii'),('421a55f4-7d82-47d9-b54c-a76916479552','2017-03-25 19:42:40','2017-03-25 19:42:40','Illinois'),('421a55f4-7d82-47d9-b54c-a76916479553','2017-03-25 19:42:40','2017-03-25 19:42:40','Indiana'),('421a55f4-7d82-47d9-b54c-a76916479554','2017-03-25 19:42:40','2017-03-25 19:42:40','Louisiana'),('421a55f4-7d82-47d9-b54c-a76916479555','2017-03-25 19:42:40','2017-03-25 19:42:40','Minnesota'),('421a55f4-7d82-47d9-b54c-a76916479556','2017-03-25 19:42:40','2017-03-25 19:42:40','Mississippi'),('421a55f4-7d82-47d9-b54c-a76916479557','2017-03-25 19:42:40','2017-03-25 19:42:40','Oregon'); +/*!40000 ALTER TABLE `states` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2017-03-25 19:42:51 diff --git a/models/engine/__pycache__/db_storage.cpython-310.pyc b/models/engine/__pycache__/db_storage.cpython-310.pyc index 103c1294e8f34d9a01383de25f50b3c3bdd7fa08..9a9b9107e385ca7216dc8a11a3c8812a156d1313 100644 GIT binary patch delta 508 zcmZ{fJxc>Y5QcXym-BA#&S?Ay22CtPi3&mOBxukWPy`h#!4$%sLNrDu9G*-I9z6>+-KEqTZj}g0Q+mwiRS-IJMeXs{q_{1^Q zIo$`P6VT;PQ-M4Q}Hd|{vp|alcN8ib`NtH4qiYnUIo37>YW_8jX=p`jlhoU zp{d;^C&V%R;+Lj{Sc(O$P(e`?XodEn>K0JIH_aPOiqS@3%W-ZM)+=%*y-ZTRWuV#L zcaKwe)>eQdzPF7)8Y6mXxM|fKchB`)HuLLfdZmpm2+82R{sLJn8}YC-u%M8{&#o*! z8BtioXCp0{bgccG$=pKm$Ypc5O8c}m>B?Y{MqvuebbP3ZiOH%wn9WL=mm>GEB`M3; Ypp)T2U8SlXv~;G4V!~i67&G_30AX-(ssI20 delta 524 zcmb7=O-lkn7{_OGcU@<9(h`y=jUXyti11L5R%(I&y>(tzm zKo1?F2!iN~bjnZQ$7p7a4&54Qtjf9<*{)I|MY;9q$1?J##eT z86NuCg#NQhZk@Ic*rIYHMcJ$3vaI?7m$=Poe%mW-pw2QBbW<6g_5-G6J&lkF9+Oo8 zF*HQn?>F(~8hZ{lqzs$X7NiYU)Y|jDRJE{;T}*Pn3STQ^q{LBTeeG*^OQcgAeOM#d zbn%I4+axNgvVd4c6prMN3t#ZZg-WpPm{#Qu7Nm7ngz4(g0l^LD0+UU#

States

    - {% for _, state_obj in _dict.items() %} -
  • {{ state_obj.id }}: {{ state_obj.name }}
  • + {% for state in states %} +
  • {{ state.id }}: {{ state.name }}
  • {% endfor %}
From ca76f8a4885882e0f19c7c0f2ebd824d02e4ba53 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sun, 28 Jul 2024 23:57:39 +0530 Subject: [PATCH 66/80] add some update --- .../__pycache__/db_storage.cpython-310.pyc | Bin 2998 -> 2998 bytes web_flask/templates/7-states_list.html | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/models/engine/__pycache__/db_storage.cpython-310.pyc b/models/engine/__pycache__/db_storage.cpython-310.pyc index 9a9b9107e385ca7216dc8a11a3c8812a156d1313..21f22e22de78c5b6f356b4eb6b0e841dab044d71 100644 GIT binary patch delta 18 YcmdlczD=AnpO=@50SHcS

States

-
    +
      {% for state in states %} -
    • {{ state.id }}: {{ state.name }}
    • +
    • {{ state.id }}: {{ state.name }}
    • {% endfor %} -
    +
From 6bcf30c4acd8650cf49cadef6fef1bf1614bd85a Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 29 Jul 2024 00:25:23 +0530 Subject: [PATCH 67/80] update task 7 --- web_flask/7-states_list.py | 4 ---- web_flask/8-cities_by_states.py | 0 web_flask/templates/8-cities_by_states.html | 0 3 files changed, 4 deletions(-) create mode 100644 web_flask/8-cities_by_states.py create mode 100644 web_flask/templates/8-cities_by_states.html diff --git a/web_flask/7-states_list.py b/web_flask/7-states_list.py index d20b51ac64b7..f33c9e84f934 100644 --- a/web_flask/7-states_list.py +++ b/web_flask/7-states_list.py @@ -12,11 +12,7 @@ def State(): """ state route """ new_dict = storage.all("State") - print(new_dict) states = list(new_dict.values()) - print(states) - - return render_template("7-states_list.html", states=states) diff --git a/web_flask/8-cities_by_states.py b/web_flask/8-cities_by_states.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_flask/templates/8-cities_by_states.html b/web_flask/templates/8-cities_by_states.html new file mode 100644 index 000000000000..e69de29bb2d1 From 4eefa509ef57f079cb2a86063cb157a2da9bb2d9 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 29 Jul 2024 00:40:26 +0530 Subject: [PATCH 68/80] add task 8: cities_by_states --- web_flask/7-states_list.py | 1 + web_flask/8-cities_by_states.py | 26 +++++++++++++++++++++ web_flask/templates/8-cities_by_states.html | 20 ++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/web_flask/7-states_list.py b/web_flask/7-states_list.py index f33c9e84f934..e9750fc14db2 100644 --- a/web_flask/7-states_list.py +++ b/web_flask/7-states_list.py @@ -21,5 +21,6 @@ def teardown_db(exception): """close the database connection """ storage.close() + if __name__ == "__main__": app.run(host='0.0.0.0', port=5000) diff --git a/web_flask/8-cities_by_states.py b/web_flask/8-cities_by_states.py index e69de29bb2d1..5fcdaab620b7 100644 --- a/web_flask/8-cities_by_states.py +++ b/web_flask/8-cities_by_states.py @@ -0,0 +1,26 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" +from models import storage +from models.state import State +from flask import Flask, abort, render_template +app = Flask(__name__) + + +@app.route('/cities_by_states', strict_slashes=False) +def State_city(): + """ state route """ + new_dict = storage.all("State") + states = list(new_dict.values()) + return render_template("8-cities_by_states.html", states=states) + + +@app.teardown_appcontext +def teardown_db(exception): + """close the database connection """ + storage.close() + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) diff --git a/web_flask/templates/8-cities_by_states.html b/web_flask/templates/8-cities_by_states.html index e69de29bb2d1..ad93f2744df0 100644 --- a/web_flask/templates/8-cities_by_states.html +++ b/web_flask/templates/8-cities_by_states.html @@ -0,0 +1,20 @@ + + + + HBNB + + +

States

+
    + {% for state in states %} +
  • {{ state.id }}: {{ state.name }} +
      + {% for city in state.cities %} +
    • {{ city.id }}: {{ city.name }}
    • + {% endfor %} +
    +
  • + {% endfor %} +
+ + From 41d5ef38a33fd44e4d31c9f0ea358122dd25b000 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Sun, 28 Jul 2024 19:29:43 +0000 Subject: [PATCH 69/80] [update task 7,8] --- web_flask/7-states_list.py | 0 web_flask/8-cities_by_states.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 web_flask/7-states_list.py mode change 100644 => 100755 web_flask/8-cities_by_states.py diff --git a/web_flask/7-states_list.py b/web_flask/7-states_list.py old mode 100644 new mode 100755 diff --git a/web_flask/8-cities_by_states.py b/web_flask/8-cities_by_states.py old mode 100644 new mode 100755 From bc9c9720e08fdc6aec4f68212c77309f951a0379 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 29 Jul 2024 08:49:17 +0000 Subject: [PATCH 70/80] [update] --- models/__init__.py | 0 models/amenity.py | 0 models/base_model.py | 0 models/city.py | 0 models/engine/__init__.py | 0 models/engine/db_storage.py | 0 models/engine/file_storage.py | 0 models/place.py | 0 models/review.py | 0 models/state.py | 0 models/user.py | 0 11 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 models/__init__.py mode change 100644 => 100755 models/amenity.py mode change 100644 => 100755 models/base_model.py mode change 100644 => 100755 models/city.py mode change 100644 => 100755 models/engine/__init__.py mode change 100644 => 100755 models/engine/db_storage.py mode change 100644 => 100755 models/engine/file_storage.py mode change 100644 => 100755 models/place.py mode change 100644 => 100755 models/review.py mode change 100644 => 100755 models/state.py mode change 100644 => 100755 models/user.py diff --git a/models/__init__.py b/models/__init__.py old mode 100644 new mode 100755 diff --git a/models/amenity.py b/models/amenity.py old mode 100644 new mode 100755 diff --git a/models/base_model.py b/models/base_model.py old mode 100644 new mode 100755 diff --git a/models/city.py b/models/city.py old mode 100644 new mode 100755 diff --git a/models/engine/__init__.py b/models/engine/__init__.py old mode 100644 new mode 100755 diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py old mode 100644 new mode 100755 diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py old mode 100644 new mode 100755 diff --git a/models/place.py b/models/place.py old mode 100644 new mode 100755 diff --git a/models/review.py b/models/review.py old mode 100644 new mode 100755 diff --git a/models/state.py b/models/state.py old mode 100644 new mode 100755 diff --git a/models/user.py b/models/user.py old mode 100644 new mode 100755 From ef587a75c633f2de504ea8ba5fcf5c37cd02d07b Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Mon, 29 Jul 2024 14:29:35 +0530 Subject: [PATCH 71/80] udpate --- models/__pycache__/__init__.cpython-310.pyc | Bin 502 -> 502 bytes models/__pycache__/amenity.cpython-310.pyc | Bin 694 -> 694 bytes models/__pycache__/base_model.cpython-310.pyc | Bin 3004 -> 3004 bytes models/__pycache__/city.cpython-310.pyc | Bin 900 -> 900 bytes models/__pycache__/place.cpython-310.pyc | Bin 2287 -> 2287 bytes models/__pycache__/review.cpython-310.pyc | Bin 923 -> 923 bytes models/__pycache__/state.cpython-310.pyc | Bin 1222 -> 1222 bytes models/__pycache__/user.cpython-310.pyc | Bin 904 -> 904 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 199 -> 199 bytes .../__pycache__/db_storage.cpython-310.pyc | Bin 2998 -> 2998 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 2994 -> 2994 bytes web_flask/9-states.py | 31 ++++++++++++++++++ web_flask/templates/9-states.html | 16 +++++++++ 13 files changed, 47 insertions(+) create mode 100644 web_flask/9-states.py create mode 100644 web_flask/templates/9-states.html diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc index cce464a86188e404812d81664ff4259a955ec6c8..a6068ffff77fd1123c1c3c6a3eafe3b7d4460025 100644 GIT binary patch delta 20 acmeyy{EeAApO=@50SH(lmT%;K%?JQEJ_S7h delta 20 acmeyy{EeAApO=@50SGvYmu=*J%?JQE_XS%3 diff --git a/models/__pycache__/amenity.cpython-310.pyc b/models/__pycache__/amenity.cpython-310.pyc index de484e6ff0a74e3cf7364808f0d80eb540f8299e..373a213c59b94cc2f803c3602556342af6fa873f 100644 GIT binary patch delta 20 acmdnSx{Z}PpO=@50SH(lmT%-<%>)20hXjHE delta 20 acmdnSx{Z}PpO=@50SFFdE!)Vwnh5|j83j-P diff --git a/models/__pycache__/base_model.cpython-310.pyc b/models/__pycache__/base_model.cpython-310.pyc index 99eee4fbecc55f634c593ff575b70d50c689a008..5a1d543ed9f00a63a9ffe7b50607cec919cf339c 100644 GIT binary patch delta 20 acmdlZzDJxppO=@50SH(lmT%n>1nFPE5 delta 20 acmX@cd5n`gpO=@50SN5dmu=+U%>n>4L', strict_slashes=False) +def State_city(id): + """ state route """ + try: + id = int(id) + except ValueError: + abort(404) + + new_dict = storage.all("State") + states = list(new_dict.values()) + return render_template("9-states.html", states=states, id=id) + + +@app.teardown_appcontext +def teardown_db(exception): + """close the database connection """ + storage.close() + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) diff --git a/web_flask/templates/9-states.html b/web_flask/templates/9-states.html new file mode 100644 index 000000000000..1cd6a7ada77b --- /dev/null +++ b/web_flask/templates/9-states.html @@ -0,0 +1,16 @@ + + + + HBNB + + + {% if id == 0 %} +

States

+
    + {% for state in states %} +
  • {{ state.id }}: {{ state.name }}
  • + {% endfor %} +
+ {% else if id != 0 %} + + From 2eef666199426da732ef19c2235eb0f324eb3414 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 31 Jul 2024 13:58:08 +0530 Subject: [PATCH 72/80] updatatete --- web_flask/9-states.py | 19 ++++++++++++------- web_flask/templates/9-states.html | 18 +++++++++++++++--- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/web_flask/9-states.py b/web_flask/9-states.py index 7247051c163c..dd5d45a8f697 100644 --- a/web_flask/9-states.py +++ b/web_flask/9-states.py @@ -7,18 +7,23 @@ from flask import Flask, abort, render_template app = Flask(__name__) -@app.route("/states/", defaults={'id': 0}) + +@app.route("/states", strict_slashes=False) +def States(): + """ state route """ + new_dict = storage.all("State") + states = list(new_dict.values()) + return render_template("9-states.html", states=states) + + @app.route('/states/', strict_slashes=False) def State_city(id): - """ state route """ - try: - id = int(id) - except ValueError: - abort(404) + """ state_city route """ new_dict = storage.all("State") states = list(new_dict.values()) - return render_template("9-states.html", states=states, id=id) + state = next((state for state in states if state.id == id), None) + return render_template("9-states.html", states=[state], id=id) @app.teardown_appcontext diff --git a/web_flask/templates/9-states.html b/web_flask/templates/9-states.html index 1cd6a7ada77b..2e4eee80cf76 100644 --- a/web_flask/templates/9-states.html +++ b/web_flask/templates/9-states.html @@ -4,13 +4,25 @@ HBNB - {% if id == 0 %} + {% if not id %}

States

    {% for state in states %}
  • {{ state.id }}: {{ state.name }}
  • {% endfor %}
- {% else if id != 0 %} - + {% else %} + {% if states[0] %} +

State

+

Cities

+
    + {% for city in states[0].cities %} +
  • {{ city.id }}: {{ city.name }}
  • + {% endfor %} +
+ {% else %} +

Not found!

+ {% endif %} + {% endif %} + From 32bdf449610d8929afad5f80a20e899c311758dc Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 31 Jul 2024 21:14:57 +0530 Subject: [PATCH 73/80] update task7 --- file.json | 2 +- main.py | 3 +-- .../__pycache__/file_storage.cpython-310.pyc | Bin 2994 -> 2972 bytes models/engine/file_storage.py | 1 - web_flask/9-states.py | 1 - 5 files changed, 2 insertions(+), 5 deletions(-) diff --git a/file.json b/file.json index a93f434eedf8..625b52cdf1a9 100644 --- a/file.json +++ b/file.json @@ -1 +1 @@ -{"State.76bc48a8-3230-4371-b1b1-dce3029f498a": {"id": "76bc48a8-3230-4371-b1b1-dce3029f498a", "name": "California", "created_at": "2024-07-28T23:30:40.695659", "updated_at": "2024-07-28T23:30:40.695734", "__class__": "State"}, "State.cdb9972f-51a7-47c3-a41d-271499388fa7": {"id": "cdb9972f-51a7-47c3-a41d-271499388fa7", "name": "Arizona", "created_at": "2024-07-28T23:30:40.698652", "updated_at": "2024-07-28T23:30:40.698713", "__class__": "State"}, "City.2217f853-ac9d-4d50-8cef-ebae0bd81a17": {"id": "2217f853-ac9d-4d50-8cef-ebae0bd81a17", "state_id": "76bc48a8-3230-4371-b1b1-dce3029f498a", "name": "Napa", "created_at": "2024-07-28T23:30:40.700543", "updated_at": "2024-07-28T23:30:40.700589", "__class__": "City"}, "City.eb32437e-c203-43f0-a038-c6519953fe6b": {"id": "eb32437e-c203-43f0-a038-c6519953fe6b", "state_id": "76bc48a8-3230-4371-b1b1-dce3029f498a", "name": "Sonoma", "created_at": "2024-07-28T23:30:40.702733", "updated_at": "2024-07-28T23:30:40.702779", "__class__": "City"}, "City.5ad98604-57e7-4beb-ac66-e1ab9e7996f8": {"id": "5ad98604-57e7-4beb-ac66-e1ab9e7996f8", "state_id": "cdb9972f-51a7-47c3-a41d-271499388fa7", "name": "Page", "created_at": "2024-07-28T23:30:40.706187", "updated_at": "2024-07-28T23:30:40.706258", "__class__": "City"}} \ No newline at end of file +{"State.10ac5f3a-3194-4f0c-920c-07fac60afe18": {"id": "10ac5f3a-3194-4f0c-920c-07fac60afe18", "name": "California", "created_at": "2024-07-31T21:14:39.801440", "updated_at": "2024-07-31T21:14:39.801503", "__class__": "State"}, "State.332e707f-6b76-4108-8578-345292ff9646": {"id": "332e707f-6b76-4108-8578-345292ff9646", "name": "Arizona", "created_at": "2024-07-31T21:14:39.805752", "updated_at": "2024-07-31T21:14:39.805798", "__class__": "State"}, "City.184419b0-e565-48d9-a0d4-b2b40e56f974": {"id": "184419b0-e565-48d9-a0d4-b2b40e56f974", "state_id": "10ac5f3a-3194-4f0c-920c-07fac60afe18", "name": "Napa", "created_at": "2024-07-31T21:14:39.809872", "updated_at": "2024-07-31T21:14:39.809918", "__class__": "City"}, "City.8737f3d7-5648-45dc-9d47-7cae1c971982": {"id": "8737f3d7-5648-45dc-9d47-7cae1c971982", "state_id": "10ac5f3a-3194-4f0c-920c-07fac60afe18", "name": "Sonoma", "created_at": "2024-07-31T21:14:39.814097", "updated_at": "2024-07-31T21:14:39.814140", "__class__": "City"}, "City.1011df82-0c16-47ee-84a5-a435d4f545c2": {"id": "1011df82-0c16-47ee-84a5-a435d4f545c2", "state_id": "332e707f-6b76-4108-8578-345292ff9646", "name": "Page", "created_at": "2024-07-31T21:14:39.817938", "updated_at": "2024-07-31T21:14:39.817988", "__class__": "City"}} \ No newline at end of file diff --git a/main.py b/main.py index c0ae89aac0f2..966344547532 100644 --- a/main.py +++ b/main.py @@ -26,9 +26,8 @@ print("New city: {} in the state: {}".format(city_2_1, state_2)) city_2_1.save() - +print("") all_states = storage.all(State) -print(all_states) for state_id, state in all_states.items(): for city in state.cities: print("Find the city {} in the state {}".format(city, state)) diff --git a/models/engine/__pycache__/file_storage.cpython-310.pyc b/models/engine/__pycache__/file_storage.cpython-310.pyc index 43cd7e4db9fde7b437c45e67f38ba0361ab15a76..72b6cc7c66cf7062a39454ba179f114a131f3d49 100644 GIT binary patch delta 182 zcmdlaK1ZB4pO=@50SGQduS)aU$lJii_-S$?T)mTLA!2f+=_a delta 219 zcmbOuzDb-npO=@50SH(lmZxQG-2 zXmLvd<3BO?O{Mgnm-Lmnp!Ly2f*2}~@Hv7DhqtcD>=ycwu2g(rA&6MHwK#AH5> zZk}7L1x1;8B}Jk@8z;}?h-WmI{F6hSN9G?(0}l%eBh!CArpX$dZy3ENi*l7RnosWL xQecdjyoM{2+Z?E)$O=SQPgdYI6O-iOEn)(4HJOX-L896qf(a-kKDn7&5&*92Fv9=< diff --git a/models/engine/file_storage.py b/models/engine/file_storage.py index 697c22fcdf1c..deec854198c5 100755 --- a/models/engine/file_storage.py +++ b/models/engine/file_storage.py @@ -70,7 +70,6 @@ def reload(self): self.all()[key] = classes[val['__class__']](**val) except FileNotFoundError: pass - print(self.__objects) def delete(self, obj=None): """ delete object """ diff --git a/web_flask/9-states.py b/web_flask/9-states.py index dd5d45a8f697..adbacaf8653a 100644 --- a/web_flask/9-states.py +++ b/web_flask/9-states.py @@ -19,7 +19,6 @@ def States(): @app.route('/states/', strict_slashes=False) def State_city(id): """ state_city route """ - new_dict = storage.all("State") states = list(new_dict.values()) state = next((state for state in states if state.id == id), None) From e458f6ba0e388787febc9c2550eee2f1e051585d Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Wed, 31 Jul 2024 21:25:58 +0530 Subject: [PATCH 74/80] some update on task7: --- file.json | 2 +- models/__pycache__/state.cpython-310.pyc | Bin 1222 -> 1228 bytes .../__pycache__/db_storage.cpython-310.pyc | Bin 2998 -> 3000 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 2972 -> 2972 bytes models/engine/db_storage.py | 10 ++++++---- models/engine/file_storage.py | 6 +++--- models/state.py | 6 ++++-- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/file.json b/file.json index 625b52cdf1a9..5e5d815ad853 100644 --- a/file.json +++ b/file.json @@ -1 +1 @@ -{"State.10ac5f3a-3194-4f0c-920c-07fac60afe18": {"id": "10ac5f3a-3194-4f0c-920c-07fac60afe18", "name": "California", "created_at": "2024-07-31T21:14:39.801440", "updated_at": "2024-07-31T21:14:39.801503", "__class__": "State"}, "State.332e707f-6b76-4108-8578-345292ff9646": {"id": "332e707f-6b76-4108-8578-345292ff9646", "name": "Arizona", "created_at": "2024-07-31T21:14:39.805752", "updated_at": "2024-07-31T21:14:39.805798", "__class__": "State"}, "City.184419b0-e565-48d9-a0d4-b2b40e56f974": {"id": "184419b0-e565-48d9-a0d4-b2b40e56f974", "state_id": "10ac5f3a-3194-4f0c-920c-07fac60afe18", "name": "Napa", "created_at": "2024-07-31T21:14:39.809872", "updated_at": "2024-07-31T21:14:39.809918", "__class__": "City"}, "City.8737f3d7-5648-45dc-9d47-7cae1c971982": {"id": "8737f3d7-5648-45dc-9d47-7cae1c971982", "state_id": "10ac5f3a-3194-4f0c-920c-07fac60afe18", "name": "Sonoma", "created_at": "2024-07-31T21:14:39.814097", "updated_at": "2024-07-31T21:14:39.814140", "__class__": "City"}, "City.1011df82-0c16-47ee-84a5-a435d4f545c2": {"id": "1011df82-0c16-47ee-84a5-a435d4f545c2", "state_id": "332e707f-6b76-4108-8578-345292ff9646", "name": "Page", "created_at": "2024-07-31T21:14:39.817938", "updated_at": "2024-07-31T21:14:39.817988", "__class__": "City"}} \ No newline at end of file +{"State.ad984bb6-9eba-4747-b786-03eb27db1361": {"id": "ad984bb6-9eba-4747-b786-03eb27db1361", "name": "California", "created_at": "2024-07-31T21:25:26.607319", "updated_at": "2024-07-31T21:25:26.607450", "__class__": "State"}, "State.b75bcb9c-8bc4-4956-894b-8519aa644a13": {"id": "b75bcb9c-8bc4-4956-894b-8519aa644a13", "name": "Arizona", "created_at": "2024-07-31T21:25:26.610041", "updated_at": "2024-07-31T21:25:26.610083", "__class__": "State"}, "City.66270122-9e01-48d4-81d9-2b5bb60c795d": {"id": "66270122-9e01-48d4-81d9-2b5bb60c795d", "state_id": "ad984bb6-9eba-4747-b786-03eb27db1361", "name": "Napa", "created_at": "2024-07-31T21:25:26.612733", "updated_at": "2024-07-31T21:25:26.612829", "__class__": "City"}, "City.d4ef14e2-c12a-4109-9c07-183bb369e15a": {"id": "d4ef14e2-c12a-4109-9c07-183bb369e15a", "state_id": "ad984bb6-9eba-4747-b786-03eb27db1361", "name": "Sonoma", "created_at": "2024-07-31T21:25:26.615353", "updated_at": "2024-07-31T21:25:26.615407", "__class__": "City"}, "City.c1f4963e-ea83-4651-bf14-87f7c94df96a": {"id": "c1f4963e-ea83-4651-bf14-87f7c94df96a", "state_id": "b75bcb9c-8bc4-4956-894b-8519aa644a13", "name": "Page", "created_at": "2024-07-31T21:25:26.618106", "updated_at": "2024-07-31T21:25:26.618158", "__class__": "City"}} \ No newline at end of file diff --git a/models/__pycache__/state.cpython-310.pyc b/models/__pycache__/state.cpython-310.pyc index 00fe8bb75d5f279f80c75a7c81d5600b1eb69b7b..4585e67b36c50b8bd8769bb827d81f905b80ff68 100644 GIT binary patch delta 59 zcmX@cd4`iWpO=@50SH3lR;5kZ$ZO5aC_34bdA*bjP>h3tg^`7kgOQ1m?LP|>6NvuD K$1<6RWfuTx@Cy_G delta 53 zcmX@Zd5n`cpO=@50SH(lmZ!yU3V&Y;1K_*5iAm;eT$1?c~^Ae^~hRw5B yJeU~eCO>97&S*DzHTzUXr^${SGZ@`A-{MeZWb~fIHJLGZ@)WKGjQo>Lxf=m?Eg3oh delta 98 zcmdlXzD=ArpO=@50SH(lmZv@1$a|StL;}d;V&Y;1K^aCSMvnh{Oq0JcFJa1N+B}EF zgNadQ@>90sj5d?kvQK4nnC#3kgVAO49S&7SM$gGiT$33CCr{&Az{oq Date: Wed, 31 Jul 2024 23:37:51 +0530 Subject: [PATCH 75/80] update task7 --- file.json | 2 +- models/__init__.py | 8 +- models/engine/db_storage.py | 7 +- web_flask/10-hbnb_filters.py | 26 ++++++ web_flask/README.md | 2 +- web_flask/static/images/logo.png | 0 web_flask/static/styles/3-footer.css | 10 +++ web_flask/static/styles/3-header.css | 18 ++++ web_flask/static/styles/4-common.css | 13 +++ web_flask/static/styles/6-filters.css | 101 +++++++++++++++++++++++ web_flask/templates/10-hbnb_filters.html | 28 +++++++ 11 files changed, 206 insertions(+), 9 deletions(-) create mode 100644 web_flask/10-hbnb_filters.py create mode 100644 web_flask/static/images/logo.png create mode 100644 web_flask/static/styles/3-footer.css create mode 100644 web_flask/static/styles/3-header.css create mode 100644 web_flask/static/styles/4-common.css create mode 100644 web_flask/static/styles/6-filters.css create mode 100644 web_flask/templates/10-hbnb_filters.html diff --git a/file.json b/file.json index 5e5d815ad853..e14ddb52139e 100644 --- a/file.json +++ b/file.json @@ -1 +1 @@ -{"State.ad984bb6-9eba-4747-b786-03eb27db1361": {"id": "ad984bb6-9eba-4747-b786-03eb27db1361", "name": "California", "created_at": "2024-07-31T21:25:26.607319", "updated_at": "2024-07-31T21:25:26.607450", "__class__": "State"}, "State.b75bcb9c-8bc4-4956-894b-8519aa644a13": {"id": "b75bcb9c-8bc4-4956-894b-8519aa644a13", "name": "Arizona", "created_at": "2024-07-31T21:25:26.610041", "updated_at": "2024-07-31T21:25:26.610083", "__class__": "State"}, "City.66270122-9e01-48d4-81d9-2b5bb60c795d": {"id": "66270122-9e01-48d4-81d9-2b5bb60c795d", "state_id": "ad984bb6-9eba-4747-b786-03eb27db1361", "name": "Napa", "created_at": "2024-07-31T21:25:26.612733", "updated_at": "2024-07-31T21:25:26.612829", "__class__": "City"}, "City.d4ef14e2-c12a-4109-9c07-183bb369e15a": {"id": "d4ef14e2-c12a-4109-9c07-183bb369e15a", "state_id": "ad984bb6-9eba-4747-b786-03eb27db1361", "name": "Sonoma", "created_at": "2024-07-31T21:25:26.615353", "updated_at": "2024-07-31T21:25:26.615407", "__class__": "City"}, "City.c1f4963e-ea83-4651-bf14-87f7c94df96a": {"id": "c1f4963e-ea83-4651-bf14-87f7c94df96a", "state_id": "b75bcb9c-8bc4-4956-894b-8519aa644a13", "name": "Page", "created_at": "2024-07-31T21:25:26.618106", "updated_at": "2024-07-31T21:25:26.618158", "__class__": "City"}} \ No newline at end of file +{"State.b938c3d3-101b-47b4-a690-4d2bfda7d8db": {"id": "b938c3d3-101b-47b4-a690-4d2bfda7d8db", "name": "California", "created_at": "2024-07-31T21:48:38.782136", "updated_at": "2024-07-31T21:48:38.782200", "__class__": "State"}, "State.6f379894-c574-4167-ac88-8b8a7f2420d9": {"id": "6f379894-c574-4167-ac88-8b8a7f2420d9", "name": "Arizona", "created_at": "2024-07-31T21:48:38.785208", "updated_at": "2024-07-31T21:48:38.785265", "__class__": "State"}, "City.944f8d2b-a687-4a55-914b-614d86de3bc8": {"id": "944f8d2b-a687-4a55-914b-614d86de3bc8", "state_id": "b938c3d3-101b-47b4-a690-4d2bfda7d8db", "name": "Napa", "created_at": "2024-07-31T21:48:38.787563", "updated_at": "2024-07-31T21:48:38.787613", "__class__": "City"}, "City.ca10f623-e056-4f3f-b38f-4b0f3ea226b5": {"id": "ca10f623-e056-4f3f-b38f-4b0f3ea226b5", "state_id": "b938c3d3-101b-47b4-a690-4d2bfda7d8db", "name": "Sonoma", "created_at": "2024-07-31T21:48:38.792337", "updated_at": "2024-07-31T21:48:38.792377", "__class__": "City"}, "City.f077358b-a571-4bc4-b21b-fa7e406ff773": {"id": "f077358b-a571-4bc4-b21b-fa7e406ff773", "state_id": "6f379894-c574-4167-ac88-8b8a7f2420d9", "name": "Page", "created_at": "2024-07-31T21:48:38.796834", "updated_at": "2024-07-31T21:48:38.796877", "__class__": "City"}} \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index a14e402255d9..b7b641f2b965 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,12 +1,12 @@ #!/usr/bin/python3 """This module instantiates an object of class FileStorage""" -from models.engine.file_storage import FileStorage -from models.engine.db_storage import DBStorage import os if os.getenv('HBNB_TYPE_STORAGE') == 'db': + from models.engine.db_storage import DBStorage storage = DBStorage() - storage.reload() else: + from models.engine.file_storage import FileStorage storage = FileStorage() - storage.reload() + +storage.reload() diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index dc32ebc5b6e7..a8584c846c1d 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -19,7 +19,8 @@ def __init__(self): host = os.getenv('HBNB_MYSQL_HOST') db = os.getenv('HBNB_MYSQL_DB') self.__engine = create_engine( - f'mysql+mysqldb://{user}:{pwd}@{host}:3306/{db}', + 'mysql+mysqldb://{}:{}@{}:3306/{}'.format( + user, pwd, host, db), pool_pre_ping=True ) if os.getenv('HBNB_ENV') == 'test': @@ -49,13 +50,13 @@ def all(self, cls=None): cls = classes.get(cls) filter_query = self.__session.query(cls).all() for obj in filter_query: - key = f"{obj.__class__.__name__}.{obj.id}" + key = "{}.{}".format(obj.__class__.__name__, obj.id) new_dict[key] = obj else: for key, value in classes.items(): filter_query = self.__session.query(value).all() for obj in filter_query: - key = f"{obj.__class__.__name__}.{obj.id}" + key = "{}.{}".format(obj.__class__.__name__, obj.id) new_dict[key] = obj return new_dict diff --git a/web_flask/10-hbnb_filters.py b/web_flask/10-hbnb_filters.py new file mode 100644 index 000000000000..5d0d4560b209 --- /dev/null +++ b/web_flask/10-hbnb_filters.py @@ -0,0 +1,26 @@ +#!/usr/bin/python3 +""" python script that starts a Flask +web application +""" +from models import storage +from models.state import State +from flask import Flask, abort, render_template +app = Flask(__name__) + + +@app.route("/hbnb_filters", strict_slashes=False) +def States(): + """ state route """ + new_dict = storage.all("State") + states = list(new_dict.values()) + return render_template("10-hbnb_filters.html", states=states) + + +@app.teardown_appcontext +def teardown_db(exception): + """close the database connection """ + storage.close() + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) diff --git a/web_flask/README.md b/web_flask/README.md index d324e1f6cf18..7493fd0c2979 100644 --- a/web_flask/README.md +++ b/web_flask/README.md @@ -1 +1 @@ -flask_application +flask_application \ No newline at end of file diff --git a/web_flask/static/images/logo.png b/web_flask/static/images/logo.png new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_flask/static/styles/3-footer.css b/web_flask/static/styles/3-footer.css new file mode 100644 index 000000000000..bdc217cc78ca --- /dev/null +++ b/web_flask/static/styles/3-footer.css @@ -0,0 +1,10 @@ +footer { + position: fixed; + bottom: 0; + background-color: white; + height: 60px; + width: 100%; + text-align: center; + line-height: 30px; + border-top: 1px solid #CCCCCC; +} diff --git a/web_flask/static/styles/3-header.css b/web_flask/static/styles/3-header.css new file mode 100644 index 000000000000..d28e9cf83e1d --- /dev/null +++ b/web_flask/static/styles/3-header.css @@ -0,0 +1,18 @@ +header { + background-color: white; + height: 70px; + width: 100%; + + border-bottom: 1px solid #CCCCCC; +} + +#header_logo { + height: 100%; + width: 142px; + + background-image: url("../images/logo.png"); + background-repeat: no-repeat; + background-position: center; + + margin-left: 20px; +} diff --git a/web_flask/static/styles/4-common.css b/web_flask/static/styles/4-common.css new file mode 100644 index 000000000000..f70c884eacb9 --- /dev/null +++ b/web_flask/static/styles/4-common.css @@ -0,0 +1,13 @@ +body { + margin:0px; + padding:0px; + + color: #484848; + font-size: 14px; + font-family: Circular,"Helvetica Neue",Helvetica,Arial,sans-serif; +} + +.container { + max-width: 1000px; + margin: 30px auto; +} diff --git a/web_flask/static/styles/6-filters.css b/web_flask/static/styles/6-filters.css new file mode 100644 index 000000000000..14d620e0e75b --- /dev/null +++ b/web_flask/static/styles/6-filters.css @@ -0,0 +1,101 @@ +.filters { + display: block; + background-color: white; + height: 70px; + width: 100%; + border: 1px solid #DDDDDD; + border-radius: 4px; +} + +.locations { + display: inline; + vertical-align: middle; + float: left; + height: 100%; + width: 25%; + + line-height: 20px; + border-right: 1px solid #DDDDDD; +} + +.filter_amenities { + display: inline; + vertical-align: middle; + height: 100%; + float: left; + width: 25%; + + line-height: 20px; +} + +.popover { + list-style-type: none; + display: none; + background-color: #FAFAFA; + width: 100%; + + margin-left: -1px; + margin-top: 8px; + padding: 25px 0px; + + border: 1px solid #DDDDDD; + border-radius: 4px; +} + +.locations:hover .popover { + display: inline-block; +} + +.filter_amenities:hover .popover { + display: inline-block; +} + +ul { + list-style-type: none; + padding: 0px; + padding-bottom: 20px; +} + +li { +} + +h2 { + font-size: 16px; + padding-left: 30px; + margin: 0px; +} + +h3 { + font-weight: 600; + margin-top: 12px; + margin-bottom: 5px; + padding-left: 45px; +} + +h4 { + font-size: 14px; + font-weight: 400; + margin-top: 5px; + margin-bottom: 5px; + padding-left: 45px; +} + +button { + color: #FFFFFF; + font-size: 18px; + + height: 48px; + width: 20%; + background-color: #FF5A5F; + border-style: none; + border-radius: 4px; + + float: right; + margin-top: 11px; + margin-bottom: 11px; + margin-right: 30px; +} + +button:hover { + opacity: 90%; +} diff --git a/web_flask/templates/10-hbnb_filters.html b/web_flask/templates/10-hbnb_filters.html new file mode 100644 index 000000000000..2e4eee80cf76 --- /dev/null +++ b/web_flask/templates/10-hbnb_filters.html @@ -0,0 +1,28 @@ + + + + HBNB + + + {% if not id %} +

States

+
    + {% for state in states %} +
  • {{ state.id }}: {{ state.name }}
  • + {% endfor %} +
+ {% else %} + {% if states[0] %} +

State

+

Cities

+
    + {% for city in states[0].cities %} +
  • {{ city.id }}: {{ city.name }}
  • + {% endfor %} +
+ {% else %} +

Not found!

+ {% endif %} + {% endif %} + + From 6c189cff185cf9b356d5131a52bcf42e3c93d725 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 1 Aug 2024 00:01:02 +0530 Subject: [PATCH 76/80] update --- models/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/__init__.py b/models/__init__.py index b7b641f2b965..0f20c7b9e36b 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -8,5 +8,5 @@ else: from models.engine.file_storage import FileStorage storage = FileStorage() - +print(type(storage)) storage.reload() From 936e1c72bd98474eb0e7413165d802697ed872a3 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 1 Aug 2024 00:07:10 +0530 Subject: [PATCH 77/80] update --- models/__init__.py | 2 +- models/engine/db_storage.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/models/__init__.py b/models/__init__.py index 0f20c7b9e36b..b7b641f2b965 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -8,5 +8,5 @@ else: from models.engine.file_storage import FileStorage storage = FileStorage() -print(type(storage)) + storage.reload() diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index a8584c846c1d..86b5dea9a35f 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -77,9 +77,9 @@ def reload(self): """ create tables in the Database """ from models.base_model import Base Base.metadata.create_all(self.__engine) - self.__session = sessionmaker(bind=self.__engine, - expire_on_commit=False) - self.__session = scoped_session(self.__session) + sess_factory = sessionmaker(bind=self.__engine, expire_on_commit=False) + Session = scoped_session(sess_factory) + self.__session = Session def close(self): """close method ro manage resources""" From 4bea0f1c968dcd3b0d09eb65167d2f52e7ebb03f Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 1 Aug 2024 00:15:21 +0530 Subject: [PATCH 78/80] update --- models/base_model.py | 3 +-- models/state.py | 15 +++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/models/base_model.py b/models/base_model.py index 0f677325a962..5354978da477 100755 --- a/models/base_model.py +++ b/models/base_model.py @@ -10,8 +10,7 @@ if os.getenv('HBNB_TYPE_STORAGE') == 'db' : Base = declarative_base() else: - class Base: - pass + Base = object class BaseModel: diff --git a/models/state.py b/models/state.py index 7456e3cbb644..e7d008785d06 100755 --- a/models/state.py +++ b/models/state.py @@ -10,12 +10,15 @@ class State(BaseModel, Base): """ State class """ - __tablename__ = "states" - name = Column(String(128), - nullable=False) - cities = relationship("City", - back_populates="state", - cascade="all, delete") + if os.getenv('HBNB_TYPE_STORAGE') == 'db': + __tablename__ = "states" + name = Column(String(128), + nullable=False) + cities = relationship("City", + back_populates="state", + cascade="all, delete") + else: + name = '' if not os.getenv('HBNB_TYPE_STORAGE') == 'db': @property From d57512be700c8be610933fcfe4d9f7fa8d91d526 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 1 Aug 2024 00:24:24 +0530 Subject: [PATCH 79/80] update --- models/engine/db_storage.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 86b5dea9a35f..9765f324b6a6 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -18,11 +18,17 @@ def __init__(self): pwd = os.getenv('HBNB_MYSQL_PWD') host = os.getenv('HBNB_MYSQL_HOST') db = os.getenv('HBNB_MYSQL_DB') + print(user) + print(pwd) + print(host) + print(db) self.__engine = create_engine( 'mysql+mysqldb://{}:{}@{}:3306/{}'.format( user, pwd, host, db), pool_pre_ping=True ) + print(self.__engine) + if os.getenv('HBNB_ENV') == 'test': metadata = MetaData() metadata.reflect(bind=self.__engine) From e9672c37b5418ba9d92e7ac7e0ffc41b05a716a4 Mon Sep 17 00:00:00 2001 From: fuadhasen Date: Thu, 1 Aug 2024 00:34:03 +0530 Subject: [PATCH 80/80] update --- models/engine/db_storage.py | 5 ----- models/state.py | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 9765f324b6a6..cc1a514f754b 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -18,16 +18,11 @@ def __init__(self): pwd = os.getenv('HBNB_MYSQL_PWD') host = os.getenv('HBNB_MYSQL_HOST') db = os.getenv('HBNB_MYSQL_DB') - print(user) - print(pwd) - print(host) - print(db) self.__engine = create_engine( 'mysql+mysqldb://{}:{}@{}:3306/{}'.format( user, pwd, host, db), pool_pre_ping=True ) - print(self.__engine) if os.getenv('HBNB_ENV') == 'test': metadata = MetaData() diff --git a/models/state.py b/models/state.py index e7d008785d06..575b918f7341 100755 --- a/models/state.py +++ b/models/state.py @@ -10,6 +10,7 @@ class State(BaseModel, Base): """ State class """ + print(type(Base)) if os.getenv('HBNB_TYPE_STORAGE') == 'db': __tablename__ = "states" name = Column(String(128),