From fbcfe86b9fd197d9e340c55a40e112bfa55b98ee Mon Sep 17 00:00:00 2001
From: GotthardG <51994228+GotthardG@users.noreply.github.com>
Date: Mon, 16 Dec 2024 11:20:33 +0100
Subject: [PATCH] Fix formatting with black

---
 .flake8                 |   8 +-
 .gitlab-ci.yml          |   6 +-
 .pre-commit-config.yaml |  12 +-
 backend/save/main.py    | 554 ----------------------------------------
 4 files changed, 16 insertions(+), 564 deletions(-)
 delete mode 100644 backend/save/main.py

diff --git a/.flake8 b/.flake8
index 172f207..d4de2e4 100644
--- a/.flake8
+++ b/.flake8
@@ -1,3 +1,9 @@
 [flake8]
+# Set line length to match black's default
 max-line-length = 88
-exclude = .git,__pycache__,venv,.venv
\ No newline at end of file
+
+# Ignore rules incompatible with black
+ignore = E203, W503
+
+# Exclude unnecessary directories or files
+exclude = .git, __pycache__, venv, .venv, migrations
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0d13b08..e5985fa 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -31,12 +31,12 @@ lint:
   script:
     - source $VIRTUAL_ENV/bin/activate
     - pip install pre-commit black flake8
+    # Run pre-commit hooks
     - >
       pre-commit run --all-files || (
-      echo "Auto-fixing formatting issues with black..." &&
+      echo "Pre-commit formatting failed. Auto-fixing formatting issues with black..." &&
       black backend/ &&
-      git diff &&
-      exit 1
+      exit 1  # If files needed formatting, fail the job. Developer needs to review changes locally.
       )
 
 deploy:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 1ab2255..95fa821 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,14 +1,14 @@
 repos:
   - repo: https://github.com/psf/black
-    rev: 23.7.0  # Use the latest stable release
+    rev: 23.7.0  # Use the latest stable version of black
     hooks:
       - id: black
-        args: ["--check"]
-        pass_filenames: false  # Ensures it lints every file, even if staged differently
-        always_run: true       # Always runs regardless of file changes
+        name: Black code formatter
+        args: ["--check"]  # Only check formatting without modifying
 
   - repo: https://github.com/pycqa/flake8
-    rev: 6.1.0  # Use the latest stable release
+    rev: 6.1.0  # Use the latest stable version of flake8
     hooks:
       - id: flake8
