From f042c7ca82da70629a8c8e5a1bdfc3abb5b19dce Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Fri, 11 Oct 2024 22:35:40 -0500 Subject: [PATCH] Lots of base additons --- __pycache__/api.cpython-312.pyc | Bin 5162 -> 7649 bytes __pycache__/main.cpython-312.pyc | Bin 23781 -> 23989 bytes __pycache__/webserver.cpython-312.pyc | Bin 0 -> 936 bytes api.py | 92 ++++++-- main.py | 16 +- manage.py | 17 ++ sites/default/sql/create/item.sql | 1 + sites/default/sql/create/receipt_items.sql | 2 +- sites/default/sql/create/vendors.sql | 2 +- sites/default/sql/drop/receipt_items.sql | 1 + sites/default/sql/drop/receipts.sql | 1 + sites/default/sql/drop/recipes.sql | 1 + sites/default/sql/drop/shopping_lists.sql | 1 + sites/default/sql/drop/vendors.sql | 1 + sites/default/sql/unique/select_item_all.sql | 65 +++--- sites/main/site.ini | 2 +- sites/main/sql/create/item.sql | 2 +- sites/main/sql/create/receipt_items.sql | 9 + sites/main/sql/create/receipts.sql | 10 + sites/main/sql/create/recipes.sql | 12 + sites/main/sql/create/shopping_lists.sql | 13 ++ sites/main/sql/create/vendors.sql | 8 + sites/main/sql/drop/receipt_items.sql | 1 + sites/main/sql/drop/receipts.sql | 1 + sites/main/sql/drop/recipes.sql | 1 + sites/main/sql/drop/shopping_lists.sql | 1 + sites/main/sql/drop/vendors.sql | 1 + sites/main/sql/unique/select_item_all.sql | 41 +++- templates/home.html | 232 ++++++++++++++++--- templates/workshop.html | 108 +++++++++ webserver.py | 3 + 31 files changed, 556 insertions(+), 89 deletions(-) create mode 100644 __pycache__/webserver.cpython-312.pyc create mode 100644 sites/default/sql/drop/receipt_items.sql create mode 100644 sites/default/sql/drop/receipts.sql create mode 100644 sites/default/sql/drop/recipes.sql create mode 100644 sites/default/sql/drop/shopping_lists.sql create mode 100644 sites/default/sql/drop/vendors.sql create mode 100644 sites/main/sql/create/receipt_items.sql create mode 100644 sites/main/sql/create/receipts.sql create mode 100644 sites/main/sql/create/recipes.sql create mode 100644 sites/main/sql/create/shopping_lists.sql create mode 100644 sites/main/sql/create/vendors.sql create mode 100644 sites/main/sql/drop/receipt_items.sql create mode 100644 sites/main/sql/drop/receipts.sql create mode 100644 sites/main/sql/drop/recipes.sql create mode 100644 sites/main/sql/drop/shopping_lists.sql create mode 100644 sites/main/sql/drop/vendors.sql create mode 100644 templates/workshop.html diff --git a/__pycache__/api.cpython-312.pyc b/__pycache__/api.cpython-312.pyc index 495adc936ce9b2229ddf22936a38dba37e12ef6f..65cb803dd73a727f3aea6e8f305ee652faa822ae 100644 GIT binary patch delta 3949 zcma)9YitzP6`uFZzF*$8jcs;ey_kjYu&E*8S-=mljY&;_5;<8dp0T~lde_X1A>Pcg z8-*&SiHfa>gxi$Vl`6%Q{IG;7(LWVw5k%^btXWH}My>=Bs+6ifOhAf6|Mc8h&)R^Y zz4n}Y@44SS_ug~PJ?HKp*FW54|GUj*#-Loi$PL_aPuQ#QrxOhkCr@9*-gWQ{P^Vyz z2PbZZqi)nd*yjsxx{jAPy!j$_eR1$z&nwWDGTOQfT`@|8Z4>{@X8WjR(iv!z@IC1w zFzgD(;~9!4GV}nJVc=sGk|(QSn5WL{z%X%((a&%S6JOlZGHDo3E8G_t&s-&qJ>Zza zK8MUM;#Y){JgYCqommgdHNbLu|CP&?74yv z#4#-F>`tfDe={i}eNH{g`qet-q(`$!LR9PdS{kwj`BCdsirDH2Qer#7D*i6-TkJQ_(QBZJW-AK1M&uyym+ts*!jmSzGc z54HBRrm4XG?v`|O;Al@vYfs?7ssBe*BOmBGeB|&ufixF5+SYcg^_{>od{>y&nCS4Z zkmNNoAtW^_o{A+kdKh*tt2ep2SlFzQeIueqCt^b}Sz}WD{gMFna8!&ANg64gO=xsq zY9uLZZ0W#~X4CtN=a)2G(wxI^EO8Xhcuq*lDRERnfgn&W&kh|_zhm38TE%d5AeM~E zLgai*9*mS$5!V5jgHP%K)#b3F^~2o31p;%l61mm~c4w}=SmDbZDYCY))GWJtYVAF? zzG!ui@0+y-$M7QOxNN^<&sT4m!KbB}wfV~CIc|HA^WNubXSv$Ezj-D)bL=LOuiKTK z<90s)Dg7T^m~`D^S0N$WFLf`I(Kg2&S~j(7j_ZDE#yHE^j*pe`=smWw=&Bf}$4^YQ z{jT%ZozrZgc5A+-F>h}gBOkHmu{{O0dUF3gwyx-@8gH2NO)+0tes7sRQV8tK`*-ED z&fR151DkWKHScP>HF9g<+n?u8^yZJhmw)g5yg8CPSaej34UGS6tTWd-PnpI-7rRgu zyx38s*iSk?>KrHMsET6csw>KbqF%^Ddy!AiQNE(pak=YK*Qec+jkDIeTx-!%GkH93 zS(~TUJ^|%oePjo!77M!ldOZ9R8hSh=;U26I=@e4I6{4TGj$9N91RyLf7uBu)i}@<6yMCAyt3bAh?w_~{NSG08P`eh9Iz;@4)FToA zBB6L*@-Hz2P2_@$p2Z9O(UF8KhJn2iLEi?F!@!|zZxf(nLzUygy8A&q3$qs`TcN(pwns>)Ah5G~kE4&%Ym`s>r zihGtuAzJ>!>dKmBufbEyV0Ky|6pFX}mbgxp_`To+879N>82U5z3ob!IdO?}YE+ez) zMPYbI%U|0JRE9xGbp@2&K%_Xm!h0(E387c8Isrc|q6 z)4?83w?+>Ni9|}Hz&i!e4YG8P{vJ7qW?4)mvhaZ{B9m!mDJ9C0l*kLB=t5w0=fZ@D zEUPor2{v4*%ejVK!!`T^3GF7JUjfy}ZSo(5?h_lZ}N+$IPqS2tslqgwYZaE)8qZBn9V3%YmA))=*B(V!{ zNEOmGT>aA2TQl#f`26IR-ihA(-q5T!G?kdyU+``(xOU_^)N7_1^_gi~)=eM5XQ%~& zGgTK|-YYc|HEP`gM%yZhR`mau2*|4erpJcL>u_e zQ>*%krT%>v8eG5-eI|9o@orOiyO+GpINR!p+dgkw6@7anhuYiT0{)#Ux^0c=P8|!J zJN4D=Zu-t1OS_G}%h51;*G2>9uA4+{FWtWShS_?9z}+|gVs{c*1X@ubE45U~If{z4o zl_&HNXOYWqS-$*KhnFver&8hJr%4Pq((g!$a=)E@PgDQ#)jos3bZJX4htI7 zmfe52tFC9zcqSAhF^g zFeGG9q{c-J8mbcGz)vB70wkBk9$D<4oxiMHQtmtavkw0hGffm68w-{6nCXh)xUXy!#^-<@Zb+^ID-e_ z9uxNaxMvpkjCU6Bz++-9eiVN~V#JySy}57*UqW;gaQ|b%gYQFtzyfM5Y*-pD2{7X! Meg0ztT6#$SF95H9cK`qY delta 1830 zcmaJ?T}%{L6ux(UV0M??on=^;?Xoibxvmy#Rji8fkK!UA_(QQY+USJA(?& ziVwb+HVx#qF~%ApZ6a!$w8f@BPiPY{v1!&qQZng7oAkxEHIkUnm)<+Dg0<~T<~#SE zbMAM~IXU;vAGNpEx*j^6c0iu?8Q9%eFzPCXKa7T=oa*W=#fK#+z~6?{41kh%5!_xJ zf_KE6ee~uk-ZRLAZCHlGc%!}8VIw{)`JTSXO&+z2aGL=Xc8Kg@z#$%hG}{f*oFb%o z-MPf}oHm`OyK}l;5syngciw04Ls$dS`8HtW_eywNc%_+41%pxYPrd;FYFBIqa}_9d z0}^x?EWv_n`DvRW^m=n-%hIsr@_~SO_$XmsnxoD%U7yn;b6sO!aPt$lz;?k;c+z~b zQE~q_y#Woji@D7#Zuzg9xW$*r*DsOlOVuXjS`q0AEw2agZf}X(;7L6l04!1ApNdMh zSLE_EIK^`jd|sFfgA^RlH#dhsuUht9WGws#BTytf=nOjQ&axfg46Fe9YCP_gaGO)w z(8W{&r~?jd`JxK3_FlWJW(M5)A>SjW?rhROH*}I?2jdNG#HI1Ppe5i zg$7N&Gc`b1zYu+OCfhlHOjbLUFnJZB6w*jX0D1XA0ZQ#A)lSBfFK? z$6(fT9DnTDJiLl;fM0T1MzZ|wG1#F^7n z^e|_rIK%8=iP+2Tr(zEqp(4VzQgMiFr=pcTM#VAqZ7KpC>`2{Qk?(TTXww)wTU0q0 zS~q;d7&ksWpCOY)L#F&h=G~K-6NyYBm67{ri%!jzlwNPX(tNdL;`K)*)uZ)U4g}w0 zRxpjJ6YXQs*`gZ4_Y$4FZ?>rJMT(L7KSl3I=STM6MDOtt^^>;i9alQW1}5GbKQ|NH zJS%Q_R!Z`pUkgggGv%AUcg+SO8KL-DH7(WrMo=JSg4K7FZ{uIZr}!!Lu486v^CRit zjH4yPwLGgPORf6-HD8X;7gk0?bXgWqT+muc_3v$h4XfCDTf|5e^CMR$Mg07IpFk$} zOI^e;?dK!qw&~URL^ECGZ;<%uU5*A9|G>r*>jM{0G!G<}jtOV!*U}^dJ(G95A~S6D zp9htbO%O+c-VCUcLIH&}6hai%5-_<`znU~Tq{b8!wiJmtIb-Xo!v+ekQ7EH8Zg3E` zp`CPGL%_6Yq@|+CSf7d-sd6iUZHU~=gtjZ5P|-H3-A+KGe}?C+x!9RPx2jt`i4GCt zhRJiq-#{i@h`%eTIbsF*DqT%uHif9QOEik;f5YTaYCu=5PPW!sXAT9aJMH-eVP{`T z8AzzRP#c-j^Q=X2OR%Escj){TN{^s4(li6*Crl-5g-=<)lx3}9wi#a!`t45`3GTM& F{su*A$ddp7 diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index 0830de12fd783ae113e03d1906498d06445cd6c9..ba529c25d5f16784c6c5c9b80951f4282f54f55c 100644 GIT binary patch delta 3321 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 diff --git a/__pycache__/webserver.cpython-312.pyc b/__pycache__/webserver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0020478a6ac0096c0b165efe95c76d26c993de6f GIT binary patch literal 936 zcmbVJ&1(}u6o0cH*(BTeP1AS~Z%L@8f;TIAP(%=Nu^tS8Ws@26(fx8}*N~i2Di}O@ zYySjG{7<~JMk%fb3yR<^l9N3-v&qV$_2LZkcyE5c-+MFfz0Kvaz}L@rYU=?4_#%RM zsS9WJjXOJl0V4}+R718@laPodORmWh5JZ$QSBq6siQ3K0{iG#w_f#^T`>_fESDpPE z$8yZT%5xYm2(`>V*y?X~D#6ZjcK(Fi8cyTPo9tMgV+i_ES^qAAvJ|TKER$`9rzvqT zp@vUv&oX^d9c0#eF5P5p*J~zoiX`I9R=C*#f6)%$O^YA(kms!qa$2DP+pd$ixw^RNkp@rj zjL?eL57TimD#onw!^CWc@KwLKdwZg@K1Xki07iwGD=<)8x>kC8e15~08 F{Q{2T%envn literal 0 HcmV?d00001 diff --git a/api.py b/api.py index 646cb9d..01dc3a1 100644 --- a/api.py +++ b/api.py @@ -4,12 +4,59 @@ from config import config database_api= Blueprint('database_api', __name__) + +def paginate_with_params(cur, limit, offset, params): + sql = f"SELECT * FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id" + count = f"SELECT COUNT(*) FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id" + # WHERE search_string LIKE '%{search_string}%' + strings = [] + count_strings = [] + if params['search_string'] != "": + s = params['search_string'] + strings.append(f" search_string LIKE '%{s}%'") + count_strings.append(f" search_string LIKE '%{s}%'") + + if params['view'] == 1: + s = params['view'] + strings.append(f" main_logistics_info.quantity_on_hand <> 0.00") + count_strings.append(f" main_logistics_info.quantity_on_hand <> 0.00") + + + # LIMIT {limit} OFFSET {offset};" + + if len(strings) > 0: + sql = f"{sql} WHERE{" AND".join(strings)}" + + if len(count_strings) > 0: + count = f"{count} WHERE{" AND".join(count_strings)}" + + sql = f"{sql} ORDER BY main_logistics_info.quantity_on_hand LIMIT {limit} OFFSET {offset};" + count = f"{count};" + print(count) + print(sql) + cur.execute(sql) + pantry_inventory = cur.fetchall() + cur.execute(count) + count = cur.fetchone()[0] + return pantry_inventory, count + +def paginate_default(cur, limit, offset): + sql = f"SELECT * FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id LIMIT %s OFFSET %s;" + cur.execute(sql, (limit, offset)) + pantry_inventory = cur.fetchall() + cur.execute("SELECT COUNT(*) FROM main_items;") + count = cur.fetchone()[0] + return pantry_inventory, count + + @database_api.route("/getItems") def pagninate_items(): print("hello") page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) search_string = str(request.args.get('search_text', "")) + sort_order = int(request.args.get('sort_order', 1)) + view = int(request.args.get('view', 0)) offset = (page - 1) * limit @@ -20,26 +67,22 @@ def pagninate_items(): with psycopg2.connect(**database_config) as conn: try: with conn.cursor() as cur: - if search_string != "": - sql = f"SELECT * FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id WHERE search_string LIKE '%{search_string}%' LIMIT {limit} OFFSET {offset};" - cur.execute(sql) - pantry_inventory = cur.fetchall() - cur.execute(f"SELECT COUNT(*) FROM main_items WHERE search_string LIKE '%{search_string}%';") - count = cur.fetchone()[0] - else: - sql = f"SELECT * FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id LIMIT %s OFFSET %s;" - cur.execute(sql, (limit, offset)) - pantry_inventory = cur.fetchall() - cur.execute("SELECT COUNT(*) FROM main_items;") - count = cur.fetchone()[0] - - print(sql) - print(count, math.ceil(count/limit)) - + pantry_inventory, count = paginate_with_params( + cur, limit, offset, + {'search_string': search_string, + 'view': view} + ) except (Exception, psycopg2.DatabaseError) as error: print(error) - pantry_inventory = sorted(pantry_inventory, key=lambda x: x[2]) + if sort_order == 0: + pantry_inventory = sorted(pantry_inventory, key=lambda x: x[1]) + + if sort_order == 1: + pantry_inventory = sorted(pantry_inventory, key=lambda x: x[2]) + + if sort_order == 2: + pantry_inventory = sorted(pantry_inventory, key=lambda x: x[18]) return jsonify({'items': pantry_inventory, "end": math.ceil(count/limit)}) @@ -63,4 +106,17 @@ def get_item(): except (Exception, psycopg2.DatabaseError) as error: print(error) - return render_template(f"item_page/index.html", item=item) \ No newline at end of file + return render_template(f"item_page/index.html", item=item) + +@database_api.route("/addGroup") +def addGroup(): + name = str(request.args.get('name', "")) + description = str(request.args.get('description', "")) + group_type = str(request.args.get('type', "")) + + state = "FAILED" + + if name or description or group_type == "": + print("this is empty") + + return jsonify({'state': state}) \ No newline at end of file diff --git a/main.py b/main.py index 094085f..dc996f3 100644 --- a/main.py +++ b/main.py @@ -310,6 +310,11 @@ def delete_site(site_name): drop_table(f'sites/{site_name}/sql/drop/logistics_info.sql') drop_table(f'sites/{site_name}/sql/drop/zones.sql') drop_table(f'sites/{site_name}/sql/drop/locations.sql') + drop_table(f'sites/{site_name}/sql/drop/vendors.sql') + drop_table(f'sites/{site_name}/sql/drop/receipt_items.sql') + drop_table(f'sites/{site_name}/sql/drop/receipts.sql') + drop_table(f'sites/{site_name}/sql/drop/recipes.sql') + drop_table(f'sites/{site_name}/sql/drop/shopping_lists.sql') def create_site(site_name): @@ -326,6 +331,12 @@ def create_site(site_name): create_table(f'sites/{site_name}/sql/create/item.sql') create_table(f'sites/{site_name}/sql/create/zones.sql') create_table(f'sites/{site_name}/sql/create/locations.sql') + create_table(f'sites/{site_name}/sql/create/vendors.sql') + create_table(f'sites/{site_name}/sql/create/receipt_items.sql') + create_table(f'sites/{site_name}/sql/create/receipts.sql') + create_table(f'sites/{site_name}/sql/create/recipes.sql') + create_table(f'sites/{site_name}/sql/create/shopping_lists.sql') + sql = f"INSERT INTO {site_name}_zones(name) VALUES (%s) RETURNING id;" sqltwo = f"INSERT INTO {site_name}_locations(uuid, name, zone_id, items) VALUES (%s, %s, %s, %s);" @@ -411,7 +422,8 @@ def parse_csv(path_to_csv): if line[0] != "id": payload["item_info"]["packaging"] = line[10] payload["item_info"]["uom"] = line[13] - payload["item_info"]["cost"] = line[15] + if line[15] != "": + payload["item_info"]["cost"] = line[15] if line[17] != "None": payload["item_info"]["safety_stock"] = line[17] qty = float(line[30]) @@ -432,4 +444,4 @@ if __name__ == "__main__": for k, v in items.items(): print(f"{k}: {v}") """ - parse_csv(r"C:\\Users\\jadow\Downloads\\2024-10-02-Pantry.csv") \ No newline at end of file + parse_csv(r"C:\\Users\\jadow\\Documents\\code\\postgresql python\\postgresql-python\\2024-10-02-Pantry.csv") \ No newline at end of file diff --git a/manage.py b/manage.py index a1d9867..9f84298 100644 --- a/manage.py +++ b/manage.py @@ -6,6 +6,22 @@ Manage.py is where the databases and configuration is set up. Its a CLI for quic MyPantry App. """ +def rename_unique_sql(site_name): + files = os.walk(f"sites/{site_name}/sql/unique") + + sql_files = [] + for file in files: + sql_files = file[2] + + for file_name in sql_files: + words = None + with open(f"sites/{site_name}/sql/unique/{file_name}", "r") as file: + words = file.read() + words = words.replace("%sitename%", site_name) + + with open(f"sites/{site_name}/sql/unique/{file_name}", "w") as file: + file.write(words) + def rename_drop_sql(site_name): files = os.walk(f"sites/{site_name}/sql/drop") @@ -60,6 +76,7 @@ def create(): shutil.copytree(f"sites/default/sql", f"sites/{site_name}/sql") rename_create_sql(site_name) rename_drop_sql(site_name) + rename_unique_sql(site_name) with open(f"sites/{site_name}/site.ini", "w+") as config: config.write(f"[site]\n") diff --git a/sites/default/sql/create/item.sql b/sites/default/sql/create/item.sql index 33109d8..2d6081d 100644 --- a/sites/default/sql/create/item.sql +++ b/sites/default/sql/create/item.sql @@ -3,6 +3,7 @@ CREATE TABLE IF NOT EXISTS %sitename%_items( barcode VARCHAR(255) NOT NULL, item_name VARCHAR(255) NOT NULL, brand INTEGER, + description TEXT; tags TEXT [], links JSONB, item_info_id INTEGER NOT NULL, diff --git a/sites/default/sql/create/receipt_items.sql b/sites/default/sql/create/receipt_items.sql index 0b20778..6cbfb64 100644 --- a/sites/default/sql/create/receipt_items.sql +++ b/sites/default/sql/create/receipt_items.sql @@ -6,4 +6,4 @@ CREATE TABLE IF NOT EXISTS %sitename%_receipt_items ( qty FLOAT8 NOT NULL, data JSONB, status VARCHAR (64) -) \ No newline at end of file +); \ No newline at end of file diff --git a/sites/default/sql/create/vendors.sql b/sites/default/sql/create/vendors.sql index ea7b7ee..d3512a7 100644 --- a/sites/default/sql/create/vendors.sql +++ b/sites/default/sql/create/vendors.sql @@ -5,4 +5,4 @@ CREATE TABLE IF NOT EXISTS %sitename%_vendors ( creation_date TIMESTAMP NOT NULL, created_by TIMESTAMP NOT NULL, phone_number VARCHAR(32) -) \ No newline at end of file +); \ No newline at end of file diff --git a/sites/default/sql/drop/receipt_items.sql b/sites/default/sql/drop/receipt_items.sql new file mode 100644 index 0000000..3dea741 --- /dev/null +++ b/sites/default/sql/drop/receipt_items.sql @@ -0,0 +1 @@ +DROP TABLE %sitename%_receipt_items CASCADE; \ No newline at end of file diff --git a/sites/default/sql/drop/receipts.sql b/sites/default/sql/drop/receipts.sql new file mode 100644 index 0000000..c9b266a --- /dev/null +++ b/sites/default/sql/drop/receipts.sql @@ -0,0 +1 @@ +DROP TABLE %sitename%_receipts CASCADE; \ No newline at end of file diff --git a/sites/default/sql/drop/recipes.sql b/sites/default/sql/drop/recipes.sql new file mode 100644 index 0000000..a672a7f --- /dev/null +++ b/sites/default/sql/drop/recipes.sql @@ -0,0 +1 @@ +DROP TABLE %sitename%_recipes CASCADE; \ No newline at end of file diff --git a/sites/default/sql/drop/shopping_lists.sql b/sites/default/sql/drop/shopping_lists.sql new file mode 100644 index 0000000..3591aa4 --- /dev/null +++ b/sites/default/sql/drop/shopping_lists.sql @@ -0,0 +1 @@ +DROP TABLE %sitename%_shopping_lists CASCADE; \ No newline at end of file diff --git a/sites/default/sql/drop/vendors.sql b/sites/default/sql/drop/vendors.sql new file mode 100644 index 0000000..8a68124 --- /dev/null +++ b/sites/default/sql/drop/vendors.sql @@ -0,0 +1 @@ +DROP TABLE %sitename%_vendors CASCADE; \ No newline at end of file diff --git a/sites/default/sql/unique/select_item_all.sql b/sites/default/sql/unique/select_item_all.sql index bdc2894..8967b1c 100644 --- a/sites/default/sql/unique/select_item_all.sql +++ b/sites/default/sql/unique/select_item_all.sql @@ -9,36 +9,37 @@ WHERE %sitename%_items.id=%s; 01 - barcode 02 - item_name 03 - brand (id) -04 - tags -05 - links -06 - item_info_id -07 - logistics_info_id -08 - food_info_id -09 - row_type -10 - item_type -11 - search_string -12 - logistics_info_id -13 - barcode -14 - primary_location -15 - auto_issue_location -16 - dynamic_locations -17 - location_data -18 - quantity_on_hand -19 - item_info_id -20 - barcode -21 - linked_items -22 - shopping_lists -23 - recipes -24 - groups -25 - packaging -26 - uom -27 - cost -28 - safety_stock -29 - lead_time_days -30 - ai_pick -31 - food_info_id -32 - food_groups -33 - ingrediants -34 - nutrients -35 - expires +04 - description +05 - tags +06 - links +07 - item_info_id +08 - logistics_info_id +09 - food_info_id +10 - row_type +11 - item_type +12 - search_string +13 - logistics_info_id +14 - barcode +15 - primary_location +16 - auto_issue_location +17 - dynamic_locations +18 - location_data +19 - quantity_on_hand +20 - item_info_id +21 - barcode +22 - linked_items +23 - shopping_lists +24 - recipes +25 - groups +26 - packaging +27 - uom +28 - cost +29 - safety_stock +30 - lead_time_days +31 - ai_pick +32 - food_info_id +33 - food_groups +34 - ingrediants +35 - nutrients +36 - expires */ \ No newline at end of file diff --git a/sites/main/site.ini b/sites/main/site.ini index d08dec8..2d7e2e6 100644 --- a/sites/main/site.ini +++ b/sites/main/site.ini @@ -1,6 +1,6 @@ [site] site_name=main -site_owner=jadowyne +site_owner= email= [defaults] diff --git a/sites/main/sql/create/item.sql b/sites/main/sql/create/item.sql index 5f1c027..d736b6b 100644 --- a/sites/main/sql/create/item.sql +++ b/sites/main/sql/create/item.sql @@ -4,7 +4,7 @@ CREATE TABLE IF NOT EXISTS main_items( item_name VARCHAR(255) NOT NULL, brand INTEGER, tags TEXT [], - links TEXT [], + links JSONB, item_info_id INTEGER NOT NULL, logistics_info_id INTEGER NOT NULL, food_info_id INTEGER, diff --git a/sites/main/sql/create/receipt_items.sql b/sites/main/sql/create/receipt_items.sql new file mode 100644 index 0000000..6ab19d5 --- /dev/null +++ b/sites/main/sql/create/receipt_items.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS main_receipt_items ( + id SERIAL PRIMARY KEY, + type VARCHAR(255) NOT NULL, + barcode VARCHAR(255) NOT NULL, + name VARCHAR(255) NOT NULL, + qty FLOAT8 NOT NULL, + data JSONB, + status VARCHAR (64) +); \ No newline at end of file diff --git a/sites/main/sql/create/receipts.sql b/sites/main/sql/create/receipts.sql new file mode 100644 index 0000000..f0859d2 --- /dev/null +++ b/sites/main/sql/create/receipts.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS main_receipts ( + id SERIAL PRIMARY KEY, + receipt_id INTEGER NOT NULL, + receipt_status VARCHAR (64) NOT NULL, + date_submitted TIMESTAMP NOT NULL, + submitted_by INTEGER NOT NULL, + vendor_id INTEGER, + files JSONB, + UNIQUE(receipt_id) +); \ No newline at end of file diff --git a/sites/main/sql/create/recipes.sql b/sites/main/sql/create/recipes.sql new file mode 100644 index 0000000..a4a267e --- /dev/null +++ b/sites/main/sql/create/recipes.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS main_recipes ( + id SERIAL PRIMARY KEY, + name VARCHAR, + author INTEGER, + description TEXT, + creation_date TIMESTAMP, + custom_items JSONB, + pantry_items JSONB, + group_items JSONB, + instructions TEXT [], + picture_path TEXT +); \ No newline at end of file diff --git a/sites/main/sql/create/shopping_lists.sql b/sites/main/sql/create/shopping_lists.sql new file mode 100644 index 0000000..ec12db3 --- /dev/null +++ b/sites/main/sql/create/shopping_lists.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS main_shopping_lists ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + description TEXT, + pantry_items JSONB, + custom_items JSONB, + recipes JSONB, + groups JSONB, + author INTEGER, + creation_date TIMESTAMP, + type VARCHAR(64), + UNIQUE(name) +); \ No newline at end of file diff --git a/sites/main/sql/create/vendors.sql b/sites/main/sql/create/vendors.sql new file mode 100644 index 0000000..50d498c --- /dev/null +++ b/sites/main/sql/create/vendors.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS main_vendors ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + address VARCHAR(255), + creation_date TIMESTAMP NOT NULL, + created_by TIMESTAMP NOT NULL, + phone_number VARCHAR(32) +); \ No newline at end of file diff --git a/sites/main/sql/drop/receipt_items.sql b/sites/main/sql/drop/receipt_items.sql new file mode 100644 index 0000000..8c7d640 --- /dev/null +++ b/sites/main/sql/drop/receipt_items.sql @@ -0,0 +1 @@ +DROP TABLE main_receipt_items CASCADE; \ No newline at end of file diff --git a/sites/main/sql/drop/receipts.sql b/sites/main/sql/drop/receipts.sql new file mode 100644 index 0000000..48af77b --- /dev/null +++ b/sites/main/sql/drop/receipts.sql @@ -0,0 +1 @@ +DROP TABLE main_receipts CASCADE; \ No newline at end of file diff --git a/sites/main/sql/drop/recipes.sql b/sites/main/sql/drop/recipes.sql new file mode 100644 index 0000000..c680d90 --- /dev/null +++ b/sites/main/sql/drop/recipes.sql @@ -0,0 +1 @@ +DROP TABLE main_recipes CASCADE; \ No newline at end of file diff --git a/sites/main/sql/drop/shopping_lists.sql b/sites/main/sql/drop/shopping_lists.sql new file mode 100644 index 0000000..db181d9 --- /dev/null +++ b/sites/main/sql/drop/shopping_lists.sql @@ -0,0 +1 @@ +DROP TABLE main_shopping_lists CASCADE; \ No newline at end of file diff --git a/sites/main/sql/drop/vendors.sql b/sites/main/sql/drop/vendors.sql new file mode 100644 index 0000000..e20f2a5 --- /dev/null +++ b/sites/main/sql/drop/vendors.sql @@ -0,0 +1 @@ +DROP TABLE main_vendors CASCADE; \ No newline at end of file diff --git a/sites/main/sql/unique/select_item_all.sql b/sites/main/sql/unique/select_item_all.sql index 42b69ea..b5ca580 100644 --- a/sites/main/sql/unique/select_item_all.sql +++ b/sites/main/sql/unique/select_item_all.sql @@ -2,4 +2,43 @@ SELECT * FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id LEFT JOIN main_item_info ON main_items.item_info_id = main_item_info.id LEFT JOIN main_food_info ON main_items.food_info_id = main_food_info.id -WHERE main_items.id=%s; \ No newline at end of file +WHERE main_items.id=%s; + +/* +00 - item_id +01 - barcode +02 - item_name +03 - brand (id) +04 - tags +05 - links +06 - item_info_id +07 - logistics_info_id +08 - food_info_id +09 - row_type +10 - item_type +11 - search_string +12 - logistics_info_id +13 - barcode +14 - primary_location +15 - auto_issue_location +16 - dynamic_locations +17 - location_data +18 - quantity_on_hand +19 - item_info_id +20 - barcode +21 - linked_items +22 - shopping_lists +23 - recipes +24 - groups +25 - packaging +26 - uom +27 - cost +28 - safety_stock +29 - lead_time_days +30 - ai_pick +31 - food_info_id +32 - food_groups +33 - ingrediants +34 - nutrients +35 - expires +*/ \ No newline at end of file diff --git a/templates/home.html b/templates/home.html index 8269b11..0aaf1d4 100644 --- a/templates/home.html +++ b/templates/home.html @@ -4,78 +4,177 @@ My Pantry + + + + + + + + -
+
search
- tune + tune
-
-
+
+ +
+
+

Change Views

+
+
+ +
+
+ +
+
+
+ +
+
+

Sort Items By

+
+
+ +
+
+ +
+
+ +
+
+
+ +
-

Item Limit

+

Set Items Per Page

-
+
-
+
-
+
-
+
+
+ +
+
+ +
-
-
+
+
+
+
+ + + +
+
+
+
+
+
+

Welcome to you personalized workshop, this is where you can add/create/modify + alot of the items and functions in your site. These modals will walk you through what basic info you will need + in order to further expand on your site.

+
+
+
+ Add Group +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/webserver.py b/webserver.py index 3cc61cd..b12ddea 100644 --- a/webserver.py +++ b/webserver.py @@ -4,6 +4,9 @@ app = Flask(__name__) app.register_blueprint(api.database_api) +@app.route("/workshop") +def workshop(): + return render_template("workshop.html") @app.route("/") def home():