120 lines
4.6 KiB
Plaintext
120 lines
4.6 KiB
Plaintext
You are ChatGPT, an expert Flask developer. I will upload two ZIP files:
|
||
|
||
* **plant-scan-main.zip** (the standalone sub-app)
|
||
* **natureinpots\_main.zip** (the main app with its utility plugin)
|
||
|
||
When I upload them, **immediately reply**:
|
||
|
||
> Got it, ready to review both codebases.
|
||
|
||
Then, following the exact file structures in those ZIPs, **implement** all of the following changes—listing every modified or new file by its relative path and providing its **complete** updated contents:
|
||
|
||
---
|
||
|
||
## 1. FULL-CODE REVIEW
|
||
|
||
* Scan **every file and every line** in both ZIPs—no exceptions, no assumptions.
|
||
* Keep all code in memory to reference original imports, blueprints, models, routes, and templates.
|
||
|
||
---
|
||
|
||
## 2. SUB-APP ENHANCEMENTS (Plant Scan)
|
||
|
||
1. **Authentication & CSRF**
|
||
|
||
* Add Flask-Login with a `User(id, email, password_hash, created_at)` model.
|
||
* Implement **register**, **login**, **logout** routes and templates; protect all forms with CSRF.
|
||
* Scope all queries so users only see their own data (`Plant.user_id == current_user.id`, `GrowLog.user_id == current_user.id`).
|
||
|
||
2. **Image Upload Support**
|
||
|
||
* Modify plant-create/edit and grow-log forms to accept `<input type="file" multiple name="images">`.
|
||
* Save uploads under:
|
||
|
||
* `static/uploads/<user_id>/<plant_id>/<uuid>.<ext>`
|
||
* `static/uploads/<user_id>/growlogs/<plant_id>/<update_id>/<uuid>.<ext>`
|
||
* Strip EXIF, record `original_filename` and `uploaded_at` in a `Media` model.
|
||
|
||
3. **Export My Data**
|
||
|
||
* Add a login-required `/export` route and button.
|
||
* Generate `<username>_export.zip` containing:
|
||
|
||
* **plants.csv** (headers exactly):
|
||
|
||
```
|
||
plant_id,common_name,scientific_name,genus,vendor_name,price,notes,created_at
|
||
```
|
||
* **media.csv** (headers exactly):
|
||
|
||
```
|
||
plant_id,image_path,uploaded_at,source_type
|
||
```
|
||
* **images/** folder mirroring the upload paths.
|
||
* A hidden **export\_id** (UUID + timestamp) in a metadata file or CSV header.
|
||
* Only include the exporting user’s records and images; exclude all other assets.
|
||
|
||
4. **Manual Testing (Sub-App)**
|
||
|
||
* Register two users; verify isolation of plant and grow-log lists.
|
||
* Upload multiple images; confirm storage paths and DB entries.
|
||
* Export each user; unzip and verify CSV headers, rows, `images/`, and unique `export_id`.
|
||
|
||
---
|
||
|
||
## 3. MAIN-APP utility REFACTOR (“Nature in Pots”)
|
||
|
||
1. **Web-Based ZIP Upload**
|
||
|
||
* Change the utility form to accept a `.zip` file.
|
||
* On upload, unzip into a temp directory expecting `plants.csv`, `media.csv`, and `images/`.
|
||
* If only a CSV is uploaded, process it but skip media.
|
||
|
||
2. **CSV Header Validation**
|
||
|
||
* Abort with a clear error if **plants.csv** does not have exactly:
|
||
|
||
```
|
||
plant_id,common_name,scientific_name,genus,vendor_name,price,notes,created_at
|
||
```
|
||
* Abort if **media.csv** does not have exactly:
|
||
|
||
```
|
||
plant_id,image_path,uploaded_at,source_type
|
||
```
|
||
|
||
3. **Import Logic & Collision Avoidance**
|
||
|
||
* For each row in `plants.csv`, create a new `Plant`.
|
||
* For each row in `media.csv`, locate the file under `images/...`, copy it into the main app’s `static/uploads` using a UUID filename if needed to avoid conflicts, and create a `Media` record with `uploaded_at` and `source_type`.
|
||
* Read `export_id` and store it in an `ImportBatch(export_id, user_id, imported_at)` table; if the same `export_id` has already been processed for that user, **skip the import** and notify the user.
|
||
|
||
4. **Ownership Attribution**
|
||
|
||
* Attribute all imported `Plant` and `Media` entries to **the currently logged-in main-app user**.
|
||
|
||
5. **Schema & Neo4j**
|
||
|
||
* Supply defaults for any non-nullable fields missing from `plants.csv`.
|
||
* Pass all imported fields (e.g. `vendor_name`) into the existing Neo4j handler when creating/updating nodes.
|
||
|
||
6. **Manual Testing (utility)**
|
||
|
||
* As a main-app user, upload the `<username>_export.zip`; confirm no duplicates on re-upload.
|
||
* Verify `Plant`, `Media`, and `PlantOwnershipLog` tables contain correct data and timestamps.
|
||
* View plant detail pages to ensure images load correctly.
|
||
* Inspect Neo4j for the new or updated plant nodes.
|
||
|
||
---
|
||
|
||
## 4. DELIVERY & CONSTRAINTS
|
||
|
||
* For **every** changed or new file, list its **relative path** and include its **entire** file contents.
|
||
* **CSV headers must match exactly**—no deviations.
|
||
* Use **UUID filenames** to guarantee no file collisions on import.
|
||
* All routes and forms must enforce **authentication** and **CSRF**.
|
||
* **Only modify** code under `app/` or `plugins/`; **do not delete** any existing files.
|
||
|
||
Once you’ve implemented all of the above, provide a summary of the changes and confirm the manual testing results.
|
||
|