-        args: []
\ No newline at end of file
+        name: Flake8 linter
+        args: ["--max-line-length=88", "--ignore=E203,W503"]  # Match black's behavior
\ No newline at end of file
diff --git a/backend/save/main.py b/backend/save/main.py
deleted file mode 100644
index 7d37644..0000000
--- a/backend/save/main.py
+++ /dev/null
@@ -1,554 +0,0 @@
-from fastapi import FastAPI, HTTPException, status, Query
-from fastapi.middleware.cors import CORSMiddleware
-from fastapi.logger import logger
-from pydantic import BaseModel
-from typing import List, Optional
-import logging
-import uuid
-
-logging.basicConfig(level=logging.INFO)
-
-app = FastAPI()
-
-app.add_middleware(
-    CORSMiddleware,
-    allow_origins=["*"],
-    allow_credentials=True,
-    allow_methods=["*"],
-    allow_headers=["*"],
-)
-
-
-class ContactPerson(BaseModel):
-    id: Optional[int] = None  # Make id optional
-    firstname: str
-    lastname: str
-    phone_number: str
-    email: str
-
-
-class Address(BaseModel):
-    id: Optional[int] = None  # Make id optional
-    street: str
-    city: str
-    zipcode: str
-    country: str
-
-
-class Proposal(BaseModel):
-    id: Optional[int]
-    number: str
-
-
-class Dewar(BaseModel):
-    id: Optional[str] = None
-    dewar_name: str
-    tracking_number: Optional[str] = None
-    number_of_pucks: int
-    number_of_samples: int
-    return_address: List[Address]
-    contact_person: List[ContactPerson]
-    status: str
-    ready_date: Optional[str] = None
-    shipping_date: Optional[str] = None
-    arrival_date: Optional[str] = None
-    returning_date: Optional[str] = None
-    qrcode: str
-
-
-class Shipment(BaseModel):
-    shipment_id: Optional[str] = None
-    shipment_name: str
-    shipment_date: str
-    shipment_status: str
-    contact_person: List[ContactPerson]
-    proposal_number: List[Proposal]
-    return_address: List[Address]
-    comments: Optional[str] = None
-    dewars: List[Dewar]
-
-    def get_number_of_dewars(self) -> int:
-        return len(self.dewars)
-
-    def get_shipment_contact_persons(self) -> List[ContactPerson]:
-        return self.contact_person
-
-    def get_shipment_return_addresses(self) -> List[Address]:
-        return self.return_address
-
-    def get_proposals(self) -> List[Proposal]:
-        return self.proposal_number
-
-    class Config:
-        orm_mode = True
-
-
-# Example data for contacts
-contacts = [
-    ContactPerson(
-        id=1,
-        firstname="Frodo",
-        lastname="Baggins",
-        phone_number="123-456-7890",
-        email="frodo.baggins@lotr.com",
-    ),
-    ContactPerson(
-        id=2,
-        firstname="Samwise",
-        lastname="Gamgee",
-        phone_number="987-654-3210",
-        email="samwise.gamgee@lotr.com",
-    ),
-    ContactPerson(
-        id=3,
-        firstname="Aragorn",
-        lastname="Elessar",
-        phone_number="123-333-4444",
-        email="aragorn.elessar@lotr.com",
-    ),
-    ContactPerson(
-        id=4,
-        firstname="Legolas",
-        lastname="Greenleaf",
-        phone_number="555-666-7777",
-        email="legolas.greenleaf@lotr.com",
-    ),
-    ContactPerson(
-        id=5,
-        firstname="Gimli",
-        lastname="Son of Gloin",
-        phone_number="888-999-0000",
-        email="gimli.sonofgloin@lotr.com",
-    ),
-    ContactPerson(
-        id=6,
-        firstname="Gandalf",
-        lastname="The Grey",
-        phone_number="222-333-4444",
-        email="gandalf.thegrey@lotr.com",
-    ),
-    ContactPerson(
-        id=7,
-        firstname="Boromir",
-        lastname="Son of Denethor",
-        phone_number="111-222-3333",
-        email="boromir.sonofdenethor@lotr.com",
-    ),
-    ContactPerson(
-        id=8,
-        firstname="Galadriel",
-        lastname="Lady of Lothlórien",
-        phone_number="444-555-6666",
-        email="galadriel.lothlorien@lotr.com",
-    ),
-    ContactPerson(
-        id=9,
-        firstname="Elrond",
-        lastname="Half-elven",
-        phone_number="777-888-9999",
-        email="elrond.halfelven@lotr.com",
-    ),
-    ContactPerson(
-        id=10,
-        firstname="Eowyn",
-        lastname="Shieldmaiden of Rohan",
-        phone_number="000-111-2222",
-        email="eowyn.rohan@lotr.com",
-    ),
-]
-
-# Example data for return addresses
-return_addresses = [
-    Address(
-        id=1,
-        street="123 Hobbiton St",
-        city="Shire",
-        zipcode="12345",
-        country="Middle Earth",
-    ),
-    Address(
-        id=2,
-        street="456 Rohan Rd",
-        city="Edoras",
-        zipcode="67890",
-        country="Middle Earth",
-    ),
-    Address(
-        id=3,
-        street="789 Greenwood Dr",
-        city="Mirkwood",
-        zipcode="13579",
-        country="Middle Earth",
-    ),
-    Address(
-        id=4,
-        street="321 Gondor Ave",
-        city="Minas Tirith",
-        zipcode="24680",
-        country="Middle Earth",
-    ),
-    Address(
-        id=5,
-        street="654 Falgorn Pass",
-        city="Rivendell",
-        zipcode="11223",
-        country="Middle Earth",
-    ),
-]
-
-# Example data for dewars
-dewars = [
-    Dewar(
-        id="DEWAR001",
-        dewar_name="Dewar One",
-        tracking_number="TRACK123",
-        number_of_pucks=7,
-        number_of_samples=70,
-        return_address=[return_addresses[0]],
-        contact_person=[contacts[0]],
-        status="Ready for Shipping",
-        ready_date="2023-09-30",
-        shipping_date="",
-        arrival_date="",
-        returning_date="",
-        qrcode="QR123DEWAR001",
-    ),
-    Dewar(
-        id="DEWAR002",
-        dewar_name="Dewar Two",
-        tracking_number="TRACK124",
-        number_of_pucks=3,
-        number_of_samples=33,
-        return_address=[return_addresses[1]],
-        contact_person=[contacts[1]],
-        status="In Preparation",
-        ready_date="",
-        shipping_date="",
-        arrival_date="",
-        returning_date="",
-        qrcode="QR123DEWAR002",
-    ),
-    Dewar(
-        id="DEWAR003",
-        dewar_name="Dewar Three",
-        tracking_number="TRACK125",
-        number_of_pucks=7,
-        number_of_samples=72,
-        return_address=[return_addresses[0]],
-        contact_person=[contacts[2]],
-        status="Not Shipped",
-        ready_date="2024.01.01",
-        shipping_date="",
-        arrival_date="",
-        returning_date="",
-        qrcode="QR123DEWAR003",
-    ),
-    Dewar(
-        id="DEWAR004",
-        dewar_name="Dewar Four",
-        tracking_number="",
-        number_of_pucks=7,
-        number_of_samples=70,
-        return_address=[return_addresses[0]],
-        contact_person=[contacts[2]],
-        status="Delayed",
-        ready_date="2024.01.01",
-        shipping_date="2024.01.02",
-        arrival_date="",
-        returning_date="",
-        qrcode="QR123DEWAR003",
-    ),
-    Dewar(
-        id="DEWAR005",
-        dewar_name="Dewar Five",
-        tracking_number="",
-        number_of_pucks=3,
-        number_of_samples=30,
-        return_address=[return_addresses[0]],
-        contact_person=[contacts[2]],
-        status="Returned",
-        ready_date="2024.01.01",
-        shipping_date="2024.01.02",
-        arrival_date="2024.01.03",
-        returning_date="2024.01.07",
-        qrcode="QR123DEWAR003",
-    ),
-]
-
-# Proposal data inspired by the Lord of the Rings
-proposals = [
-    Proposal(id=1, number="PROPOSAL-FRODO-001"),  # "The Quest for the Ring"
-    Proposal(id=2, number="PROPOSAL-GANDALF-002"),  # "The Fellowship's Journey"
-    Proposal(id=3, number="PROPOSAL-ARAGORN-003"),  # "Return of the King"
-    Proposal(id=4, number="PROPOSAL-SAURON-004"),  # "The Dark Lord's Plot"
-    Proposal(id=5, number="PROPOSAL-MORDOR-005"),  # "The Road to Mount Doom"
-]
-
-# Example: Attach specific Dewars by their ids to shipments
-specific_dewar_ids1 = [
-    "DEWAR003"
-]  # The IDs of the Dewars you want to attach to the first shipment
-specific_dewar_ids2 = ["DEWAR001", "DEWAR002"]
-specific_dewar_ids3 = ["DEWAR003", "DEWAR004", "DEWAR005"]
-# The IDs of the Dewars you want to attach to the second shipment
-
-# Find the Dewars with the matching ids
-specific_dewars1 = [dewar for dewar in dewars if dewar.id in specific_dewar_ids1]
-specific_dewars2 = [dewar for dewar in dewars if dewar.id in specific_dewar_ids2]
-specific_dewars3 = [dewar for dewar in dewars if dewar.id in specific_dewar_ids3]
-
-# Define shipments with the selected Dewars
-shipments = [
-    Shipment(
-        shipment_id="SHIPMORDOR",
-        shipment_date="2024-10-10",
-        shipment_name="Shipment from Mordor",
-        shipment_status="Delivered",
-        contact_person=[contacts[1]],
-        proposal_number=[proposals[1]],
-        return_address=[return_addresses[0]],
-        comments="Handle with care",
-        dewars=specific_dewars1,  # Attach specific Dewars for this shipment
-    ),
-    Shipment(
-        shipment_id="SHIPMORDOR2",
-        shipment_date="2024-10-24",
-        shipment_name="Shipment from Mordor",
-        shipment_status="In Transit",
-        contact_person=[contacts[3]],
-        proposal_number=[proposals[2]],
-        return_address=[return_addresses[1]],  # Changed index to a valid one
-        comments="Contains the one ring",
-        dewars=specific_dewars2,  # Attach specific Dewars for this shipment
-    ),
-    Shipment(
-        shipment_id="SHIPMORDOR3",
-        shipment_date="2024-10-28",
-        shipment_name="Shipment from Mordor",
-        shipment_status="In Transit",
-        contact_person=[contacts[4]],
-        proposal_number=[proposals[3]],
-        return_address=[return_addresses[0]],  # Changed index to a valid one
-        comments="Contains the one ring",
-        dewars=specific_dewars3,
-    ),
-]
-
-
-@app.get("/contacts", response_model=List[ContactPerson])
-async def get_contacts():
-    return contacts
-
-
-@app.get("/return_addresses", response_model=List[Address])
-async def get_return_addresses():
-    return return_addresses
-
-
-@app.get("/proposals", response_model=List[Proposal])
-async def get_proposals():
-    return proposals
-
-
-@app.get("/shipments", response_model=List[Shipment])
-async def get_shipments(
-    shipment_id: Optional[str] = Query(
-        None, description="ID of the specific shipment to retrieve"
-    )
-):
-    if shipment_id:
-        shipment = next((sh for sh in shipments if sh.shipment_id == shipment_id), None)
-        if not shipment:
-            raise HTTPException(status_code=404, detail="Shipment not found")
-        return [shipment]
-    return shipments
-
-
-@app.delete("/shipments/{shipment_id}", status_code=status.HTTP_204_NO_CONTENT)
-async def delete_shipment(shipment_id: str):
-    global shipments  # Use global variable to access the shipments list
-    shipments = [
-        shipment for shipment in shipments if shipment.shipment_id != shipment_id
-    ]
-
-
-@app.post("/shipments/{shipment_id}/add_dewar", response_model=Shipment)
-async def add_dewar_to_shipment(shipment_id: str, dewar_id: str):
-    # Find the shipment by id
-    shipment = next((sh for sh in shipments if sh.shipment_id == shipment_id), None)
-    if not shipment:
-        raise HTTPException(status_code=404, detail="Shipment not found")
-
-    # Find the dewar by id
-    dewar = next((dw for dw in dewars if dw.id == dewar_id), None)
-    if not dewar:
-        raise HTTPException(status_code=404, detail="Dewar not found")
-
-    # Add the dewar to the shipment
-    if dewar not in shipment.dewars:
-        shipment.dewars.append(dewar)
-
-    return shipment
-
-
-@app.put("/shipments/{shipment_id}", response_model=Shipment)
-async def update_shipment(shipment_id: str, updated_shipment: Shipment):
-    global shipments
-    shipment = next((sh for sh in shipments if sh.shipment_id == shipment_id), None)
-
-    if not shipment:
-        raise HTTPException(status_code=404, detail="Shipment not found")
-
-    logger.info(f"Updating shipment: {shipment_id}")
-    logger.info(f"Updated shipment data: {updated_shipment}")
-
-    # Create a dictionary of existing dewars for fast lookup
-    existing_dewar_dict = {dewar.id: dewar for dewar in shipment.dewars}
-
-    # Update or add dewars from the updated shipment data
-    for updated_dewar in updated_shipment.dewars:
-        if updated_dewar.id in existing_dewar_dict:
-            # Update existing dewar
-            existing_dewar_dict[updated_dewar.id].dewar_name = updated_dewar.dewar_name
-            existing_dewar_dict[updated_dewar.id].tracking_number = (
-                updated_dewar.tracking_number
-            )
-            existing_dewar_dict[updated_dewar.id].number_of_pucks = (
-                updated_dewar.number_of_pucks
-            )
-            existing_dewar_dict[updated_dewar.id].number_of_samples = (
-                updated_dewar.number_of_samples
-            )
-            existing_dewar_dict[updated_dewar.id].return_address = (
-                updated_dewar.return_address
-            )
-            existing_dewar_dict[updated_dewar.id].contact_person = (
-                updated_dewar.contact_person
-            )
-            existing_dewar_dict[updated_dewar.id].status = updated_dewar.status
-            existing_dewar_dict[updated_dewar.id].ready_date = updated_dewar.ready_date
-            existing_dewar_dict[updated_dewar.id].shipping_date = (
-                updated_dewar.shipping_date
-            )
-            existing_dewar_dict[updated_dewar.id].arrival_date = (
-                updated_dewar.arrival_date
-            )
-            existing_dewar_dict[updated_dewar.id].returning_date = (
-                updated_dewar.returning_date
-            )
-            existing_dewar_dict[updated_dewar.id].qrcode = updated_dewar.qrcode
-        else:
-            # Add new dewar
-            shipment.dewars.append(updated_dewar)
-
-    # Update the shipment's fields
-    shipment.shipment_name = updated_shipment.shipment_name
-    shipment.shipment_date = updated_shipment.shipment_date
-    shipment.shipment_status = updated_shipment.shipment_status
-    shipment.contact_person = updated_shipment.contact_person
-    shipment.proposal_number = updated_shipment.proposal_number
-    shipment.return_address = updated_shipment.return_address
-    shipment.comments = updated_shipment.comments
-
-    logger.info(f"Shipment after update: {shipment}")
-
-    return shipment
-
-
-@app.get("/dewars", response_model=List[Dewar])
-async def get_dewars():
-    return dewars
-
-
-@app.post("/dewars", response_model=Dewar, status_code=status.HTTP_201_CREATED)
-async def create_dewar(dewar: Dewar) -> Dewar:
-    dewar_id = f"DEWAR-{uuid.uuid4().hex[:8].upper()}"  # Generates a unique dewar ID
-    dewar.id = dewar_id  # Set the generated ID on the dewar object
-
-    dewars.append(dewar)  # Add the modified dewar object to the list
-
-    return dewar  # Return the newly created dewar
-
-
-@app.delete("/shipments/{shipment_id}/remove_dewar/{dewar_id}", response_model=Shipment)
-async def remove_dewar_from_shipment(shipment_id: str, dewar_id: str):
-    """Remove a dewar from a shipment."""
-    # Find the shipment by ID
-    shipment = next((sh for sh in shipments if sh.shipment_id == shipment_id), None)
-    if not shipment:
-        raise HTTPException(status_code=404, detail="Shipment not found")
-
-    # Remove the dewar from the shipment
-    shipment.dewars = [dw for dw in shipment.dewars if dw.id != dewar_id]
-
-    return shipment
-
-
-@app.get("/shipment_contact_persons")
-async def get_shipment_contact_persons():
-    return [
-        {
-            "shipment_id": shipment.shipment_id,
-            "contact_person": shipment.get_shipment_contact_persons(),
-        }
-        for shipment in shipments
-    ]
-
-
-@app.post("/shipments", response_model=Shipment, status_code=status.HTTP_201_CREATED)
-async def create_shipment(shipment: Shipment):
-    # Automatically generate a shipment ID
-    shipment_id = (
-        f"SHIP-{uuid.uuid4().hex[:8].upper()}"  # Generates a unique shipment ID
-    )
-    shipment.shipment_id = shipment_id  # Set the generated ID
-
-    # Append the shipment to the list
-    shipments.append(shipment)
-    return shipment
-
-
-# Creation of a new contact
-@app.post(
-    "/contacts", response_model=ContactPerson, status_code=status.HTTP_201_CREATED
-)
-async def create_contact(contact: ContactPerson):
-    # Check for duplicate contact by email (or other unique fields)
-    if any(c.email == contact.email for c in contacts):
-        raise HTTPException(
-            status_code=status.HTTP_400_BAD_REQUEST,
-            detail="This contact already exists.",
-        )
-
-    # Find the next available id
-    if contacts:
-        max_id = max(c.id for c in contacts)
-        contact.id = max_id + 1 if contact.id is None else contact.id
-    else:
-        contact.id = 1 if contact.id is None else contact.id
-
-    contacts.append(contact)
-    return contact
-
-
-# Creation of a return address
-@app.post(
-    "/return_addresses", response_model=Address, status_code=status.HTTP_201_CREATED
-)
-async def create_return_address(address: Address):
-    # Check for duplicate address by city
-    if any(a.city == address.city for a in return_addresses):
-        raise HTTPException(
-            status_code=status.HTTP_400_BAD_REQUEST,
-            detail="Address in this city already exists.",
-        )
-
-    # Find the next available id
-    if return_addresses:
-        max_id = max(a.id for a in return_addresses)
-        address.id = max_id + 1 if address.id is None else address.id
-    else:
-        address.id = 1 if address.id is None else address.id
-
-    return_addresses.append(address)
-    return address
-- 
GitLab