Wajahat698 commited on
Commit
6c780a8
·
verified ·
1 Parent(s): b4e3d5f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +134 -109
app.py CHANGED
@@ -152,23 +152,21 @@ def merge_markdown_contents(contents):
152
  merged_content = "\n\n---\n\n".join(contents)
153
  return merged_content
154
 
155
- def upload_to_firebase(user_id, merged_md_content):
156
- """
157
- Upload the merged Markdown content to Firebase Storage.
158
- Returns the public URL of the uploaded file.
159
- """
160
  try:
161
- file_path = f"knowledge_bases/{user_id}/knowledge_base.md"
162
- # Upload the content as bytes
163
- storage.child(file_path).put(io.BytesIO(merged_md_content.encode('utf-8')), content_type="text/markdown")
164
- # Get the download URL
165
- public_url = storage.child(file_path).get_url(None)
 
166
  return public_url
167
  except Exception as e:
168
- logger.error(f"Error uploading to Firebase Storage: {e}")
169
- st.sidebar.error(f"Error uploading files: {e}")
170
  return None
171
 
 
 
172
  # Define and validate API keys
173
  openai_api_key = os.getenv("OPENAI_API_KEY")
174
  serper_api_key = os.getenv("SERPER_API_KEY")
@@ -408,6 +406,30 @@ def update_message_counter():
408
 
409
 
410
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
411
  def store_brand_tonality(user_id, message):
412
  try:
413
  tonality_id = str(uuid.uuid4())
@@ -468,25 +490,18 @@ def load_user_content(user_id):
468
 
469
 
470
 
471
- def save_content(user_id, content, trust_bucket, content_type="TrustBuilder"):
472
  try:
473
- entry_id = str(uuid.uuid4())
474
- firebase_key = "TrustBuilder" if content_type.lower() == "trustbuilder" else "BrandTonality"
475
-
476
- # Save with metadata (trust_bucket for TrustBuilders)
477
- data = {"message": content}
478
- if content_type == "TrustBuilder":
479
- data["trust_bucket"] = trust_bucket
480
-
481
- db.child("users").child(user_id).child(firebase_key).child(entry_id).set(data)
482
-
483
- if firebase_key not in st.session_state:
484
- st.session_state[firebase_key] = {}
485
- st.session_state[firebase_key][entry_id] = data
486
-
487
- st.success(f"{content_type.capitalize()} saved successfully!")
488
  except Exception as e:
489
- st.error(f"Error saving {content_type}: {e}")
490
 
491
 
492
 
@@ -662,69 +677,78 @@ def side():
662
 
663
  # Image paths and labels (pre-resized images in your folder)
664
  st.sidebar.header("TrustVault®")
665
-
666
- # Saved Documents Section
667
- st.sidebar.markdown("""
668
- <style>
669
- .scrollable-container {
670
- max-height: 300px;
671
- overflow-y: auto;
672
- border: 1px solid #ddd;
673
- padding: 10px;
674
- border-radius: 5px;
675
- }
676
- </style>
677
- """, unsafe_allow_html=True)
678
-
679
- st.sidebar.markdown('<div class="scrollable-container">', unsafe_allow_html=True)
680
-
681
  # Saved Documents Section
682
- st.sidebar.subheader("Saved documents")
683
- st.sidebar.text_area("Save documents like your brand tonality, key phrases, or segments here", height=80, disabled=True)
684
  docs = fetch_documents(st.session_state["wix_user_id"])
685
-
686
  if docs:
687
  for doc_id, doc_data in docs.items():
688
- st.sidebar.markdown(f"**Document ID:** {doc_id[:8]}")
689
- st.sidebar.text_area("Preview", doc_data.get("content", ""), height=80, disabled=True)
690
- public_url = doc_data.get("public_url", "URL not available")
691
- if public_url != "URL not available":
692
- st.sidebar.markdown(f"[View Full Document]({public_url})", unsafe_allow_html=True)
693
  # Add delete button for each document
694
- if st.button(f"Delete: {doc_id[:8]}", key=f"del_{doc_id}"):
695
  delete_document(st.session_state["wix_user_id"], doc_id)
 
696
  else:
