Aktywne Wpisy

WielkiNos +302
Problem z psiarzami jest taki, że sami śpiąc z psami i jedząc z nimi tą samą łyżką na co dzień przywykają do syfu. Brud i smród przestaje ich ruszać.
Psiarz nie widzi więc nic dziwnego w tym, że pies obsika drzwi do sklepu i potem ktoś musi to myć albo podejdzie na parkingu do samochodu czy roweru i naszczy na koła, za których umycie ktoś zapłacił lub sam mył. Dla psiarzy smród
Psiarz nie widzi więc nic dziwnego w tym, że pies obsika drzwi do sklepu i potem ktoś musi to myć albo podejdzie na parkingu do samochodu czy roweru i naszczy na koła, za których umycie ktoś zapłacił lub sam mył. Dla psiarzy smród
źródło: temp_file2236887811905271414
Pobierz
damiz74 +557




Ma to sens pod kątem budowy? Wiadomo, nic tu napisane za bardzo nie jest ale robię mały refactor kodu z całkowicie odmiennym podejściem gdzie sama funkcjonalność jest ale wymaga dobrego wzoru.
Docelowo widzę to tak, że user z listy wybiera jakąś opcję, tworzy sie obiekt klasy Document, w zależnosci co chce tak naprawdę zrobić są używane określone metody, dostaje pytanie czy chce wygenerować docx, odpowiada tak więc mamy orange.generate() czy tam czy chce wysłać maila no to orange.sendemail(). I wiadomo ja kwybierze Orange no to są dodawane poszczególne replacementy jak w tym przykładzie, zapewne można to zrobić jakąś jedną komendą zamiast powtarzać .addreplacement (jak wiecie jak to dajcie znać) ale nie jest to jakoś bardzo istotne na tą chwilę.
import os
from urllib.parse import quote
import docx
from python_docx_replace import docx_replace
import docx2pdf
class Document:
def __init__(self, help_name, file_name, template_file, directory_path):
self.help_name = help_name
self.file_name = file_name
self.template_file = template_file
self.directory_path = directory_path
self.replacements = {}
self.wp_req = False
self.pelnomocnictwo_req = False
self.pdf_req = False
def add_replacement(self, key, value):
self.replacements[key] = value
def generate(self):
doc = docx.Document(self.template_file)
docx_replace(doc, **self.replacements)
output_path = "wypelnione.docx"
doc.save(output_path)
if self.pdf_req == True:
docx2pdf.convert(output_path)
else:
pass
def save(self):
# Logic to save the generated document to the specified directory.
pass
def send_email(self, initial_name: str, toaddrs: str, subject: str, msg_content: str, attachment_list: list[str]):
pass
wnioski_number = 7
orange = Document("Zarząd Drogowy", "PR do ZD - Wniosek o uzgodnienie lokalizacji ", "template.docx", os.path.join(f"{wnioski_number}. Wnioski", "ZD"))
orange.add_replacement("today_date", "2023-10-23")
orange.add_replacement("title", "Budowa drogi")
orange.add_replacement("city", "Kraków")
orange.add_replacement("street", "Sławkowska")
orange.wp_req = True
orange.pelnomocnictwo_req = True
orange.generate()
to samo co wyżej na https://pastebin.com/MdUHeM6k
Jak nikt tego potem nie modyfikuje to zawsze używam
https://handlebarsjs.com/
I template jest w HTML i wrzucam wszystkie dane jako slownik do renderowania.
https://refactoring.guru/pl/design-patterns/creational-patterns
Dobra rozrywka może być próba przełożenia tych wzorców na swoje potrzeby bo że tak powiem tylko ty widzisz szerszy kontekst swojego programu.
Co do samej klasy to zmieniłbym tylko nazwę metody z add_replacements na samo replace
Co by się takie stało jakby
def generate(self):przyjmowało np.template_file?Jak masz tyle argumentów w init to robisz to źle.
send_emailtotalnie z dupy w tej klasie.orange.wp_req = Trueorange.pelnomocnictwo_req = True
Totalnie nic nie mówi. Daj to do klasy z odpowiednimy metodami.
Zamiast robić:
orange.add_replacement("today_date", "2023-10-23")Czemu po prostu nie dodasz słownika?
@szubke panie zaczynam dopiero, robię to póki co hobbistycznie więc takie uwagi niewiele wnoszą...
@FredOnizuka yep, wywalę to
@mrq super, poczytam
@TDDwBashu myślałem że w init powinno być jak najwięcej wspólnych elementów a najlepiej wszystkie - wydawało mi się to logiczne ale wychodzi na to
jednak tego nie rozumiem, o co dokładnie Ci chodzi? możesz mi jakiś snipp kodu wkleić?
Im mniej w init tym lepiej. Pomyśl z perspektywy testowania.
Chcesz sobie przetestować
add_replacement. Na prawdę chcesz ładować te wszystkie argumenty do klasy, aby ją zainicjować i przetestować metode?Nie jest czytelniej, bo masz
Ok, rozumiem.
i
To, że klasa BaseTemplate jest "pusta" jest OK. Poczytaj o interface - https://realpython.com/python-interface/. Co prawda jest to termin bardziej z Javy, ale Python to dalej język obiektowy.
Ogólnie traktuj BaseTemplate jako wzorzec/templatke dla klas dziedziczących.
Nie musisz na każdą logikę tworzyć klasy.
Jak
send_emailbędzie po prostu metodą bez klasy - to po prostu będzie spoko. Obiekt jak nazwa wskazuje opisuje coś. Obiekt