This is the portfolio follow-up system to Amir2000 Image Automation | Case Study. It uses existing AI quality values to surface strong candidates, then finalize selection manually and publish a curated portfolio page plus downloadable PDF.
portfolio_v2 schema with origin markers.The portfolio workflow curates from a large existing archive into a tight public selection. AI assists candidate discovery and humans make final artistic decisions.
portfolio_v2, website rendering, downloadable PDF.Boundary clarification: this system does not generate metadata. Metadata generation happens in the automation pipeline before this stage.
Manual portfolio refresh does not scale well when the archive is large. Reviewing everything by hand every time is slow and inconsistent.
This case study is system 2 in a two-system chain:
System 2 components:
portfolio_picker_v2.py (candidate browsing, add/remove/skip/special-entry).portfolio_admin.php (visibility toggle, caption edits, drag reorder, PDF generation).portfolio_print.php (ordered rendering, lightbox, open PDF link).The diagram shows the production chain from upstream automation to portfolio curation and final web delivery quality.
Picker behavior is explicit and transactional. For each selected image it creates exactly five versions and executes a rollback-safe pipeline.
Admin runtime (portfolio_admin.php):
admin_users.portfolio_print.php and supports refresh without full reload.
Public print/runtime (portfolio_print.php):
Show_Order (then id) with a cap of 20 rows.
The table below reflects the active schema used by this workflow and labels each column by runtime ownership/origin.
| Column | Type | Primary Origin | Notes |
|---|---|---|---|
id |
int(11) | Portfolio table | Primary key (auto-increment). |
revamp_id |
varchar(11) | photos_info_revamp.id ** / special token *** | Regular picker rows inherit source id from photos_info_revamp and Special Add rows use generated 1_### tokens. |
Folder |
varchar(255) | Picker-managed | Set to portfolio_v2 during add flow. |
File_Name |
varchar(300) | Source + normalization | Stable JPG filename used as identity key in picker upsert. |
Path |
varchar(255) | Picker-generated | Public URL of watermarked web JPG in /pic/images/portfolio_v2/. |
WebP_Path |
varchar(255) | Picker-generated | Public URL of generated WebP main image. |
Thumb_Path |
varchar(255) | Picker-generated | Public URL of watermarked JPG thumbnail. |
WebP_Thumb_Path |
varchar(255) | Picker-generated | Public URL of WebP thumbnail. |
DateTime |
datetime | photos_info_revamp ** / Special Add EXIF *** | Regular picker rows inherit DateTime from photos_info_revamp and Special Add rows attempt EXIF extraction. |
Camera |
varchar(25) | photos_info_revamp ** / Special Add EXIF *** | Camera model inherited from photos_info_revamp for regular rows and extracted from EXIF for Special Add rows. |
Lens_model |
varchar(255) | photos_info_revamp ** / Special Add EXIF *** | Lens model inherited from photos_info_revamp for regular rows and extracted from EXIF for Special Add rows. |
Width |
int(11) | Picker-generated | Saved from generated web JPG dimensions (display size). |
Height |
int(11) | Picker-generated | Saved from generated web JPG dimensions (display size). |
Exposure |
varchar(12) | photos_info_revamp ** / Special Add EXIF *** | Regular picker rows inherit exposure from photos_info_revamp and Special Add rows use EXIF extraction. |
Aperture |
varchar(5) | photos_info_revamp ** / Special Add EXIF *** | Regular picker rows inherit aperture from photos_info_revamp and Special Add rows use EXIF extraction. |
ISO |
int(11) | photos_info_revamp ** / Special Add EXIF *** | Regular picker rows inherit ISO from photos_info_revamp and Special Add rows use EXIF extraction. |
Focal_length |
int(11) | photos_info_revamp ** / Special Add EXIF *** | Regular picker rows inherit focal length from photos_info_revamp and Special Add rows use EXIF extraction. |
Keywords |
varchar(500) | photos_info_revamp ** / Special Add dialog *** | Regular picker rows inherit keywords from photos_info_revamp and Special Add rows use manual dialog values. |
Caption |
varchar(300) | photos_info_revamp ** / Special Add dialog *** / Admin edit | Regular picker rows inherit caption from photos_info_revamp, Special Add rows use dialog values, and admin can edit later. |
Location |
varchar(250) | photos_info_revamp ** / Special Add dialog *** | Regular picker rows inherit location from photos_info_revamp and Special Add rows use manual dialog values. |
Subject |
varchar(200) | Special Add dialog *** / optional manual | Usually empty for regular rows and mainly populated in Special Add flow. |
nima_score |
double | photos_info_revamp ** / Special Add scoring *** | Regular picker rows inherit score from photos_info_revamp and Special Add rows are scored before insert. |
blur_score |
double | photos_info_revamp ** / Special Add scoring *** | Regular picker rows inherit score from photos_info_revamp and Special Add rows are scored before insert. |
brightness_score |
double | photos_info_revamp ** / Special Add scoring *** | Regular picker rows inherit score from photos_info_revamp and Special Add rows are scored before insert. |
contrast_score |
double | photos_info_revamp ** / Special Add scoring *** | Regular picker rows inherit score from photos_info_revamp and Special Add rows are scored before insert. |
brisque_score |
double | photos_info_revamp ** / Special Add scoring *** | Regular picker rows inherit score from photos_info_revamp and Special Add rows are scored before insert. |
clip_aesthetic_score |
double | photos_info_revamp ** / Special Add scoring *** | Regular picker rows inherit score from photos_info_revamp and Special Add rows are scored before insert. |
sort_order |
int(11) | Legacy/unused in current picker/admin | Protected from picker updates and admin uses Show_Order instead. |
Original_File_Name |
varchar(300) | photos_info_revamp ** / source file *** | Regular picker rows inherit original file name from photos_info_revamp and Special Add rows use selected source file name. |
QR |
double | photos_info_revamp ** / Special Add scoring *** | Primary ranking signal inherited from photos_info_revamp for regular rows and computed for Special Add rows. |
QC_Status |
varchar(25) | photos_info_revamp ** / Special Add scoring *** | Quality category inherited from photos_info_revamp for regular rows and computed for Special Add rows. |
Review_Status |
varchar(25) | Picker-managed | Set to Uploaded during successful add flow. |
Picked |
int(11) | Workflow state field | Reserved/protected in picker updates and defaults to 0. |
Show_Portfolio |
int(11) | PHP admin-managed | Visibility toggle for live portfolio rendering. |
Show_Order |
int(11) | PHP admin-managed | Manual ordering used by print/public page flow. |
Legend:
** field value is inherited from photos_info_revamp for regular picker rows.
*** field value is populated in the Special Add flow from EXIF, manual dialog input, or scoring.
Table constraints in current dump include a primary key on id and unique key (revamp_id, File_Name).
Tradeoff: human review takes more time per batch and it keeps portfolio quality and balance under manual control.
This workflow is a practical hybrid curation system: AI assists discovery and ranking, while human selection defines the final portfolio narrative.