fb / app /models /facebook_ad.py
rastof9's picture
hey
2a9b5c4
from app import db
from datetime import datetime
import uuid
import json
class FacebookAd(db.Model):
"""Model for storing Facebook ads data."""
__tablename__ = 'facebook_ads'
id = db.Column(db.Integer, primary_key=True)
ad_id = db.Column(db.String(255), index=True, unique=True)
advertiser = db.Column(db.String(255), index=True)
advertiser_id = db.Column(db.String(255), index=True, nullable=True)
content = db.Column(db.Text)
search_query = db.Column(db.String(255), index=True, nullable=True)
# Store JSON data as text fields
image_urls_json = db.Column(db.Text, nullable=True)
links_json = db.Column(db.Text, nullable=True)
metadata_json = db.Column(db.Text, nullable=True)
topics_json = db.Column(db.Text, nullable=True)
entities_json = db.Column(db.Text, nullable=True)
# Analysis results
sentiment = db.Column(db.Float, nullable=True)
# Timestamps
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# User relationship
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True)
def get_image_urls(self):
"""Get image URLs as a list."""
if not self.image_urls_json:
return []
try:
return json.loads(self.image_urls_json)
except:
return []
def set_image_urls(self, value):
"""Set image URLs from a list."""
if value is None:
self.image_urls_json = None
else:
self.image_urls_json = json.dumps(value)
def get_links(self):
"""Get links as a list."""
if not self.links_json:
return []
try:
return json.loads(self.links_json)
except:
return []
def set_links(self, value):
"""Set links from a list."""
if value is None:
self.links_json = None
else:
self.links_json = json.dumps(value)
def get_metadata(self):
"""Get metadata as a dictionary."""
if not self.metadata_json:
return {}
try:
return json.loads(self.metadata_json)
except:
return {}
def set_metadata(self, value):
"""Set metadata from a dictionary."""
if value is None:
self.metadata_json = None
else:
self.metadata_json = json.dumps(value)
def get_topics(self):
"""Get topics as a list."""
if not self.topics_json:
return []
try:
return json.loads(self.topics_json)
except:
return []
def set_topics(self, value):
"""Set topics from a list."""
if value is None:
self.topics_json = None
else:
self.topics_json = json.dumps(value)
def get_entities(self):
"""Get entities as a list of dictionaries."""
if not self.entities_json:
return []
try:
return json.loads(self.entities_json)
except:
return []
def set_entities(self, value):
"""Set entities from a list of dictionaries."""
if value is None:
self.entities_json = None
else:
self.entities_json = json.dumps(value)
@classmethod
def from_scraper_data(cls, data, user_id=None):
"""Create a FacebookAd instance from scraper data."""
# Generate a unique ID if not provided
ad_id = data.get('ad_id', str(uuid.uuid4()))
ad = cls(
ad_id=ad_id,
advertiser=data.get('advertiser', ''),
advertiser_id=data.get('advertiser_id'),
content=data.get('content', ''),
search_query=data.get('search_query'),
user_id=user_id
)
# Set JSON fields
ad.set_image_urls(data.get('image_urls', []))
ad.set_links(data.get('links', []))
ad.set_metadata(data.get('metadata', {}))
return ad
def to_dict(self):
"""Convert the ad to a dictionary for API responses."""
return {
'id': self.id,
'ad_id': self.ad_id,
'advertiser': self.advertiser,
'advertiser_id': self.advertiser_id,
'content': self.content,
'search_query': self.search_query,
'image_urls': self.get_image_urls(),
'links': self.get_links(),
'sentiment': self.sentiment,
'topics': self.get_topics(),
'created_at': self.created_at.isoformat() if self.created_at else None,
'updated_at': self.updated_at.isoformat() if self.updated_at else None
}