fix date issue for upload
Browse files
backend/app/db/database_mongodb.py
CHANGED
|
@@ -95,7 +95,7 @@ async def save_file(username: str, records: any, filename: str) -> bool:
|
|
| 95 |
upsert=True
|
| 96 |
)
|
| 97 |
|
| 98 |
-
|
| 99 |
opportunity = Opportunity(
|
| 100 |
opportunityId=content["Opportunity ID"],
|
| 101 |
opportunityName=content["Opportunity Name"],
|
|
@@ -107,7 +107,7 @@ async def save_file(username: str, records: any, filename: str) -> bool:
|
|
| 107 |
nextSteps=content["Next Steps"],
|
| 108 |
opportunityDescription=content["Opportunity Description"],
|
| 109 |
activity=content["Activity"],
|
| 110 |
-
closeDate=content
|
| 111 |
created_at=current_time,
|
| 112 |
updated_at=current_time,
|
| 113 |
username=username
|
|
@@ -244,6 +244,31 @@ async def create_indexes():
|
|
| 244 |
print(f"Error creating indexes: {e}")
|
| 245 |
return False
|
| 246 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 247 |
|
| 248 |
# Optional: Add these to your requirements.txt
|
| 249 |
# motor==3.3.1
|
|
|
|
| 95 |
upsert=True
|
| 96 |
)
|
| 97 |
|
| 98 |
+
for content in records: #assume csv is the same format for all files
|
| 99 |
opportunity = Opportunity(
|
| 100 |
opportunityId=content["Opportunity ID"],
|
| 101 |
opportunityName=content["Opportunity Name"],
|
|
|
|
| 107 |
nextSteps=content["Next Steps"],
|
| 108 |
opportunityDescription=content["Opportunity Description"],
|
| 109 |
activity=content["Activity"],
|
| 110 |
+
closeDate=parse_date_string(content.get("Close Date")),
|
| 111 |
created_at=current_time,
|
| 112 |
updated_at=current_time,
|
| 113 |
username=username
|
|
|
|
| 244 |
print(f"Error creating indexes: {e}")
|
| 245 |
return False
|
| 246 |
|
| 247 |
+
def parse_date_string(value: str) -> datetime:
|
| 248 |
+
"""
|
| 249 |
+
Parse different date string formats into datetime object
|
| 250 |
+
"""
|
| 251 |
+
if not value:
|
| 252 |
+
return None
|
| 253 |
+
|
| 254 |
+
# List of possible date formats
|
| 255 |
+
date_formats = [
|
| 256 |
+
"%m/%d/%Y", # 11/30/2024
|
| 257 |
+
"%m/%d/%Y %H:%M:%S", # 11/30/2024 14:30:00
|
| 258 |
+
"%Y-%m-%d", # 2024-11-30
|
| 259 |
+
"%Y-%m-%dT%H:%M:%S", # 2024-11-30T14:30:00
|
| 260 |
+
"%Y-%m-%d %H:%M:%S", # 2024-11-30 14:30:00
|
| 261 |
+
"%Y-%m-%dT%H:%M:%S.%fZ", # 2024-11-30T14:30:00.000Z
|
| 262 |
+
"%Y-%m-%dT%H:%M:%S.%f", # 2024-11-30T14:30:00.000
|
| 263 |
+
]
|
| 264 |
+
|
| 265 |
+
for date_format in date_formats:
|
| 266 |
+
try:
|
| 267 |
+
return datetime.datetime.strptime(value, date_format)
|
| 268 |
+
except ValueError:
|
| 269 |
+
continue
|
| 270 |
+
|
| 271 |
+
raise ValueError(f"Date string '{value}' does not match any expected format")
|
| 272 |
|
| 273 |
# Optional: Add these to your requirements.txt
|
| 274 |
# motor==3.3.1
|
backend/app/db/models.py
CHANGED
|
@@ -24,7 +24,7 @@ class FileUpload(BaseModel):
|
|
| 24 |
class Opportunity(BaseModel):
|
| 25 |
username:str
|
| 26 |
activity: str
|
| 27 |
-
closeDate: datetime
|
| 28 |
customerContact: str
|
| 29 |
customerContactRole: str
|
| 30 |
customerName: str
|
|
|
|
| 24 |
class Opportunity(BaseModel):
|
| 25 |
username:str
|
| 26 |
activity: str
|
| 27 |
+
closeDate: Optional[datetime] = None
|
| 28 |
customerContact: str
|
| 29 |
customerContactRole: str
|
| 30 |
customerName: str
|
frontend/src/components/Opportunities.jsx
CHANGED
|
@@ -62,7 +62,7 @@ const Opportunities = () => {
|
|
| 62 |
<ChatApi />
|
| 63 |
<div className="flex flex-col h-[calc(89vh-7px)]">
|
| 64 |
{opportunities.map((opportunity, id) => (
|
| 65 |
-
<Button key={id} onClick={() => setSelectedOpportunity(opportunity)}>{opportunity.opportunityName}</Button>
|
| 66 |
))}
|
| 67 |
<div className="flex-1 overflow-y-auto p-4 space-y-4 h-[80vh]">
|
| 68 |
{Object.keys(selectedOpportunity || {}).map((key, index) => (
|
|
|
|
| 62 |
<ChatApi />
|
| 63 |
<div className="flex flex-col h-[calc(89vh-7px)]">
|
| 64 |
{opportunities.map((opportunity, id) => (
|
| 65 |
+
<Button key={id} onClick={() => setSelectedOpportunity(opportunity)} style={{'margin':'5px'}}>{opportunity.opportunityName}</Button>
|
| 66 |
))}
|
| 67 |
<div className="flex-1 overflow-y-auto p-4 space-y-4 h-[80vh]">
|
| 68 |
{Object.keys(selectedOpportunity || {}).map((key, index) => (
|