diff --git a/scripts/generate_fake_core_data.py b/scripts/generate_fake_core_data.py new file mode 100644 index 0000000..7914051 --- /dev/null +++ b/scripts/generate_fake_core_data.py @@ -0,0 +1,114 @@ +import os +import django +import random +from typing import List +from django.utils import timezone +from faker import Faker +from factory.django import DjangoModelFactory +from factory import SubFactory, LazyAttribute, Iterator +from core.models import ActivityLog, NewsAndEvents, Session, Semester, SEMESTER, POST + +# Set up Django environment +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") +django.setup() + +fake = Faker() + +class NewsAndEventsFactory(DjangoModelFactory): + """ + Factory for creating NewsAndEvents instances. + + Attributes: + title (str): The generated title for the news or event. + summary (str): The generated summary. + posted_as (str): The type of the post, either 'News' or 'Event'. + updated_date (datetime): The generated date and time of update. + upload_time (datetime): The generated date and time of upload. + """ + + class Meta: + model = NewsAndEvents + + title: str = LazyAttribute(lambda x: fake.sentence(nb_words=4)) + summary: str = LazyAttribute(lambda x: fake.paragraph(nb_sentences=3)) + posted_as: str = fake.random_element(elements=[choice[0] for choice in POST]) + updated_date: timezone.datetime = fake.date_time_this_year() + upload_time: timezone.datetime = fake.date_time_this_year() + +class SessionFactory(DjangoModelFactory): + """ + Factory for creating Session instances. + + Attributes: + session (str): The generated session name. + is_current_session (bool): Flag indicating if the session is current. + next_session_begins (date): The date when the next session begins. + """ + + class Meta: + model = Session + + session: str = LazyAttribute(lambda x: fake.sentence(nb_words=2)) + is_current_session: bool = fake.boolean(chance_of_getting_true=50) + next_session_begins = LazyAttribute(lambda x: fake.future_datetime()) + + +class SemesterFactory(DjangoModelFactory): + """ + Factory for creating Semester instances. + + Attributes: + semester (str): The generated semester name. + is_current_semester (bool): Flag indicating if the semester is current. + session (Session): The associated session. + next_semester_begins (date): The date when the next semester begins. + """ + + class Meta: + model = Semester + + semester: str = fake.random_element(elements=[choice[0] for choice in SEMESTER]) + is_current_semester: bool = fake.boolean(chance_of_getting_true=50) + session: Session = SubFactory(SessionFactory) + next_semester_begins = LazyAttribute(lambda x: fake.future_datetime()) + +class ActivityLogFactory(DjangoModelFactory): + """ + Factory for creating ActivityLog instances. + + Attributes: + message (str): The generated log message. + """ + + class Meta: + model = ActivityLog + + message: str = LazyAttribute(lambda x: fake.text()) + + +def generate_fake_core_data(num_news_and_events: int, num_sessions: int, num_semesters: int, num_activity_logs: int) -> None: + """ + Generate fake data for core models: NewsAndEvents, Session, Semester, and ActivityLog. + + Args: + num_news_and_events (int): Number of NewsAndEvents instances to generate. + num_sessions (int): Number of Session instances to generate. + num_semesters (int): Number of Semester instances to generate. + num_activity_logs (int): Number of ActivityLog instances to generate. + """ + # Generate fake NewsAndEvents instances + news_and_events: List[NewsAndEvents] = NewsAndEventsFactory.create_batch(num_news_and_events) + print(f"Generated {num_news_and_events} NewsAndEvents instances.") + + # Generate fake Session instances + sessions: List[Session] = SessionFactory.create_batch(num_sessions) + print(f"Generated {num_sessions} Session instances.") + + # Generate fake Semester instances + semesters: List[Semester] = SemesterFactory.create_batch(num_semesters) + print(f"Generated {num_semesters} Semester instances.") + + # Generate fake ActivityLog instances + activity_logs: List[ActivityLog] = ActivityLogFactory.create_batch(num_activity_logs) + print(f"Generated {num_activity_logs} ActivityLog instances.") +