Skip to content

Commit

Permalink
Merge pull request #15 from planetx-vfx/feature/FP-78/saving-csv-temp…
Browse files Browse the repository at this point in the history
…lates

FP-78 Add CSV template saving
  • Loading branch information
MaximumFX authored Sep 26, 2024
2 parents 0ba104d + 0fd913b commit 82a638d
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 3 deletions.
5 changes: 5 additions & 0 deletions info.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ configuration:
fields: prj, delivery_date, delivery_version
description: "Template to deliver the submission form to."

csv_template_folder:
type: template
fields: context, *
description: "Folder to saves CSV templates."

# --- STRINGS ---
shot_status_field:
type: str
Expand Down
107 changes: 107 additions & 0 deletions python/app/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
"""
from __future__ import annotations

import csv
import os
import re
from pathlib import Path

import sgtk
Expand Down Expand Up @@ -65,6 +68,7 @@ def __init__(self):
)
self.connect_buttons()
self.load_shots()
self.load_csv_templates()

def closeEvent(self, event):
"""
Expand All @@ -83,6 +87,9 @@ def connect_buttons(self):
self.view.open_delivery_folder_button.clicked.connect(
self.open_delivery_folder
)
self.view.csv_add_button.clicked.connect(self.add_csv_entry)
self.view.csv_save_button.clicked.connect(self.save_csv_template)
self.view.csv_load_button.clicked.connect(self.load_csv_template)

def load_shots(self):
"""Clear the olds shots, then fetches the shots on the model."""
Expand Down Expand Up @@ -128,10 +135,110 @@ def loading_shots_failed(self, error: str):
QtWidgets.QLabel("Error while loading shots. Please check logs!")
)

def load_csv_templates(self):
"""Load CSV Template files"""
csv_template_folder_template = self.model.app.get_template(
"csv_template_folder"
)
self.csv_template_folder = Path(
csv_template_folder_template.apply_fields({})
)

self.view.csv_templates.clear()

if not self.csv_template_folder.is_dir():
self.csv_template_folder.mkdir(exist_ok=True)
return

for dir_path, dir_names, file_names in os.walk(
self.csv_template_folder
):
for f in file_names:
if f.endswith(".csv"):
self.load_csv_template_file(os.path.join(dir_path, f))
break

def load_csv_template_file(self, file_path: str):
"""
Load the data from a csv template file.
Args:
file_path: CSV file path
"""
logger.debug(f"Loading CSV template: {file_path}")

with open(file_path, "r", newline="") as file:
reader = csv.reader(file)
rows = list(reader)
data = list(zip(rows[0], rows[1]))

file_name = Path(file_path).stem

self.view.csv_templates.addItem(file_name, userData=data)

def open_delivery_folder(self):
"""Opens the delivery folder."""
self.model.open_delivery_folder()

def add_csv_entry(self):
"""Add an entry to the CSV list."""
self.view.settings["csv_fields"].add_item("", "")

def save_csv_template(self):
"""Save current CSV template."""
text, ok = QtWidgets.QInputDialog.getText(
self, "Save CSV Template", "Enter the template name:"
)
if not ok:
return

if text == "":
dialog = QtWidgets.QMessageBox(self)
dialog.setWindowTitle("Failed")
dialog.setText("Failed saving template. Name is empty.")
dialog.exec()
return

if not re.match(r"^[a-zA-Z0-9 _-]+$", text):
dialog = QtWidgets.QMessageBox(self)
dialog.setWindowTitle("Failed")
dialog.setText(
"Failed saving template. Please only use [a-zA-Z0-9_- ]"
)
dialog.exec()
return

csv_template_path = self.csv_template_folder / f"{text}.csv"

user_settings = self.get_user_settings()

with open(csv_template_path, "w", newline="") as file:
writer = csv.writer(file)
header = [key for key, value in user_settings.csv_fields]
keys = [
value if isinstance(value, str) else f"{{{'.'.join(value)}}}"
for key, value in user_settings.csv_fields
]

writer.writerow(header)
writer.writerow(keys)

dialog = QtWidgets.QMessageBox(self)
dialog.setWindowTitle("Success")
dialog.setText("Saved template")
dialog.exec()

file.close()

self.load_csv_templates()

def load_csv_template(self):
"""Load the selected CSV template."""
self.view.settings["csv_fields"].clear()

for key, value in self.view.csv_templates.currentData():
self.view.settings["csv_fields"].add_item(key, value)

def export_versions(self):
"""Runs the export function on the model."""
self.view.final_validation_label.hide()
Expand Down
17 changes: 14 additions & 3 deletions python/app/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,9 +221,20 @@ def get_settings_widget(self) -> QtWidgets.QWidget:
csv_heading_layout.addWidget(csv_label)
csv_heading_layout.addStretch()

csv_add_button = QtWidgets.QPushButton("+")
csv_add_button.setFixedWidth(24)
csv_heading_layout.addWidget(csv_add_button)
self.csv_templates = QtWidgets.QComboBox()
csv_heading_layout.addWidget(self.csv_templates)

self.csv_save_button = QtWidgets.QPushButton("Save")
self.csv_save_button.setFixedWidth(40)
csv_heading_layout.addWidget(self.csv_save_button)

self.csv_load_button = QtWidgets.QPushButton("Load")
self.csv_load_button.setFixedWidth(40)
csv_heading_layout.addWidget(self.csv_load_button)

self.csv_add_button = QtWidgets.QPushButton("+")
self.csv_add_button.setFixedWidth(24)
csv_heading_layout.addWidget(self.csv_add_button)

csv_heading.setLayout(csv_heading_layout)
csv_settings_layout.addWidget(csv_heading)
Expand Down
7 changes: 7 additions & 0 deletions python/app/widgets/OrderedList.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,13 @@ def delete_item(self, item):
self.items.pop(index)
item.deleteLater()

def clear(self):
"""Clear all items from the list."""
for item in self.items:
item.deleteLater()

self.items.clear()

def size(self):
"""Get the amount of items"""
return len(self.items)
Expand Down

0 comments on commit 82a638d

Please sign in to comment.