697
- st.sidebar.write("No saved documents found.")
698
-
699
- # File Upload Section inside the same container
700
- st.sidebar.subheader("Upload New Documents")
701
- uploaded_files = st.sidebar.file_uploader("Upload PDF, DOCX, or TXT files", type=["pdf", "docx", "txt"], accept_multiple_files=True)
702
- if uploaded_files:
703
- md_contents = [convert_file_to_md(file) for file in uploaded_files if convert_file_to_md(file)]
704
- if md_contents:
705
- merged_md_content = merge_markdown_contents(md_contents)
706
- public_url = upload_to_firebase(st.session_state["wix_user_id"], merged_md_content)
707
- if public_url:
708
- # Save document reference and public URL to Firebase
709
- doc_id = str(uuid.uuid4())
710
- db.child(f"/users/{st.session_state['wix_user_id']}/documents/{doc_id}").set({
711
- "content": merged_md_content,
712
- "public_url": public_url
713
- })
714
- st.sidebar.success("Files uploaded and saved successfully!")
715
- st.sidebar.markdown(f"[View your knowledge base here]({public_url})", unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
716
  else:
717
- st.sidebar.warning("No valid files uploaded.")
718
-
719
- st.sidebar.markdown('</div>', unsafe_allow_html=True)
720
-
721
  # Show My TrustBuilders Section
722
- st.sidebar.subheader("Show my TrustBuilders®")
723
- search_query = st.sidebar.text_input("Search by keyword", key="keyword")
724
- brand_input = st.sidebar.text_input("Brand/Product/Person", key="brand_input")
725
  bucket = st.session_state.get("selected_bucket")
726
-
727
- if st.sidebar.button("Show TrustBuilders"):
728
  # Fetch TrustBuilders from Firebase
729
  search_results = fetch_trustbuilders(
730
  st.session_state["wix_user_id"],
@@ -734,44 +758,45 @@ def side():
734
  )
735
  if search_results:
736
  for result_id, result_data in search_results.items():
737
- st.sidebar.write(f"- {result_data['message'][:50]}")
738
- # Optionally, add a delete button for each TrustBuilder
739
- if st.sidebar.button(f"Delete TrustBuilder {result_id[:8]}", key=f"del_tb_{result_id}"):
740
- delete_trustbuilder(st.session_state["wix_user_id"], result_id)
 
 
 
741
  else:
742
- st.sidebar.write("No TrustBuilders found.")
743
-
744
  # Trust Bucket Selection
745
- st.sidebar.write("and choose the Trust Bucket®")
746
  trust_buckets = ["S", "D", "R", "B", "V", "C"]
747
  bucket_labels = ["Stability", "Development", "Relationship", "Benefit", "Vision", "Competence"]
748
- cols = st.sidebar.columns(len(trust_buckets))
749
  for idx, (bucket, label) in enumerate(zip(trust_buckets, bucket_labels)):
750
- with cols[idx]:
751
- if st.button(f"{bucket}", key=f"bucket_{label}"):
752
- st.sidebar.write(f"{label} Trust clicked")
753
- st.session_state["selected_bucket"] = label
754
-
755
  # Save TrustBuilders Section
756
- st.sidebar.subheader("Save TrustBuilders®")
757
- brand = st.sidebar.text_input("Brand/Product/Person", key="brand_product")
758
- trust_builder_text = st.sidebar.text_area("Type/paste Trust Builder®", height=100)
759
-
760
  # Allocate TrustBuilders to Buckets
761
- st.sidebar.write("Allocate to")
 
762
  for idx, (bucket, label) in enumerate(zip(trust_buckets, bucket_labels)):
763
- if st.sidebar.button(f"{bucket}", key=f"allocate_{label}"):
764
- save_content(st.session_state["wix_user_id"], trust_builder_text, trust_bucket=label)
765
- st.sidebar.success(f"TrustBuilder saved to {label} bucket.")
766
-
767
- if st.sidebar.button("Let AI allocate"):
768
  allocated_bucket = ai_allocate_trust_bucket(trust_builder_text)
769
  if allocated_bucket:
770
- save_content(st.session_state["wix_user_id"], trust_builder_text, trust_bucket=allocated_bucket)
771
- st.sidebar.success(f"AI allocated the Trust Bucket: {allocated_bucket} and saved your TrustBuilder.")
772
  else:
773
- st.sidebar.error("AI could not allocate the Trust Bucket.")
774
-
775
  side()
776
  # Load knowledge base
777
 
 
152
  merged_content = "\n\n---\n\n".join(contents)
153
  return merged_content
154
 
155
+ def upload_to_firebase(user_id, content):
 
 
 
 
156
  try:
157
+ # Create a unique filename
158
+ filename = f"knowledge_bases/{user_id}/knowledge_base_{uuid.uuid4()}.md"
159
+ # Upload content to Firebase Storage
160
+ storage.child(filename).put(content.encode('utf-8'))
161
+ # Get the public URL
162
+ public_url = storage.child(filename).get_url(None)
163
  return public_url
164
  except Exception as e:
165
+ st.error(f"Error uploading to Firebase: {e}")
 
166
  return None
167
 
168
+
169
+
170
  # Define and validate API keys
171
  openai_api_key = os.getenv("OPENAI_API_KEY")
172
  serper_api_key = os.getenv("SERPER_API_KEY")
 
406
 
407
 
408
 
409
+ def fetch_trustbuilders(user_id, keyword=None, brand=None, bucket=None):
410
+ try:
411
+ trustbuilders = db.child("users").child(user_id).child("TrustBuilder").get().val()
412
+ if trustbuilders:
413
+ filtered_trustbuilders = {
414
+ k: v for k, v in trustbuilders.items()
415
+ if (not keyword or keyword.lower() in v["message"].lower())
416
+ and (not brand or brand.lower() in v.get("brand", "").lower())
417
+ and (not bucket or bucket == v.get("bucket", ""))
418
+ }
419
+ return filtered_trustbuilders
420
+ return {}
421
+ except Exception as e:
422
+ st.error(f"Error fetching TrustBuilders: {e}")
423
+ return {}
424
+
425
+ def delete_trustbuilder(user_id, trustbuilder_id):
426
+ try:
427
+ db.child("users").child(user_id).child("TrustBuilder").child(trustbuilder_id).remove()
428
+ st.success("TrustBuilder deleted successfully.")
429
+ st.experimental_rerun() # Refresh the app to reflect deletion
430
+ except Exception as e:
431
+ st.error(f"Error deleting TrustBuilder: {e}")
432
+
433
  def store_brand_tonality(user_id, message):
434
  try:
435
  tonality_id = str(uuid.uuid4())
 
490
 
491
 
492
 
493
+ def save_content(user_id, brand, trust_builder_text, trust_bucket=None):
494
  try:
495
+ trustbuilder_id = str(uuid.uuid4())
496
+ data = {
497
+ "brand": brand,
498
+ "message": trust_builder_text,
499
+ "bucket": trust_bucket
500
+ }
501
+ db.child("users").child(user_id).child("TrustBuilder").child(trustbuilder_id).set(data)
502
+ st.success(f"TrustBuilder saved to {trust_bucket} bucket.")
 
 
 
 
 
 
 
503
  except Exception as e:
504
+ st.error(f"Error saving TrustBuilder: {e}")
505
 
506
 
507
 
 
677
 
678
  # Image paths and labels (pre-resized images in your folder)
679
  st.sidebar.header("TrustVault®")
680
+ st.markdown("""
681
+ <style>
682
+ .scrollable-container {
683
+ max-height: 300px;
684
+ overflow-y: auto;
685
+ border: 1px solid #ddd;
686
+ padding: 10px;
687
+ border-radius: 5px;
688
+ }
689
+ </style>
690
+ """, unsafe_allow_html=True)
691
+
692
+ st.markdown('<div class="scrollable-container">', unsafe_allow_html=True)
693
+
 
 
694
  # Saved Documents Section
695
+ st.subheader("Saved Documents")
 
696
  docs = fetch_documents(st.session_state["wix_user_id"])
697
+
698
  if docs:
699
  for doc_id, doc_data in docs.items():
700
+ with st.expander(f"Document ID: {doc_id[:8]}"):
701
+ st.text_area("Preview", doc_data.get("content", ""), height=80, disabled=True)
702
+ public_url = doc_data.get("public_url", "URL not available")
703
+ if public_url != "URL not available":
704
+ st.markdown(f"[View Full Document]({public_url})", unsafe_allow_html=True)
705
  # Add delete button for each document
706
+ if st.button(f"Delete Document {doc_id[:8]}", key=f"del_doc_{doc_id}"):
707
  delete_document(st.session_state["wix_user_id"], doc_id)
708
+ st.experimental_rerun() # Refresh the app to reflect deletion
709
  else:
710
+ st.write("No saved documents found.")
711
+
712
+ # File Upload Section
713
+ st.subheader("Upload New Documents")
714
+ with st.form(key='upload_form'):
715
+ uploaded_files = st.file_uploader(
716
+ "Select PDF, DOCX, or TXT files to upload",
717
+ type=["pdf", "docx", "txt"],
718
+ accept_multiple_files=True
719
+ )
720
+ submit_upload = st.form_submit_button(label='Upload')
721
+
722
+ if submit_upload:
723
+ if uploaded_files:
724
+ md_contents = [convert_file_to_md(file) for file in uploaded_files if convert_file_to_md(file)]
725
+ if md_contents:
726
+ merged_md_content = merge_markdown_contents(md_contents)
727
+ public_url = upload_to_firebase(st.session_state["wix_user_id"], merged_md_content)
728
+ if public_url:
729
+ # Save document reference and public URL to Firebase
730
+ doc_id = str(uuid.uuid4())
731
+ db.child("users").child(st.session_state["wix_user_id"]).child("documents").child(doc_id).set({
732
+ "content": merged_md_content,
733
+ "public_url": public_url
734
+ })
735
+ st.success("Files uploaded and saved successfully!")
736
+ st.markdown(f"[View your knowledge base here]({public_url})", unsafe_allow_html=True)
737
+ st.experimental_rerun() # Refresh to show the new document
738
+ else:
739
+ st.warning("No valid files uploaded.")
740
  else:
741
+ st.warning("Please select at least one file to upload.")
742
+
743
+ st.markdown('</div>', unsafe_allow_html=True)
744
+
745
  # Show My TrustBuilders Section
746
+ st.subheader("Show my TrustBuilders®")
747
+ search_query = st.text_input("Search by keyword", key="keyword")
748
+ brand_input = st.text_input("Brand/Product/Person", key="brand_input")
749
  bucket = st.session_state.get("selected_bucket")
750
+
751
+ if st.button("Show TrustBuilders"):
752
  # Fetch TrustBuilders from Firebase
753
  search_results = fetch_trustbuilders(
754
  st.session_state["wix_user_id"],
 
758
  )
759
  if search_results:
760
  for result_id, result_data in search_results.items():
761
+ with st.expander(f"TrustBuilder ID: {result_id[:8]}"):
762
+ st.write(f"Brand: {result_data.get('brand', 'N/A')}")
763
+ st.write(f"Bucket: {result_data.get('bucket', 'N/A')}")
764
+ st.write(f"Message: {result_data['message']}")
765
+ # Add delete button for each TrustBuilder
766
+ if st.button(f"Delete TrustBuilder {result_id[:8]}", key=f"del_tb_{result_id}"):
767
+ delete_trustbuilder(st.session_state["wix_user_id"], result_id)
768
  else:
769
+ st.write("No TrustBuilders found.")
770
+
771
  # Trust Bucket Selection
772
+ st.write("and choose the Trust Bucket®")
773
  trust_buckets = ["S", "D", "R", "B", "V", "C"]
774
  bucket_labels = ["Stability", "Development", "Relationship", "Benefit", "Vision", "Competence"]
775
+ cols = st.columns(len(trust_buckets))
776
  for idx, (bucket, label) in enumerate(zip(trust_buckets, bucket_labels)):
777
+ if cols[idx].button(f"{bucket}", key=f"bucket_{label}"):
778
+ st.write(f"{label} Trust clicked")
779
+ st.session_state["selected_bucket"] = label
780
+
 
781
  # Save TrustBuilders Section
782
+ st.subheader("Save TrustBuilders®")
783
+ brand = st.text_input("Brand/Product/Person", key="brand_product")
784
+ trust_builder_text = st.text_area("Type/paste Trust Builder®", height=100)
785
+
786
  # Allocate TrustBuilders to Buckets
787
+ st.write("Allocate to")
788
+ cols_allocate = st.columns(len(trust_buckets))
789
  for idx, (bucket, label) in enumerate(zip(trust_buckets, bucket_labels)):
790
+ if cols_allocate[idx].button(f"{bucket}", key=f"allocate_{label}"):
791
+ save_content(st.session_state["wix_user_id"], brand, trust_builder_text, trust_bucket=label)
792
+
793
+ if st.button("Let AI allocate"):
 
794
  allocated_bucket = ai_allocate_trust_bucket(trust_builder_text)
795
  if allocated_bucket:
796
+ save_content(st.session_state["wix_user_id"], brand, trust_builder_text, trust_bucket=allocated_bucket)
797
+ st.success(f"AI allocated the Trust Bucket: {allocated_bucket} and saved your TrustBuilder.")
798
  else:
799
+ st.error("AI could not allocate the Trust Bucket.")
 
800
  side()
801
  # Load knowledge base
802