from typing import Type from factory.django import DjangoModelFactory from factory import SubFactory, LazyAttribute, Iterator from faker import Faker from course.models import ( Program, Course, CourseAllocation, Upload, UploadVideo, CourseOffer, SEMESTER, ) from accounts.models import User, DepartmentHead from core.models import Session from .generate_fake_accounts_data import UserFactory, ProgramFactory from .generate_fake_core_data import SessionFactory fake = Faker() class DepartmentHeadFactory(DjangoModelFactory): class Meta: model = DepartmentHead user = SubFactory(UserFactory) department = SubFactory(ProgramFactory) class ProgramFactory(DjangoModelFactory): """ Factory for creating Program instances. Attributes: title (str): The generated title for the program. summary (str): The generated summary for the program. """ class Meta: model = Program title: str = LazyAttribute(lambda x: fake.sentence(nb_words=3)) summary: str = LazyAttribute(lambda x: fake.paragraph()) class CourseFactory(DjangoModelFactory): """ Factory for creating Course instances. Attributes: slug (str): The generated slug for the course. title (str): The generated title for the course. code (str): The generated code for the course. credit (int): The generated credit for the course. summary (str): The generated summary for the course. program (Program): The associated program for the course. level (str): The generated level for the course. year (int): The generated year for the course. semester (str): The generated semester for the course. is_elective (bool): The flag indicating if the course is elective. """ class Meta: model = Course slug: str = LazyAttribute(lambda x: fake.slug()) title: str = LazyAttribute(lambda x: fake.sentence(nb_words=4)) code: str = LazyAttribute(lambda x: fake.unique.word()) credit: int = LazyAttribute(lambda x: fake.random_int(min=1, max=6)) summary: str = LazyAttribute(lambda x: fake.paragraph()) program: Type[Program] = SubFactory(ProgramFactory) level: str = Iterator(["Beginner", "Intermediate", "Advanced"]) year: int = LazyAttribute(lambda x: fake.random_int(min=1, max=4)) semester: str = Iterator([choice[0] for choice in SEMESTER]) is_elective: bool = LazyAttribute(lambda x: fake.boolean()) class CourseAllocationFactory(DjangoModelFactory): """ Factory for creating CourseAllocation instances. Attributes: lecturer (User): The associated lecturer for the course allocation. session (Session): The associated session for the course allocation. """ class Meta: model = CourseAllocation lecturer: Type[User] = SubFactory(UserFactory, is_lecturer=True) session: Type[Session] = SubFactory(SessionFactory) class UploadFactory(DjangoModelFactory): """ Factory for creating Upload instances. Attributes: title (str): The generated title for the upload. course (Course): The associated course for the upload. file (str): The generated file path for the upload. updated_date (datetime): The generated updated date for the upload. upload_time (datetime): The generated upload time for the upload. """ class Meta: model = Upload title: str = LazyAttribute(lambda x: fake.sentence(nb_words=3)) course = SubFactory(CourseFactory) # Adjust 'yourapp' with your actual app name file: str = LazyAttribute(lambda x: fake.file_path(extension="pdf")) updated_date = fake.date_time_this_year() upload_time = fake.date_time_this_year() class UploadVideoFactory(DjangoModelFactory): """ Factory for creating UploadVideo instances. Attributes: title (str): The generated title for the video upload. slug (str): The generated slug for the video upload. course (Course): The associated course for the video upload. video (str): The generated video path for the video upload. summary (str): The generated summary for the video upload. timestamp (datetime): The generated timestamp for the video upload. """ class Meta: model = UploadVideo title: str = LazyAttribute(lambda x: fake.sentence(nb_words=3)) slug: str = LazyAttribute(lambda x: fake.slug()) course = SubFactory(CourseFactory) # Adjust 'yourapp' with your actual app name video: str = LazyAttribute(lambda x: fake.file_path(extension="mp4")) summary: str = LazyAttribute(lambda x: fake.paragraph()) timestamp = fake.date_time_this_year() class CourseOfferFactory(DjangoModelFactory): """ Factory for creating CourseOffer instances. Attributes: dep_head (DepartmentHead): The associated department head for the course offer. """ class Meta: model = CourseOffer dep_head = SubFactory(DepartmentHeadFactory) def generate_fake_course_data( num_programs: int, num_courses: int, num_course_allocations: int, num_uploads: int, num_upload_videos: int, num_course_offers: int, ) -> None: """Generate fake data using various factories. Args: num_programs (int): Number of fake programs to create. num_courses (int): Number of fake courses to create. num_course_allocations (int): Number of fake course allocations to create. num_uploads (int): Number of fake uploads to create. num_upload_videos (int): Number of fake upload videos to create. num_course_offers (int): Number of fake course offers to create. """ # Generate fake programs programs = ProgramFactory.create_batch(num_programs) print(f"Created {len(programs)} programs.") # Generate fake courses courses = CourseFactory.create_batch(num_courses) print(f"Created {len(courses)} courses.") # Generate fake course allocations course_allocations = CourseAllocationFactory.create_batch(num_course_allocations) print(f"Created {len(course_allocations)} course allocations.") # Generate fake uploads uploads = UploadFactory.create_batch(num_uploads) print(f"Created {len(uploads)} uploads.") # Generate fake upload videos upload_videos = UploadVideoFactory.create_batch(num_upload_videos) print(f"Created {len(upload_videos)} upload videos.") # Generate fake course offers course_offers = CourseOfferFactory.create_batch(num_course_offers) print(f"Created {len(course_offers)} course offers.") generate_fake_course_data(10, 10, 10, 10, 10, 10)