 db5d631b0d
			
		
	
	
		db5d631b0d
		
	
	
	
	
		
			
			* Created a newsletters table and added insertion logic during newsletter send. * Added a /newsletters route to display a list of sent newsletters. * Implemented a /newsletter/<int:newsletter_id> route for detailed view. * Developed new templates with navigation, including unsubscribe links. * Enhanced front-end styling and layout for newsletter pages.
		
			
				
	
	
		
			66 lines
		
	
	
		
			No EOL
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			No EOL
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| import psycopg2
 | |
| from psycopg2 import IntegrityError
 | |
| from dotenv import load_dotenv
 | |
| 
 | |
| load_dotenv()
 | |
| 
 | |
| def get_connection():
 | |
|     """Return a database connection."""
 | |
|     return psycopg2.connect(
 | |
|         host=os.getenv("PG_HOST"),
 | |
|         port=os.getenv("PG_PORT"),
 | |
|         dbname=os.getenv("PG_DATABASE"),
 | |
|         user=os.getenv("PG_USER"),
 | |
|         password=os.getenv("PG_PASSWORD"),
 | |
|         connect_timeout=10
 | |
|     )
 | |
| 
 | |
| def init_db():
 | |
|     conn = get_connection()
 | |
|     cursor = conn.cursor()
 | |
|     cursor.execute("""
 | |
|         CREATE TABLE IF NOT EXISTS subscribers (
 | |
|             id SERIAL PRIMARY KEY,
 | |
|             email TEXT UNIQUE NOT NULL
 | |
|         )
 | |
|     """)
 | |
|     
 | |
|     cursor.execute("""
 | |
|         CREATE TABLE IF NOT EXISTS newsletters(
 | |
|             id SERIAL PRIMARY KEY,
 | |
|             subject TEXT NOT NULL,
 | |
|             body TEXT NOT NULL,
 | |
|             sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
 | |
|         )
 | |
|     """)
 | |
|         
 | |
|     conn.commit()
 | |
|     cursor.close()
 | |
|     conn.close()
 | |
| 
 | |
| def add_email(email):
 | |
|     try:
 | |
|         with get_connection() as conn:
 | |
|             with conn.cursor() as cursor:
 | |
|                 cursor.execute("INSERT INTO subscribers (email) VALUES (%s)", (email,))
 | |
|                 conn.commit()
 | |
|         return True
 | |
|     except IntegrityError:
 | |
|         return False
 | |
|     except psycopg2.OperationalError as e:
 | |
|         print(f"Error: {e}")
 | |
|         return False
 | |
| 
 | |
| def remove_email(email):
 | |
|     try:
 | |
|         with get_connection() as conn:
 | |
|             with conn.cursor() as cursor:
 | |
|                 cursor.execute("DELETE FROM subscribers WHERE email = %s", (email,))
 | |
|                 conn.commit()
 | |
|                 if cursor.rowcount > 0:
 | |
|                     return True
 | |
|                 return False
 | |
|     except Exception as e:
 | |
|         print(f"Error removing email: {e}")
 | |
|         return False |