import hashlib import json import tkinter as tk from app.models.view_models import SignupModel from app.http import request_builder from app.models.http_models import SignupRequestModel def hash_password(password): sha256_hash = hashlib.sha256() sha256_hash.update(password.encode('utf-8')) hashed_output = sha256_hash.hexdigest() return hashed_output class SignupView(tk.Frame): def __init__(self, master=None): super().__init__(master) self.form_frame = None self.define_http_params() self.create_widgets() def define_http_params(self): self.url = "http://localhost:8000/auth/sign_up" self.headers = {"Content-Type": "application/json"} self.method = "POST" self.params = None def create_widgets(self): # Create a frame to hold the entry fields and labels self.form_frame = tk.Frame(self) # Error label self.error_var = tk.StringVar() # Variable to store error message self.error_label = tk.Label(self.form_frame, textvariable=self.error_var, fg="red") self.error_label.grid(row=0, column=0, pady=5, columnspan=2) # Span columns for full width # Left frame for labels label_frame = tk.Frame(self.form_frame) label_frame.grid(row=1, column=0, pady=5, padx=5, sticky="w") # Right frame for entry widgets entry_frame = tk.Frame(self.form_frame) entry_frame.grid(row=1, column=1, pady=5, padx=5, sticky="e") # Username Label and Entry self.username_label = tk.Label(label_frame, text="Username:") self.username_label.grid(row=0, column=0, pady=5, sticky="w") self.username_entry = tk.Entry(entry_frame) self.username_entry.grid(row=0, column=0, pady=5, sticky="e") # Email Label and Entry self.email_label = tk.Label(label_frame, text="Email:") self.email_label.grid(row=1, column=0, pady=5, sticky="w") self.email_entry = tk.Entry(entry_frame) self.email_entry.grid(row=1, column=0, pady=5, sticky="e") # Password Label and Entry self.password_label = tk.Label(label_frame, text="Password:") self.password_label.grid(row=2, column=0, pady=5, sticky="w") self.password_entry = tk.Entry(entry_frame, show="*") self.password_entry.grid(row=2, column=0, pady=5, sticky="e") # Signup Button self.signup_button = tk.Button(self.form_frame, text="Sign up", command=self.on_signup) self.signup_button.grid(row=2, column=0, pady=10) # No columnspan for the signup button # Return to Main Menu Button self.return_button = tk.Button(self.form_frame, text="Return to Main Menu", command=self.return_to_initial_view) self.return_button.grid(row=2, column=1, pady=10, padx=5) # Place next to the signup button self.form_frame.pack() def return_to_initial_view(self): self.master.change_to_initial_view() def on_signup(self): # Retrieve values from entry fields username = self.username_entry.get() email = self.email_entry.get() password = self.password_entry.get() model = SignupModel(username=username, email=email, password=password) validation, errors = model.validate() if not validation: self.error_var.set(errors[0]) self.error_label.grid(row=0, column=0, pady=5) request_builder.set_url(self.url) request_builder.set_headers(self.headers) request_builder.set_params(self.params) request_builder.set_body( SignupRequestModel( username=username, email=email, password=hash_password(password) ).__dict__) request_builder.set_method(self.method) result = request_builder.build().make_request() if result.status_code == 200: self.master.change_to_initial_view() else: json_data = json.loads(result.text) detail_value = json_data.get('detail') self.error_var.set(detail_value) self.error_label.grid(row=0, column=0, pady=5)