+ {post.title} +
+ + {/* Author and Tags Bar */} +{post.excerpt}
+diff --git a/gnx-react/app/case-study/[slug]/page.tsx b/gnx-react/app/case-study/[slug]/page.tsx index 5fc60eef..7560d760 100644 --- a/gnx-react/app/case-study/[slug]/page.tsx +++ b/gnx-react/app/case-study/[slug]/page.tsx @@ -6,14 +6,22 @@ import Footer from "@/components/shared/layout/footer/Footer"; import CaseStudyScrollProgressButton from "@/components/pages/case-study/CaseStudyScrollProgressButton"; import CaseStudyInitAnimations from "@/components/pages/case-study/CaseStudyInitAnimations"; -const page = () => { +interface PageProps { + params: Promise<{ + slug: string; + }>; +} + +const page = async ({ params }: PageProps) => { + const { slug } = await params; + return (
Enterprise software architecture is evolving rapidly. In this comprehensive guide, we explore the latest trends and best practices that are shaping the future of enterprise systems.
+ +The shift towards microservices architecture has revolutionized how we build enterprise applications. By breaking down monolithic applications into smaller, independent services, organizations can achieve greater flexibility, scalability, and maintainability.
+ +Cloud-native architecture is becoming the standard for modern enterprise applications. This approach leverages cloud computing capabilities to build and run scalable applications in dynamic environments.
+ +API-first development ensures that applications are built with integration in mind from the start. This approach facilitates better communication between services and makes it easier to integrate with third-party systems.
+ +The future of enterprise software architecture lies in flexibility, scalability, and cloud-native approaches. Organizations that embrace these principles will be better positioned to adapt to changing business needs.
+ ''', + 'excerpt': 'Exploring the latest trends in enterprise software architecture, from microservices to cloud-native development.', + 'author': authors['Sarah Johnson'], + 'category': categories['enterprise-software'], + 'tags': ['Enterprise', 'Architecture', 'Microservices', 'Cloud'], + 'thumbnail_url': '/images/blog/one.png', + 'featured': True, + 'reading_time': 8, + 'days_ago': 5 + }, + { + 'title': 'Digital Transformation Strategies for Large Enterprises', + 'content': ''' +Digital transformation is more than just adopting new technologies—it's about fundamentally changing how your organization operates and delivers value to customers.
+ +A successful digital transformation strategy must address technology, processes, and culture simultaneously. Organizations that focus on only one aspect often struggle to achieve their goals.
+ +Legacy systems can hold organizations back. Modernizing your technology stack is often the first step in digital transformation, enabling new capabilities and improving efficiency.
+ +Common challenges include resistance to change, budget constraints, and technical debt. Success requires strong leadership commitment and clear communication throughout the organization.
+ ''', + 'excerpt': 'A comprehensive guide to digital transformation strategies tailored for large enterprise organizations.', + 'author': authors['David Thompson'], + 'category': categories['digital-transformation'], + 'tags': ['Digital Transformation', 'Enterprise', 'Best Practices'], + 'thumbnail_url': '/images/blog/two.png', + 'featured': True, + 'reading_time': 10, + 'days_ago': 8 + }, + { + 'title': 'API-First Approach to System Integration', + 'content': ''' +API-first development is a strategy where APIs are treated as first-class citizens in the development process. Instead of being an afterthought, APIs are designed and built before any other code.
+ +This approach offers numerous advantages including better developer experience, faster time to market, and improved system integration capabilities.
+ +RESTful APIs follow specific architectural principles that make them scalable, maintainable, and easy to understand. Key principles include statelessness, resource-based URLs, and standard HTTP methods.
+ +While REST has been the standard for many years, GraphQL offers an alternative approach that can be more efficient for certain use cases. Understanding when to use each is crucial for effective API design.
+ ''', + 'excerpt': 'Learn how an API-first approach can streamline system integration and improve your software architecture.', + 'author': authors['Emily Rodriguez'], + 'category': categories['system-integration'], + 'tags': ['API', 'REST', 'GraphQL', 'Integration'], + 'thumbnail_url': '/images/blog/three.png', + 'reading_time': 7, + 'days_ago': 12 + }, + { + 'title': 'Cloud Migration Best Practices for Enterprise', + 'content': ''' +Cloud migration is a complex process that requires careful planning and execution. A well-thought-out strategy can mean the difference between success and costly setbacks.
+ +Before migrating to the cloud, it's essential to thoroughly understand your current infrastructure, dependencies, and workload requirements.
+ +AWS, Azure, and Google Cloud each offer unique strengths. The right choice depends on your specific requirements, existing technology stack, and business objectives.
+ +Security should be a top priority during cloud migration. Implement encryption, access controls, and monitoring from day one.
+ +Migration is just the beginning. Continuous optimization of costs, performance, and security is essential for maximizing cloud benefits.
+ ''', + 'excerpt': 'Essential best practices and strategies for successfully migrating enterprise applications to the cloud.', + 'author': authors['Michael Chen'], + 'category': categories['cloud-solutions'], + 'tags': ['Cloud', 'AWS', 'Azure', 'Migration'], + 'thumbnail_url': '/images/blog/four.png', + 'featured': False, + 'reading_time': 9, + 'days_ago': 15 + }, + { + 'title': 'Enterprise Security in the Digital Age', + 'content': ''' +As enterprises embrace digital transformation, security challenges have become more complex. Organizations must adopt a comprehensive approach to protect their assets and data.
+ +Zero Trust is a security model that assumes no user or system should be trusted by default, even if they're inside the network perimeter.
+ +MFA is no longer optional for enterprise security. Implementing strong authentication mechanisms is critical for protecting sensitive data and systems.
+ +Technology alone cannot protect an organization. Security awareness training and a culture of security consciousness are equally important.
+ +Understanding and adhering to regulations like GDPR, HIPAA, and SOC 2 is essential for enterprise organizations operating in regulated industries.
+ ''', + 'excerpt': 'Understanding modern security challenges and implementing robust security measures for enterprise environments.', + 'author': authors['Sarah Johnson'], + 'category': categories['security'], + 'tags': ['Security', 'Enterprise', 'Best Practices'], + 'thumbnail_url': '/images/blog/five.png', + 'reading_time': 6, + 'days_ago': 18 + }, + { + 'title': 'Building Scalable API Architectures', + 'content': ''' +Building APIs that can scale to millions of requests requires careful architectural planning and implementation of proven patterns.
+ +Understanding the difference between horizontal and vertical scaling is crucial for building scalable systems. Most modern APIs benefit from horizontal scaling strategies.
+ +Implementing effective caching can dramatically improve API performance and reduce load on backend systems. Learn about different caching layers and when to use them.
+ +You can't optimize what you can't measure. Implementing comprehensive monitoring and logging is essential for maintaining scalable APIs.
+ +Protecting your API from abuse and ensuring fair usage requires implementing rate limiting and throttling mechanisms.
+ ''', + 'excerpt': 'Learn the principles and patterns for building API architectures that can scale to meet growing demands.', + 'author': authors['Emily Rodriguez'], + 'category': categories['api-development'], + 'tags': ['API', 'Architecture', 'Best Practices'], + 'thumbnail_url': '/images/blog/six.png', + 'reading_time': 8, + 'days_ago': 22 + }, + { + 'title': 'Microservices Architecture for Enterprise Applications', + 'content': ''' +Microservices architecture has become the de facto standard for building scalable, maintainable enterprise applications. This architectural style structures an application as a collection of loosely coupled services.
+ +Microservices are independently deployable, organized around business capabilities, and can be written in different programming languages.
+ +Understanding different communication patterns between microservices is crucial. Options include synchronous REST APIs, message queues, and event-driven architectures.
+ +Docker containers provide the perfect deployment vehicle for microservices, ensuring consistency across development and production environments.
+ +While microservices offer many benefits, they also introduce complexity in areas like distributed transactions, data consistency, and service orchestration.
+ ''', + 'excerpt': 'A deep dive into microservices architecture patterns and best practices for enterprise applications.', + 'author': authors['Michael Chen'], + 'category': categories['enterprise-software'], + 'tags': ['Microservices', 'Architecture', 'Docker', 'Kubernetes'], + 'thumbnail_url': '/images/blog/seven.png', + 'featured': True, + 'reading_time': 11, + 'days_ago': 25 + }, + { + 'title': 'Data Analytics and Business Intelligence Solutions', + 'content': ''' +In today's business environment, data analytics and business intelligence are no longer optional—they're essential for staying competitive.
+ +Modern BI platforms offer self-service analytics, real-time dashboards, and AI-powered insights that democratize data access across the organization.
+ +A well-designed data warehouse serves as the foundation for business intelligence initiatives, providing a single source of truth for organizational data.
+ +The ability to analyze data in real-time enables organizations to respond quickly to changing conditions and make timely decisions.
+ +Without proper data governance and quality management, analytics initiatives can produce unreliable results. Establishing data quality standards is crucial.
+ +Integrating machine learning models into BI platforms can provide deeper insights and enable predictive capabilities.
+ ''', + 'excerpt': 'Leveraging data analytics and business intelligence to drive informed decision-making in enterprise environments.', + 'author': authors['David Thompson'], + 'category': categories['digital-transformation'], + 'tags': ['Analytics', 'BI', 'Enterprise', 'Best Practices'], + 'thumbnail_url': '/images/blog/eight.png', + 'reading_time': 9, + 'days_ago': 30 + } + ] + + # Create posts + for post_data in posts_data: + tag_names = post_data.pop('tags') + days_ago = post_data.pop('days_ago') + + post = BlogPost.objects.create( + **post_data, + published_at=timezone.now() - timedelta(days=days_ago) + ) + + # Add tags + for tag_name in tag_names: + if tag_name in tags: + post.tags.add(tags[tag_name]) + + self.stdout.write(f'Created post: {post.title}') + + self.stdout.write(self.style.SUCCESS('\nSuccessfully populated blog data!')) + self.stdout.write(f'Created {BlogAuthor.objects.count()} authors') + self.stdout.write(f'Created {BlogCategory.objects.count()} categories') + self.stdout.write(f'Created {BlogTag.objects.count()} tags') + self.stdout.write(f'Created {BlogPost.objects.count()} blog posts') + diff --git a/gnx-react/backend/blog/migrations/0001_initial.py b/gnx-react/backend/blog/migrations/0001_initial.py new file mode 100644 index 00000000..d6a0a0e8 --- /dev/null +++ b/gnx-react/backend/blog/migrations/0001_initial.py @@ -0,0 +1,129 @@ +# Generated by Django 4.2.7 on 2025-10-08 09:41 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='BlogAuthor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('email', models.EmailField(blank=True, max_length=254, null=True, unique=True)), + ('bio', models.TextField(blank=True)), + ('avatar', models.ImageField(blank=True, null=True, upload_to='blog/authors/')), + ('is_active', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ], + options={ + 'verbose_name': 'Blog Author', + 'verbose_name_plural': 'Blog Authors', + 'ordering': ['name'], + }, + ), + migrations.CreateModel( + name='BlogCategory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('description', models.TextField(blank=True)), + ('display_order', models.PositiveIntegerField(default=0)), + ('is_active', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ], + options={ + 'verbose_name': 'Blog Category', + 'verbose_name_plural': 'Blog Categories', + 'ordering': ['display_order', 'title'], + }, + ), + migrations.CreateModel( + name='BlogTag', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True)), + ('slug', models.SlugField(unique=True)), + ('is_active', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + options={ + 'verbose_name': 'Blog Tag', + 'verbose_name_plural': 'Blog Tags', + 'ordering': ['name'], + }, + ), + migrations.CreateModel( + name='BlogPost', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=300)), + ('slug', models.SlugField(max_length=300, unique=True)), + ('content', models.TextField()), + ('excerpt', models.TextField(blank=True, help_text='Short excerpt for preview')), + ('thumbnail', models.ImageField(blank=True, null=True, upload_to='blog/thumbnails/')), + ('thumbnail_url', models.CharField(blank=True, help_text='External thumbnail URL', max_length=500)), + ('featured_image', models.ImageField(blank=True, null=True, upload_to='blog/featured/')), + ('featured_image_url', models.CharField(blank=True, help_text='External featured image URL', max_length=500)), + ('meta_description', models.CharField(blank=True, max_length=160)), + ('meta_keywords', models.CharField(blank=True, max_length=255)), + ('published', models.BooleanField(default=True)), + ('featured', models.BooleanField(default=False, help_text='Featured post')), + ('views_count', models.PositiveIntegerField(default=0)), + ('reading_time', models.PositiveIntegerField(default=5, help_text='Estimated reading time in minutes')), + ('published_at', models.DateTimeField(default=django.utils.timezone.now)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to='blog.blogauthor')), + ('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to='blog.blogcategory')), + ('tags', models.ManyToManyField(blank=True, related_name='posts', to='blog.blogtag')), + ], + options={ + 'verbose_name': 'Blog Post', + 'verbose_name_plural': 'Blog Posts', + 'ordering': ['-published_at', '-created_at'], + }, + ), + migrations.CreateModel( + name='BlogComment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('email', models.EmailField(max_length=254)), + ('content', models.TextField()), + ('is_approved', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='replies', to='blog.blogcomment')), + ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='blog.blogpost')), + ], + options={ + 'verbose_name': 'Blog Comment', + 'verbose_name_plural': 'Blog Comments', + 'ordering': ['-created_at'], + }, + ), + migrations.AddIndex( + model_name='blogpost', + index=models.Index(fields=['-published_at'], name='blog_blogpo_publish_e75c11_idx'), + ), + migrations.AddIndex( + model_name='blogpost', + index=models.Index(fields=['slug'], name='blog_blogpo_slug_361555_idx'), + ), + migrations.AddIndex( + model_name='blogpost', + index=models.Index(fields=['published'], name='blog_blogpo_publish_059755_idx'), + ), + ] diff --git a/gnx-react/backend/blog/migrations/__init__.py b/gnx-react/backend/blog/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gnx-react/backend/blog/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/backend/blog/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 00000000..6c292f91 Binary files /dev/null and b/gnx-react/backend/blog/migrations/__pycache__/0001_initial.cpython-312.pyc differ diff --git a/gnx-react/backend/blog/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/blog/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..5abe9c57 Binary files /dev/null and b/gnx-react/backend/blog/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/gnx-react/backend/blog/models.py b/gnx-react/backend/blog/models.py new file mode 100644 index 00000000..705a8506 --- /dev/null +++ b/gnx-react/backend/blog/models.py @@ -0,0 +1,178 @@ +from django.db import models +from django.utils import timezone +from django.utils.text import slugify + + +class BlogAuthor(models.Model): + """Model for blog post authors""" + name = models.CharField(max_length=200) + email = models.EmailField(unique=True, blank=True, null=True) + bio = models.TextField(blank=True) + avatar = models.ImageField(upload_to='blog/authors/', blank=True, null=True) + is_active = models.BooleanField(default=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = "Blog Author" + verbose_name_plural = "Blog Authors" + ordering = ['name'] + + def __str__(self): + return self.name + + +class BlogCategory(models.Model): + """Model for blog post categories""" + title = models.CharField(max_length=100) + slug = models.SlugField(max_length=100, unique=True) + description = models.TextField(blank=True) + display_order = models.PositiveIntegerField(default=0) + is_active = models.BooleanField(default=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = "Blog Category" + verbose_name_plural = "Blog Categories" + ordering = ['display_order', 'title'] + + def __str__(self): + return self.title + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.title) + super().save(*args, **kwargs) + + +class BlogTag(models.Model): + """Model for blog post tags""" + name = models.CharField(max_length=50, unique=True) + slug = models.SlugField(max_length=50, unique=True) + is_active = models.BooleanField(default=True) + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + verbose_name = "Blog Tag" + verbose_name_plural = "Blog Tags" + ordering = ['name'] + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.name) + super().save(*args, **kwargs) + + +class BlogPost(models.Model): + """Model for blog posts""" + title = models.CharField(max_length=300) + slug = models.SlugField(max_length=300, unique=True) + content = models.TextField() + excerpt = models.TextField(blank=True, help_text="Short excerpt for preview") + thumbnail = models.ImageField(upload_to='blog/thumbnails/', blank=True, null=True) + thumbnail_url = models.CharField(max_length=500, blank=True, help_text="External thumbnail URL") + featured_image = models.ImageField(upload_to='blog/featured/', blank=True, null=True) + featured_image_url = models.CharField(max_length=500, blank=True, help_text="External featured image URL") + + author = models.ForeignKey( + BlogAuthor, + on_delete=models.SET_NULL, + null=True, + related_name='posts' + ) + category = models.ForeignKey( + BlogCategory, + on_delete=models.SET_NULL, + null=True, + related_name='posts' + ) + tags = models.ManyToManyField(BlogTag, related_name='posts', blank=True) + + # SEO and metadata + meta_description = models.CharField(max_length=160, blank=True) + meta_keywords = models.CharField(max_length=255, blank=True) + + # Status and visibility + published = models.BooleanField(default=True) + featured = models.BooleanField(default=False, help_text="Featured post") + views_count = models.PositiveIntegerField(default=0) + reading_time = models.PositiveIntegerField(default=5, help_text="Estimated reading time in minutes") + + # Timestamps + published_at = models.DateTimeField(default=timezone.now) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = "Blog Post" + verbose_name_plural = "Blog Posts" + ordering = ['-published_at', '-created_at'] + indexes = [ + models.Index(fields=['-published_at']), + models.Index(fields=['slug']), + models.Index(fields=['published']), + ] + + def __str__(self): + return self.title + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.title) + if not self.excerpt and self.content: + # Generate excerpt from content (first 200 characters) + self.excerpt = self.content[:200] + '...' if len(self.content) > 200 else self.content + super().save(*args, **kwargs) + + @property + def get_thumbnail_url(self): + """Return the thumbnail URL (uploaded image or external URL)""" + if self.thumbnail and hasattr(self.thumbnail, 'url'): + return self.thumbnail.url + elif self.thumbnail_url: + return self.thumbnail_url + return None + + @property + def get_featured_image_url(self): + """Return the featured image URL (uploaded image or external URL)""" + if self.featured_image and hasattr(self.featured_image, 'url'): + return self.featured_image.url + elif self.featured_image_url: + return self.featured_image_url + return None + + def increment_views(self): + """Increment the view count""" + self.views_count += 1 + self.save(update_fields=['views_count']) + + +class BlogComment(models.Model): + """Model for blog post comments""" + post = models.ForeignKey(BlogPost, on_delete=models.CASCADE, related_name='comments') + name = models.CharField(max_length=100) + email = models.EmailField() + content = models.TextField() + parent = models.ForeignKey( + 'self', + on_delete=models.CASCADE, + null=True, + blank=True, + related_name='replies' + ) + is_approved = models.BooleanField(default=False) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = "Blog Comment" + verbose_name_plural = "Blog Comments" + ordering = ['-created_at'] + + def __str__(self): + return f"Comment by {self.name} on {self.post.title}" diff --git a/gnx-react/backend/blog/serializers.py b/gnx-react/backend/blog/serializers.py new file mode 100644 index 00000000..7ad17292 --- /dev/null +++ b/gnx-react/backend/blog/serializers.py @@ -0,0 +1,113 @@ +from rest_framework import serializers +from .models import BlogPost, BlogCategory, BlogAuthor, BlogTag, BlogComment + + +class BlogAuthorSerializer(serializers.ModelSerializer): + """Serializer for blog authors""" + class Meta: + model = BlogAuthor + fields = ['id', 'name', 'email', 'bio', 'avatar'] + + +class BlogCategorySerializer(serializers.ModelSerializer): + """Serializer for blog categories""" + posts_count = serializers.SerializerMethodField() + + class Meta: + model = BlogCategory + fields = ['id', 'title', 'slug', 'description', 'display_order', 'posts_count'] + + def get_posts_count(self, obj): + return obj.posts.filter(published=True).count() + + +class BlogTagSerializer(serializers.ModelSerializer): + """Serializer for blog tags""" + class Meta: + model = BlogTag + fields = ['id', 'name', 'slug'] + + +class BlogPostListSerializer(serializers.ModelSerializer): + """Serializer for blog post list view""" + author_name = serializers.CharField(source='author.name', read_only=True) + category_title = serializers.CharField(source='category.title', read_only=True) + category_slug = serializers.CharField(source='category.slug', read_only=True) + thumbnail = serializers.SerializerMethodField() + tags = BlogTagSerializer(many=True, read_only=True) + + class Meta: + model = BlogPost + fields = [ + 'id', 'title', 'slug', 'excerpt', 'thumbnail', + 'author_name', 'category_title', 'category_slug', + 'tags', 'published_at', 'created_at', 'updated_at', + 'views_count', 'reading_time', 'featured', 'published' + ] + + def get_thumbnail(self, obj): + return obj.get_thumbnail_url + + +class BlogPostDetailSerializer(serializers.ModelSerializer): + """Serializer for blog post detail view""" + author = BlogAuthorSerializer(read_only=True) + category = BlogCategorySerializer(read_only=True) + tags = BlogTagSerializer(many=True, read_only=True) + thumbnail = serializers.SerializerMethodField() + featured_image = serializers.SerializerMethodField() + related_posts = serializers.SerializerMethodField() + + class Meta: + model = BlogPost + fields = [ + 'id', 'title', 'slug', 'content', 'excerpt', + 'thumbnail', 'featured_image', 'author', 'category', 'tags', + 'meta_description', 'meta_keywords', + 'published', 'featured', 'views_count', 'reading_time', + 'published_at', 'created_at', 'updated_at', 'related_posts' + ] + + def get_thumbnail(self, obj): + return obj.get_thumbnail_url + + def get_featured_image(self, obj): + return obj.get_featured_image_url + + def get_related_posts(self, obj): + """Get related posts from the same category""" + related = BlogPost.objects.filter( + category=obj.category, + published=True + ).exclude(id=obj.id)[:3] + return BlogPostListSerializer(related, many=True, context=self.context).data + + +class BlogCommentSerializer(serializers.ModelSerializer): + """Serializer for blog comments""" + replies = serializers.SerializerMethodField() + + class Meta: + model = BlogComment + fields = [ + 'id', 'post', 'name', 'email', 'content', + 'parent', 'is_approved', 'created_at', 'updated_at', 'replies' + ] + read_only_fields = ['is_approved', 'created_at', 'updated_at'] + + def get_replies(self, obj): + """Get nested replies""" + if obj.replies.exists(): + return BlogCommentSerializer( + obj.replies.filter(is_approved=True), + many=True + ).data + return [] + + +class BlogCommentCreateSerializer(serializers.ModelSerializer): + """Serializer for creating blog comments""" + class Meta: + model = BlogComment + fields = ['post', 'name', 'email', 'content', 'parent'] + diff --git a/gnx-react/backend/blog/tests.py b/gnx-react/backend/blog/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/gnx-react/backend/blog/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/gnx-react/backend/blog/urls.py b/gnx-react/backend/blog/urls.py new file mode 100644 index 00000000..bb8121d4 --- /dev/null +++ b/gnx-react/backend/blog/urls.py @@ -0,0 +1,21 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .views import ( + BlogPostViewSet, + BlogCategoryViewSet, + BlogAuthorViewSet, + BlogTagViewSet, + BlogCommentViewSet +) + +router = DefaultRouter() +router.register(r'posts', BlogPostViewSet, basename='blog-post') +router.register(r'categories', BlogCategoryViewSet, basename='blog-category') +router.register(r'authors', BlogAuthorViewSet, basename='blog-author') +router.register(r'tags', BlogTagViewSet, basename='blog-tag') +router.register(r'comments', BlogCommentViewSet, basename='blog-comment') + +urlpatterns = [ + path('', include(router.urls)), +] + diff --git a/gnx-react/backend/blog/views.py b/gnx-react/backend/blog/views.py new file mode 100644 index 00000000..85393039 --- /dev/null +++ b/gnx-react/backend/blog/views.py @@ -0,0 +1,189 @@ +from rest_framework import viewsets, status, filters +from rest_framework.decorators import action +from rest_framework.response import Response +from rest_framework.pagination import PageNumberPagination +from django_filters.rest_framework import DjangoFilterBackend +from django.db.models import Q +from .models import BlogPost, BlogCategory, BlogAuthor, BlogTag, BlogComment +from .serializers import ( + BlogPostListSerializer, + BlogPostDetailSerializer, + BlogCategorySerializer, + BlogAuthorSerializer, + BlogTagSerializer, + BlogCommentSerializer, + BlogCommentCreateSerializer +) + + +class BlogPagination(PageNumberPagination): + """Custom pagination for blog posts""" + page_size = 9 + page_size_query_param = 'page_size' + max_page_size = 100 + + +class BlogPostViewSet(viewsets.ReadOnlyModelViewSet): + """ + ViewSet for blog posts + Supports filtering by category, tags, author, and search + """ + queryset = BlogPost.objects.filter(published=True) + pagination_class = BlogPagination + filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] + filterset_fields = ['category__slug', 'author', 'featured', 'tags__slug'] + search_fields = ['title', 'content', 'excerpt'] + ordering_fields = ['published_at', 'views_count', 'created_at'] + ordering = ['-published_at'] + lookup_field = 'slug' + + def get_serializer_class(self): + if self.action == 'retrieve': + return BlogPostDetailSerializer + return BlogPostListSerializer + + def get_queryset(self): + queryset = super().get_queryset() + + # Filter by category + category_slug = self.request.query_params.get('category', None) + if category_slug and category_slug != 'all': + queryset = queryset.filter(category__slug=category_slug) + + # Filter by tag + tag_slug = self.request.query_params.get('tag', None) + if tag_slug: + queryset = queryset.filter(tags__slug=tag_slug) + + # Filter by author + author_id = self.request.query_params.get('author', None) + if author_id: + queryset = queryset.filter(author_id=author_id) + + # Search query + search = self.request.query_params.get('search', None) + if search: + queryset = queryset.filter( + Q(title__icontains=search) | + Q(content__icontains=search) | + Q(excerpt__icontains=search) + ) + + return queryset.distinct() + + def retrieve(self, request, *args, **kwargs): + """Override retrieve to increment view count""" + instance = self.get_object() + instance.increment_views() + serializer = self.get_serializer(instance) + return Response(serializer.data) + + @action(detail=False, methods=['get']) + def featured(self, request): + """Get featured blog posts""" + featured_posts = self.get_queryset().filter(featured=True)[:6] + serializer = self.get_serializer(featured_posts, many=True) + return Response(serializer.data) + + @action(detail=False, methods=['get']) + def latest(self, request): + """Get latest blog posts""" + limit = int(request.query_params.get('limit', 5)) + latest_posts = self.get_queryset()[:limit] + serializer = self.get_serializer(latest_posts, many=True) + return Response(serializer.data) + + @action(detail=False, methods=['get']) + def popular(self, request): + """Get popular blog posts by views""" + limit = int(request.query_params.get('limit', 5)) + popular_posts = self.get_queryset().order_by('-views_count')[:limit] + serializer = self.get_serializer(popular_posts, many=True) + return Response(serializer.data) + + @action(detail=True, methods=['get']) + def related(self, request, slug=None): + """Get related posts for a specific post""" + post = self.get_object() + related_posts = self.get_queryset().filter( + category=post.category + ).exclude(id=post.id)[:4] + serializer = self.get_serializer(related_posts, many=True) + return Response(serializer.data) + + +class BlogCategoryViewSet(viewsets.ReadOnlyModelViewSet): + """ViewSet for blog categories""" + queryset = BlogCategory.objects.filter(is_active=True) + serializer_class = BlogCategorySerializer + lookup_field = 'slug' + + @action(detail=False, methods=['get']) + def with_posts(self, request): + """Get categories that have published posts""" + categories = self.get_queryset().filter(posts__published=True).distinct() + serializer = self.get_serializer(categories, many=True) + return Response(serializer.data) + + +class BlogAuthorViewSet(viewsets.ReadOnlyModelViewSet): + """ViewSet for blog authors""" + queryset = BlogAuthor.objects.filter(is_active=True) + serializer_class = BlogAuthorSerializer + + @action(detail=True, methods=['get']) + def posts(self, request, pk=None): + """Get all posts by a specific author""" + author = self.get_object() + posts = BlogPost.objects.filter(author=author, published=True) + page = self.paginate_queryset(posts) + if page is not None: + serializer = BlogPostListSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = BlogPostListSerializer(posts, many=True) + return Response(serializer.data) + + +class BlogTagViewSet(viewsets.ReadOnlyModelViewSet): + """ViewSet for blog tags""" + queryset = BlogTag.objects.filter(is_active=True) + serializer_class = BlogTagSerializer + lookup_field = 'slug' + + @action(detail=True, methods=['get']) + def posts(self, request, slug=None): + """Get all posts with a specific tag""" + tag = self.get_object() + posts = BlogPost.objects.filter(tags=tag, published=True) + page = self.paginate_queryset(posts) + if page is not None: + serializer = BlogPostListSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = BlogPostListSerializer(posts, many=True) + return Response(serializer.data) + + +class BlogCommentViewSet(viewsets.ModelViewSet): + """ViewSet for blog comments""" + queryset = BlogComment.objects.filter(is_approved=True) + serializer_class = BlogCommentSerializer + filter_backends = [DjangoFilterBackend] + filterset_fields = ['post'] + + def get_serializer_class(self): + if self.action == 'create': + return BlogCommentCreateSerializer + return BlogCommentSerializer + + def create(self, request, *args, **kwargs): + """Create a new comment (requires moderation)""" + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + self.perform_create(serializer) + return Response( + { + 'message': 'Comment submitted successfully. It will be visible after moderation.', + 'data': serializer.data + }, + status=status.HTTP_201_CREATED + ) diff --git a/gnx-react/backend/case_studies/README.md b/gnx-react/backend/case_studies/README.md new file mode 100644 index 00000000..6e983705 --- /dev/null +++ b/gnx-react/backend/case_studies/README.md @@ -0,0 +1,208 @@ +# Case Studies API + +## Overview + +The Case Studies API provides a comprehensive backend and frontend solution for managing and displaying case study content. This feature includes categories, clients, process steps, gallery images, and related case studies. + +## Backend Structure + +### Models + +1. **CaseStudyCategory** + - Category management for case studies + - Fields: name, slug, description, display_order, is_active + +2. **Client** + - Client information management + - Fields: name, slug, logo, description, website + +3. **CaseStudy** + - Main case study model + - Fields: title, slug, subtitle, description, excerpt + - Images: thumbnail, featured_image, poster_image, project_image + - Relations: category, client + - Content: project_overview, site_map_content + +4. **CaseStudyImage** + - Gallery images for case studies + - Fields: image, caption, display_order + +5. **CaseStudyProcess** + - Process steps for case studies + - Fields: step_number, title, description + +### API Endpoints + +Base URL: `/api/case-studies/` + +#### Case Studies + +- `GET /case-studies/` - List all case studies (with pagination and filtering) + - Query params: `category`, `client`, `search`, `featured`, `ordering`, `page`, `page_size` +- `GET /case-studies/{slug}/` - Get case study details +- `GET /case-studies/featured/` - Get featured case studies +- `GET /case-studies/latest/?limit=6` - Get latest case studies +- `GET /case-studies/popular/?limit=6` - Get popular case studies +- `GET /case-studies/{slug}/related/` - Get related case studies + +#### Categories + +- `GET /categories/` - List all categories +- `GET /categories/{slug}/` - Get category details +- `GET /categories/with_case_studies/` - Get categories with case studies + +#### Clients + +- `GET /clients/` - List all clients +- `GET /clients/{slug}/` - Get client details +- `GET /clients/{slug}/case_studies/` - Get case studies for a client + +## Frontend Structure + +### API Service (`lib/api/caseStudyService.ts`) + +Provides TypeScript functions for all API endpoints with proper typing. + +### Hooks (`lib/hooks/useCaseStudy.ts`) + +React hooks for data fetching: +- `useCaseStudies()` - Fetch all case studies +- `useCaseStudy(slug)` - Fetch single case study +- `useFeaturedCaseStudies()` - Fetch featured case studies +- `useLatestCaseStudies()` - Fetch latest case studies +- `usePopularCaseStudies()` - Fetch popular case studies +- `useRelatedCaseStudies(slug)` - Fetch related case studies +- `useCaseStudyCategories()` - Fetch categories +- `useClients()` - Fetch clients + +### Components + +1. **CaseItems** (`components/pages/case-study/CaseItems.tsx`) + - Lists all case studies in a grid + - Includes tab navigation for "Case Study" and "Client" views + - Dynamically rendered from API data + +2. **CaseSingle** (`components/pages/case-study/CaseSingle.tsx`) + - Displays detailed case study information + - Shows poster image, project overview, and gallery + - Dynamically rendered from API data + +3. **Process** (`components/pages/case-study/Process.tsx`) + - Displays process steps for a case study + - Dynamically rendered from API data + +4. **RelatedCase** (`components/pages/case-study/RelatedCase.tsx`) + - Shows related case studies + - Dynamically rendered from API data + +### Pages + +- `/case-study` - Lists all case studies +- `/case-study/[slug]` - Displays individual case study + +## Setup Instructions + +### Backend Setup + +1. Add `'case_studies'` to `INSTALLED_APPS` in `settings.py` âś… +2. Run migrations: + ```bash + python manage.py makemigrations case_studies + python manage.py migrate case_studies + ``` + +3. Populate sample data: + ```bash + python manage.py populate_case_studies + ``` + +4. Add URL patterns to main `urls.py`: + ```python + path('api/case-studies/', include('case_studies.urls')), + ``` + +### Frontend Setup + +The frontend is already integrated and ready to use. The components will automatically fetch data from the API when the pages load. + +## Admin Panel + +Access the Django admin panel to manage: +- Case Study Categories +- Clients +- Case Studies +- Case Study Images +- Case Study Process Steps + +URL: `/admin/` + +## Data Population + +The `populate_case_studies` management command creates: +- 6 case study categories +- 4 clients +- 8 case studies +- 32 gallery images +- 40 process steps + +## Features + +âś… Full CRUD operations via Django admin +âś… RESTful API with filtering and pagination +âś… Dynamic frontend with React hooks +âś… Image support (local and external URLs) +âś… Related case studies +âś… Process steps with ordering +âś… Gallery images with captions +âś… Category and client management +âś… Featured and popular case studies +âś… SEO fields (meta description, keywords) +âś… View count tracking + +## Testing the API + +You can test the API using: + +1. Django REST Framework browsable API: + - Navigate to `http://localhost:8000/api/case-studies/case-studies/` + +2. Swagger UI: + - Navigate to `http://localhost:8000/swagger/` + +3. Frontend: + - Navigate to `http://localhost:3000/case-study` + +## Example API Response + +```json +{ + "id": 1, + "title": "Artificial intelligence is the simulation of human processes", + "slug": "artificial-intelligence-is-the-simulation-of-human-processes", + "subtitle": "AI-Powered Business Solutions", + "excerpt": "This artificial intelligence project demonstrates...", + "thumbnail": "/images/case/one.png", + "category": { + "id": 4, + "name": "AI", + "slug": "ai" + }, + "client": { + "id": 1, + "name": "Tarapio", + "slug": "tarapio" + }, + "gallery_images": [...], + "process_steps": [...], + "related_case_studies": [...] +} +``` + +## Notes + +- All images support both uploaded files and external URLs +- Slugs are automatically generated from titles +- Case studies are ordered by display_order and published_at +- Only published case studies are returned via the API +- View counts are automatically incremented when viewing details + diff --git a/gnx-react/backend/case_studies/__init__.py b/gnx-react/backend/case_studies/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gnx-react/backend/case_studies/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/case_studies/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..bf217c49 Binary files /dev/null and b/gnx-react/backend/case_studies/__pycache__/__init__.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/__pycache__/admin.cpython-312.pyc b/gnx-react/backend/case_studies/__pycache__/admin.cpython-312.pyc new file mode 100644 index 00000000..1ec40b99 Binary files /dev/null and b/gnx-react/backend/case_studies/__pycache__/admin.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/__pycache__/apps.cpython-312.pyc b/gnx-react/backend/case_studies/__pycache__/apps.cpython-312.pyc new file mode 100644 index 00000000..3bf54a7c Binary files /dev/null and b/gnx-react/backend/case_studies/__pycache__/apps.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/__pycache__/models.cpython-312.pyc b/gnx-react/backend/case_studies/__pycache__/models.cpython-312.pyc new file mode 100644 index 00000000..c1336d03 Binary files /dev/null and b/gnx-react/backend/case_studies/__pycache__/models.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/__pycache__/serializers.cpython-312.pyc b/gnx-react/backend/case_studies/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 00000000..336cd1ea Binary files /dev/null and b/gnx-react/backend/case_studies/__pycache__/serializers.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/__pycache__/urls.cpython-312.pyc b/gnx-react/backend/case_studies/__pycache__/urls.cpython-312.pyc new file mode 100644 index 00000000..6aca05a8 Binary files /dev/null and b/gnx-react/backend/case_studies/__pycache__/urls.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/__pycache__/views.cpython-312.pyc b/gnx-react/backend/case_studies/__pycache__/views.cpython-312.pyc new file mode 100644 index 00000000..88c05dff Binary files /dev/null and b/gnx-react/backend/case_studies/__pycache__/views.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/admin.py b/gnx-react/backend/case_studies/admin.py new file mode 100644 index 00000000..106d9f73 --- /dev/null +++ b/gnx-react/backend/case_studies/admin.py @@ -0,0 +1,105 @@ +from django.contrib import admin +from .models import CaseStudy, CaseStudyCategory, Client, CaseStudyImage, CaseStudyProcess + + +@admin.register(CaseStudyCategory) +class CaseStudyCategoryAdmin(admin.ModelAdmin): + list_display = ['name', 'slug', 'display_order', 'is_active', 'case_studies_count'] + list_filter = ['is_active'] + search_fields = ['name', 'slug'] + prepopulated_fields = {'slug': ('name',)} + ordering = ['display_order', 'name'] + + def case_studies_count(self, obj): + return obj.case_studies.count() + case_studies_count.short_description = 'Case Studies Count' + + +@admin.register(Client) +class ClientAdmin(admin.ModelAdmin): + list_display = ['name', 'slug', 'website', 'is_active', 'case_studies_count'] + list_filter = ['is_active', 'created_at'] + search_fields = ['name', 'slug', 'website'] + prepopulated_fields = {'slug': ('name',)} + ordering = ['name'] + + def case_studies_count(self, obj): + return obj.case_studies.count() + case_studies_count.short_description = 'Case Studies Count' + + +class CaseStudyImageInline(admin.TabularInline): + model = CaseStudyImage + extra = 1 + fields = ['image', 'image_url', 'caption', 'display_order'] + + +class CaseStudyProcessInline(admin.TabularInline): + model = CaseStudyProcess + extra = 1 + fields = ['step_number', 'title', 'description'] + ordering = ['step_number'] + + +@admin.register(CaseStudy) +class CaseStudyAdmin(admin.ModelAdmin): + list_display = [ + 'title', 'category', 'client', 'published', + 'featured', 'views_count', 'display_order', 'published_at' + ] + list_filter = [ + 'published', 'featured', 'category', + 'client', 'published_at', 'created_at' + ] + search_fields = ['title', 'description', 'excerpt'] + prepopulated_fields = {'slug': ('title',)} + date_hierarchy = 'published_at' + ordering = ['display_order', '-published_at', '-created_at'] + inlines = [CaseStudyImageInline, CaseStudyProcessInline] + + fieldsets = ( + ('Basic Information', { + 'fields': ('title', 'slug', 'subtitle', 'category', 'client') + }), + ('Content', { + 'fields': ('excerpt', 'description', 'project_overview', 'site_map_content') + }), + ('Images', { + 'fields': ( + 'thumbnail', 'thumbnail_url', + 'featured_image', 'featured_image_url', + 'poster_image', 'poster_image_url', + 'project_image', 'project_image_url' + ) + }), + ('SEO', { + 'fields': ('meta_description', 'meta_keywords'), + 'classes': ('collapse',) + }), + ('Status & Visibility', { + 'fields': ('published', 'featured', 'display_order', 'published_at') + }), + ('Statistics', { + 'fields': ('views_count',), + 'classes': ('collapse',) + }), + ) + + readonly_fields = ['views_count'] + + +@admin.register(CaseStudyImage) +class CaseStudyImageAdmin(admin.ModelAdmin): + list_display = ['case_study', 'caption', 'display_order', 'created_at'] + list_filter = ['case_study', 'created_at'] + search_fields = ['case_study__title', 'caption'] + ordering = ['case_study', 'display_order'] + + +@admin.register(CaseStudyProcess) +class CaseStudyProcessAdmin(admin.ModelAdmin): + list_display = ['case_study', 'step_number', 'title', 'created_at'] + list_filter = ['case_study', 'created_at'] + search_fields = ['case_study__title', 'title', 'description'] + ordering = ['case_study', 'step_number'] + diff --git a/gnx-react/backend/case_studies/apps.py b/gnx-react/backend/case_studies/apps.py new file mode 100644 index 00000000..068f9f8f --- /dev/null +++ b/gnx-react/backend/case_studies/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + +class CaseStudiesConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'case_studies' + diff --git a/gnx-react/backend/case_studies/management/__init__.py b/gnx-react/backend/case_studies/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gnx-react/backend/case_studies/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/case_studies/management/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..2dad47d7 Binary files /dev/null and b/gnx-react/backend/case_studies/management/__pycache__/__init__.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/management/commands/__init__.py b/gnx-react/backend/case_studies/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gnx-react/backend/case_studies/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/case_studies/management/commands/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..310ac6f2 Binary files /dev/null and b/gnx-react/backend/case_studies/management/commands/__pycache__/__init__.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/management/commands/__pycache__/populate_case_studies.cpython-312.pyc b/gnx-react/backend/case_studies/management/commands/__pycache__/populate_case_studies.cpython-312.pyc new file mode 100644 index 00000000..3b5f60d6 Binary files /dev/null and b/gnx-react/backend/case_studies/management/commands/__pycache__/populate_case_studies.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/management/commands/populate_case_studies.py b/gnx-react/backend/case_studies/management/commands/populate_case_studies.py new file mode 100644 index 00000000..e5b67645 --- /dev/null +++ b/gnx-react/backend/case_studies/management/commands/populate_case_studies.py @@ -0,0 +1,346 @@ +from django.core.management.base import BaseCommand +from case_studies.models import CaseStudyCategory, Client, CaseStudy, CaseStudyImage, CaseStudyProcess +from django.utils import timezone +from datetime import timedelta + + +class Command(BaseCommand): + help = 'Populate database with sample case study data' + + def handle(self, *args, **options): + self.stdout.write(self.style.SUCCESS('Starting to populate case study data...')) + + # Clear existing data + CaseStudyProcess.objects.all().delete() + CaseStudyImage.objects.all().delete() + CaseStudy.objects.all().delete() + Client.objects.all().delete() + CaseStudyCategory.objects.all().delete() + + # Create Categories + categories_data = [ + { + 'name': '3D Render', + 'slug': '3d-render', + 'description': '3D rendering and visualization projects', + 'display_order': 1 + }, + { + 'name': 'UI / UX', + 'slug': 'ui-ux', + 'description': 'User interface and user experience design projects', + 'display_order': 2 + }, + { + 'name': 'Photography', + 'slug': 'photography', + 'description': 'Professional photography projects', + 'display_order': 3 + }, + { + 'name': 'AI', + 'slug': 'ai', + 'description': 'Artificial intelligence and machine learning projects', + 'display_order': 4 + }, + { + 'name': 'Icon Set', + 'slug': 'icon-set', + 'description': 'Custom icon set design projects', + 'display_order': 5 + }, + { + 'name': 'Road Map', + 'slug': 'road-map', + 'description': 'Product roadmap and planning projects', + 'display_order': 6 + } + ] + + categories = {} + for cat_data in categories_data: + category = CaseStudyCategory.objects.create(**cat_data) + categories[category.slug] = category + self.stdout.write(f'Created category: {category.name}') + + # Create Clients + clients_data = [ + { + 'name': 'Tarapio', + 'slug': 'tarapio', + 'description': 'Leading technology solutions provider', + 'website': 'https://tarapio.com' + }, + { + 'name': 'Melenpo', + 'slug': 'melenpo', + 'description': 'Digital innovation company', + 'website': 'https://melenpo.com' + }, + { + 'name': 'Polax', + 'slug': 'polax', + 'description': 'Enterprise software solutions', + 'website': 'https://polax.com' + }, + { + 'name': 'AINA', + 'slug': 'aina', + 'description': 'AI and automation solutions', + 'website': 'https://aina.com' + } + ] + + clients = {} + for client_data in clients_data: + client = Client.objects.create(**client_data) + clients[client.slug] = client + self.stdout.write(f'Created client: {client.name}') + + # Create Case Studies + case_studies_data = [ + { + 'title': '3D computer graphics, or "3D graphics', + 'subtitle': 'Immersive 3D Visualization Experience', + 'description': ''' +A comprehensive 3D rendering project that showcases cutting-edge visualization techniques and photorealistic rendering capabilities. This project demonstrates our expertise in creating stunning visual content for modern digital platforms.
+ +Our client needed high-quality 3D visualizations that could accurately represent their products in a digital environment. The challenge was to create renders that were not only photorealistic but also optimized for various platforms and use cases.
+ +We employed advanced 3D modeling techniques combined with physically-based rendering (PBR) to achieve exceptional results. Our team utilized industry-standard tools and custom workflows to deliver renders that exceeded client expectations.
+ +The project resulted in a collection of stunning 3D renders that significantly enhanced the client's digital presence. The visualizations led to increased customer engagement and improved conversion rates across their digital channels.
+ ''', + 'category': categories['3d-render'], + 'client': None, + 'thumbnail_url': '/images/case/two.png', + 'poster_image_url': '/images/case/poster.png', + 'project_image_url': '/images/case/project.png', + 'project_overview': 'Lorem ipsum dolor sit amet consectetur. Vestibulum malesuada amet sagittis urna. Mattis eget ultricies est morbi velit ultrices viverra elit facilisi.', + 'site_map_content': 'Lorem ipsum dolor sit amet consectetur. Vestibulum malesuada amet sagittis urna. Mattis eget ultricies est morbi velit ultrices viverra elit facilisi.', + 'featured': True, + 'display_order': 1, + 'days_ago': 10 + }, + { + 'title': 'Artificial intelligence is the simulation of human processes', + 'subtitle': 'AI-Powered Business Solutions', + 'description': ''' +This artificial intelligence project demonstrates the power of machine learning and AI in solving complex business problems. We developed custom AI models that automate decision-making processes and provide predictive insights.
+ +The project utilizes state-of-the-art AI technologies including neural networks, natural language processing, and computer vision. Our solution is built on a scalable cloud infrastructure that can handle large volumes of data processing.
+ +We worked closely with the client to understand their specific needs and challenges. The implementation phase involved data collection, model training, validation, and deployment to production environments.
+ +The AI solution has transformed the client's operations, reducing manual work by 60% and improving accuracy in decision-making processes. The system continues to learn and improve over time, providing increasing value to the organization.
+ ''', + 'category': categories['ai'], + 'client': clients['tarapio'], + 'thumbnail_url': '/images/case/one.png', + 'poster_image_url': '/images/case/poster.png', + 'featured': True, + 'display_order': 2, + 'days_ago': 15 + }, + { + 'title': 'User experience (UX) design is the process design teams', + 'subtitle': 'Modern UX Design System', + 'description': ''' +A comprehensive UX design project focused on creating intuitive and engaging user experiences. This case study showcases our approach to user-centered design and our ability to create interfaces that delight users.
+ +We conducted extensive user research including interviews, surveys, and usability testing to understand user needs and pain points. This research formed the foundation of our design decisions.
+ +Our design process involved creating user personas, journey maps, wireframes, and high-fidelity prototypes. Each step was validated with real users to ensure we were on the right track.
+ +A stunning photography project that captures the essence of modern visual storytelling. This portfolio demonstrates our expertise in various photography styles and techniques.
+ +The project incorporates multiple photography styles including product photography, portrait photography, and architectural photography. Each image is carefully composed and post-processed to achieve the desired aesthetic.
+ +Using professional-grade equipment and advanced lighting techniques, we created images that stand out in quality and artistic vision.
+ ''', + 'category': categories['photography'], + 'client': None, + 'thumbnail_url': '/images/case/four.png', + 'poster_image_url': '/images/case/poster.png', + 'featured': False, + 'display_order': 4, + 'days_ago': 25 + }, + { + 'title': 'UX case study for a medical app- medical product design', + 'subtitle': 'Healthcare UX Innovation', + 'description': ''' +Designing for healthcare requires special attention to accessibility, security, and user trust. This medical app design project showcases our expertise in creating intuitive interfaces for complex healthcare workflows.
+ +The design adheres to HIPAA regulations and industry best practices for healthcare data security while maintaining an intuitive user experience.
+ +We conducted extensive research with healthcare professionals and patients to ensure the design meets the needs of all stakeholders.
+ ''', + 'category': categories['ui-ux'], + 'client': clients['polax'], + 'thumbnail_url': '/images/case/five.png', + 'poster_image_url': '/images/case/poster.png', + 'featured': False, + 'display_order': 5, + 'days_ago': 30 + }, + { + 'title': 'Make icon set for the educational project', + 'subtitle': 'Custom Educational Icon Set', + 'description': ''' +A comprehensive icon set designed specifically for educational platforms. This project demonstrates our ability to create cohesive, scalable, and meaningful iconography.
+ +The icons follow consistent design principles including size, style, and metaphor. Each icon is designed to be instantly recognizable and appropriate for educational contexts.
+ +The final deliverable includes icons in multiple formats (SVG, PNG) and sizes, along with comprehensive usage guidelines.
+ ''', + 'category': categories['icon-set'], + 'client': None, + 'thumbnail_url': '/images/case/six.png', + 'poster_image_url': '/images/case/poster.png', + 'featured': False, + 'display_order': 6, + 'days_ago': 35 + }, + { + 'title': 'AI-driven user experience design process', + 'subtitle': 'AI-Driven User Experience', + 'description': ''' +This project combines artificial intelligence with user experience design to create adaptive interfaces that learn from user behavior and preferences.
+ +The design incorporates machine learning algorithms that personalize the user experience based on individual usage patterns and preferences.
+ ''', + 'category': categories['ai'], + 'client': clients['aina'], + 'thumbnail_url': '/images/case/seven.png', + 'poster_image_url': '/images/case/poster.png', + 'featured': False, + 'display_order': 7, + 'days_ago': 40 + }, + { + 'title': 'UX site rode map app product design system', + 'subtitle': 'Product Roadmap Visualization', + 'description': ''' +A comprehensive product roadmap visualization system that helps teams plan, communicate, and execute their product strategy effectively.
+ +The roadmap system includes timeline views, milestone tracking, dependency mapping, and collaboration tools for distributed teams.
+ +Built with modern web technologies and optimized for performance and usability across all devices and platforms.
+ ''', + 'category': categories['road-map'], + 'client': None, + 'thumbnail_url': '/images/case/eight.png', + 'poster_image_url': '/images/case/poster.png', + 'featured': False, + 'display_order': 8, + 'days_ago': 45 + } + ] + + # Create case studies + created_case_studies = [] + for cs_data in case_studies_data: + days_ago = cs_data.pop('days_ago') + + case_study = CaseStudy.objects.create( + **cs_data, + published_at=timezone.now() - timedelta(days=days_ago) + ) + created_case_studies.append(case_study) + + # Add gallery images + gallery_images = [ + '/images/case/nine.png', + '/images/case/ten.png', + '/images/case/eleven.png', + '/images/case/twelve.png' + ] + + for idx, img_url in enumerate(gallery_images, 1): + CaseStudyImage.objects.create( + case_study=case_study, + image_url=img_url, + caption=f'Gallery Image {idx}', + display_order=idx + ) + + # Add process steps + processes = [ + {'step_number': 1, 'title': 'Computer Vision', 'description': 'Quisque varius malesuada dui, ut posuere purus gravida in. Phasellus ultricies ullamcorper mollis.'}, + {'step_number': 2, 'title': 'Computer Vision', 'description': 'Quisque varius malesuada dui, ut posuere purus gravida in. Phasellus ultricies ullamcorper mollis.'}, + {'step_number': 3, 'title': '3D Vision', 'description': 'Quisque varius malesuada dui, ut posuere purus gravida in. Phasellus ultricies ullamcorper mollis.'}, + {'step_number': 4, 'title': 'Computer Vision', 'description': 'Quisque varius malesuada dui, ut posuere purus gravida in. Phasellus ultricies ullamcorper mollis.'}, + {'step_number': 5, 'title': '3D Vision', 'description': 'Quisque varius malesuada dui, ut posuere purus gravida in. Phasellus ultricies ullamcorper mollis.'}, + ] + + for process_data in processes: + CaseStudyProcess.objects.create( + case_study=case_study, + **process_data + ) + + self.stdout.write(f'Created case study: {case_study.title}') + + self.stdout.write(self.style.SUCCESS('\nSuccessfully populated case study data!')) + self.stdout.write(f'Created {CaseStudyCategory.objects.count()} categories') + self.stdout.write(f'Created {Client.objects.count()} clients') + self.stdout.write(f'Created {CaseStudy.objects.count()} case studies') + self.stdout.write(f'Created {CaseStudyImage.objects.count()} gallery images') + self.stdout.write(f'Created {CaseStudyProcess.objects.count()} process steps') + diff --git a/gnx-react/backend/case_studies/migrations/0001_initial.py b/gnx-react/backend/case_studies/migrations/0001_initial.py new file mode 100644 index 00000000..81b20aeb --- /dev/null +++ b/gnx-react/backend/case_studies/migrations/0001_initial.py @@ -0,0 +1,144 @@ +# Generated by Django 4.2.7 on 2025-10-08 10:24 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='CaseStudy', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=300)), + ('slug', models.SlugField(max_length=300, unique=True)), + ('subtitle', models.CharField(blank=True, max_length=300)), + ('description', models.TextField()), + ('excerpt', models.TextField(blank=True, help_text='Short excerpt for preview')), + ('thumbnail', models.ImageField(blank=True, null=True, upload_to='case_studies/thumbnails/')), + ('thumbnail_url', models.CharField(blank=True, help_text='External thumbnail URL', max_length=500)), + ('featured_image', models.ImageField(blank=True, null=True, upload_to='case_studies/featured/')), + ('featured_image_url', models.CharField(blank=True, help_text='External featured image URL', max_length=500)), + ('poster_image', models.ImageField(blank=True, null=True, upload_to='case_studies/posters/')), + ('poster_image_url', models.CharField(blank=True, help_text='External poster image URL', max_length=500)), + ('project_image', models.ImageField(blank=True, null=True, upload_to='case_studies/projects/')), + ('project_image_url', models.CharField(blank=True, help_text='External project image URL', max_length=500)), + ('project_overview', models.TextField(blank=True, help_text='Project overview content')), + ('site_map_content', models.TextField(blank=True, help_text='Site map / process content')), + ('meta_description', models.CharField(blank=True, max_length=160)), + ('meta_keywords', models.CharField(blank=True, max_length=255)), + ('published', models.BooleanField(default=True)), + ('featured', models.BooleanField(default=False, help_text='Featured case study')), + ('views_count', models.PositiveIntegerField(default=0)), + ('display_order', models.PositiveIntegerField(default=0)), + ('published_at', models.DateTimeField(default=django.utils.timezone.now)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ], + options={ + 'verbose_name': 'Case Study', + 'verbose_name_plural': 'Case Studies', + 'ordering': ['display_order', '-published_at', '-created_at'], + }, + ), + migrations.CreateModel( + name='CaseStudyCategory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('description', models.TextField(blank=True)), + ('display_order', models.PositiveIntegerField(default=0)), + ('is_active', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ], + options={ + 'verbose_name': 'Case Study Category', + 'verbose_name_plural': 'Case Study Categories', + 'ordering': ['display_order', 'name'], + }, + ), + migrations.CreateModel( + name='Client', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('slug', models.SlugField(max_length=200, unique=True)), + ('logo', models.ImageField(blank=True, null=True, upload_to='case_studies/clients/')), + ('logo_url', models.CharField(blank=True, help_text='External logo URL', max_length=500)), + ('description', models.TextField(blank=True)), + ('website', models.URLField(blank=True)), + ('is_active', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ], + options={ + 'verbose_name': 'Client', + 'verbose_name_plural': 'Clients', + 'ordering': ['name'], + }, + ), + migrations.CreateModel( + name='CaseStudyProcess', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('description', models.TextField()), + ('step_number', models.PositiveIntegerField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('case_study', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='process_steps', to='case_studies.casestudy')), + ], + options={ + 'verbose_name': 'Case Study Process', + 'verbose_name_plural': 'Case Study Processes', + 'ordering': ['step_number'], + }, + ), + migrations.CreateModel( + name='CaseStudyImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(upload_to='case_studies/gallery/')), + ('image_url', models.CharField(blank=True, help_text='External image URL', max_length=500)), + ('caption', models.CharField(blank=True, max_length=200)), + ('display_order', models.PositiveIntegerField(default=0)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('case_study', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='gallery_images', to='case_studies.casestudy')), + ], + options={ + 'verbose_name': 'Case Study Image', + 'verbose_name_plural': 'Case Study Images', + 'ordering': ['display_order', 'created_at'], + }, + ), + migrations.AddField( + model_name='casestudy', + name='category', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_studies', to='case_studies.casestudycategory'), + ), + migrations.AddField( + model_name='casestudy', + name='client', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_studies', to='case_studies.client'), + ), + migrations.AddIndex( + model_name='casestudy', + index=models.Index(fields=['-published_at'], name='case_studie_publish_77559c_idx'), + ), + migrations.AddIndex( + model_name='casestudy', + index=models.Index(fields=['slug'], name='case_studie_slug_2898e2_idx'), + ), + migrations.AddIndex( + model_name='casestudy', + index=models.Index(fields=['published'], name='case_studie_publish_c9c1aa_idx'), + ), + ] diff --git a/gnx-react/backend/case_studies/migrations/__init__.py b/gnx-react/backend/case_studies/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gnx-react/backend/case_studies/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/backend/case_studies/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 00000000..ab05be75 Binary files /dev/null and b/gnx-react/backend/case_studies/migrations/__pycache__/0001_initial.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/case_studies/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..37457131 Binary files /dev/null and b/gnx-react/backend/case_studies/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/gnx-react/backend/case_studies/models.py b/gnx-react/backend/case_studies/models.py new file mode 100644 index 00000000..cfedfc51 --- /dev/null +++ b/gnx-react/backend/case_studies/models.py @@ -0,0 +1,222 @@ +from django.db import models +from django.utils import timezone +from django.utils.text import slugify + + +class CaseStudyCategory(models.Model): + """Model for case study categories""" + name = models.CharField(max_length=100) + slug = models.SlugField(max_length=100, unique=True) + description = models.TextField(blank=True) + display_order = models.PositiveIntegerField(default=0) + is_active = models.BooleanField(default=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = "Case Study Category" + verbose_name_plural = "Case Study Categories" + ordering = ['display_order', 'name'] + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.name) + super().save(*args, **kwargs) + + +class Client(models.Model): + """Model for clients""" + name = models.CharField(max_length=200) + slug = models.SlugField(max_length=200, unique=True) + logo = models.ImageField(upload_to='case_studies/clients/', blank=True, null=True) + logo_url = models.CharField(max_length=500, blank=True, help_text="External logo URL") + description = models.TextField(blank=True) + website = models.URLField(blank=True) + is_active = models.BooleanField(default=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = "Client" + verbose_name_plural = "Clients" + ordering = ['name'] + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.name) + super().save(*args, **kwargs) + + @property + def get_logo_url(self): + """Return the logo URL (uploaded image or external URL)""" + if self.logo and hasattr(self.logo, 'url'): + return self.logo.url + elif self.logo_url: + return self.logo_url + return None + + +class CaseStudy(models.Model): + """Model for case studies""" + title = models.CharField(max_length=300) + slug = models.SlugField(max_length=300, unique=True) + subtitle = models.CharField(max_length=300, blank=True) + description = models.TextField() + excerpt = models.TextField(blank=True, help_text="Short excerpt for preview") + + # Images + thumbnail = models.ImageField(upload_to='case_studies/thumbnails/', blank=True, null=True) + thumbnail_url = models.CharField(max_length=500, blank=True, help_text="External thumbnail URL") + featured_image = models.ImageField(upload_to='case_studies/featured/', blank=True, null=True) + featured_image_url = models.CharField(max_length=500, blank=True, help_text="External featured image URL") + poster_image = models.ImageField(upload_to='case_studies/posters/', blank=True, null=True) + poster_image_url = models.CharField(max_length=500, blank=True, help_text="External poster image URL") + project_image = models.ImageField(upload_to='case_studies/projects/', blank=True, null=True) + project_image_url = models.CharField(max_length=500, blank=True, help_text="External project image URL") + + # Content sections + project_overview = models.TextField(blank=True, help_text="Project overview content") + site_map_content = models.TextField(blank=True, help_text="Site map / process content") + + # Relations + category = models.ForeignKey( + CaseStudyCategory, + on_delete=models.SET_NULL, + null=True, + related_name='case_studies' + ) + client = models.ForeignKey( + Client, + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name='case_studies' + ) + + # SEO and metadata + meta_description = models.CharField(max_length=160, blank=True) + meta_keywords = models.CharField(max_length=255, blank=True) + + # Status and visibility + published = models.BooleanField(default=True) + featured = models.BooleanField(default=False, help_text="Featured case study") + views_count = models.PositiveIntegerField(default=0) + display_order = models.PositiveIntegerField(default=0) + + # Timestamps + published_at = models.DateTimeField(default=timezone.now) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = "Case Study" + verbose_name_plural = "Case Studies" + ordering = ['display_order', '-published_at', '-created_at'] + indexes = [ + models.Index(fields=['-published_at']), + models.Index(fields=['slug']), + models.Index(fields=['published']), + ] + + def __str__(self): + return self.title + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.title) + if not self.excerpt and self.description: + # Generate excerpt from description (first 200 characters) + self.excerpt = self.description[:200] + '...' if len(self.description) > 200 else self.description + super().save(*args, **kwargs) + + @property + def get_thumbnail_url(self): + """Return the thumbnail URL (uploaded image or external URL)""" + if self.thumbnail and hasattr(self.thumbnail, 'url'): + return self.thumbnail.url + elif self.thumbnail_url: + return self.thumbnail_url + return None + + @property + def get_featured_image_url(self): + """Return the featured image URL (uploaded image or external URL)""" + if self.featured_image and hasattr(self.featured_image, 'url'): + return self.featured_image.url + elif self.featured_image_url: + return self.featured_image_url + return None + + @property + def get_poster_image_url(self): + """Return the poster image URL (uploaded image or external URL)""" + if self.poster_image and hasattr(self.poster_image, 'url'): + return self.poster_image.url + elif self.poster_image_url: + return self.poster_image_url + return None + + @property + def get_project_image_url(self): + """Return the project image URL (uploaded image or external URL)""" + if self.project_image and hasattr(self.project_image, 'url'): + return self.project_image.url + elif self.project_image_url: + return self.project_image_url + return None + + def increment_views(self): + """Increment the view count""" + self.views_count += 1 + self.save(update_fields=['views_count']) + + +class CaseStudyImage(models.Model): + """Model for additional case study images (gallery)""" + case_study = models.ForeignKey(CaseStudy, on_delete=models.CASCADE, related_name='gallery_images') + image = models.ImageField(upload_to='case_studies/gallery/') + image_url = models.CharField(max_length=500, blank=True, help_text="External image URL") + caption = models.CharField(max_length=200, blank=True) + display_order = models.PositiveIntegerField(default=0) + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + verbose_name = "Case Study Image" + verbose_name_plural = "Case Study Images" + ordering = ['display_order', 'created_at'] + + def __str__(self): + return f"{self.case_study.title} - Image {self.display_order}" + + @property + def get_image_url(self): + """Return the image URL (uploaded image or external URL)""" + if self.image and hasattr(self.image, 'url'): + return self.image.url + elif self.image_url: + return self.image_url + return None + + +class CaseStudyProcess(models.Model): + """Model for case study process steps""" + case_study = models.ForeignKey(CaseStudy, on_delete=models.CASCADE, related_name='process_steps') + title = models.CharField(max_length=200) + description = models.TextField() + step_number = models.PositiveIntegerField() + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + verbose_name = "Case Study Process" + verbose_name_plural = "Case Study Processes" + ordering = ['step_number'] + + def __str__(self): + return f"{self.case_study.title} - Step {self.step_number}: {self.title}" + diff --git a/gnx-react/backend/case_studies/serializers.py b/gnx-react/backend/case_studies/serializers.py new file mode 100644 index 00000000..6f66bfdc --- /dev/null +++ b/gnx-react/backend/case_studies/serializers.py @@ -0,0 +1,111 @@ +from rest_framework import serializers +from .models import CaseStudy, CaseStudyCategory, Client, CaseStudyImage, CaseStudyProcess + + +class CaseStudyCategorySerializer(serializers.ModelSerializer): + """Serializer for case study categories""" + case_studies_count = serializers.SerializerMethodField() + + class Meta: + model = CaseStudyCategory + fields = ['id', 'name', 'slug', 'description', 'display_order', 'case_studies_count'] + + def get_case_studies_count(self, obj): + return obj.case_studies.filter(published=True).count() + + +class ClientSerializer(serializers.ModelSerializer): + """Serializer for clients""" + logo = serializers.SerializerMethodField() + + class Meta: + model = Client + fields = ['id', 'name', 'slug', 'logo', 'description', 'website'] + + def get_logo(self, obj): + return obj.get_logo_url + + +class CaseStudyImageSerializer(serializers.ModelSerializer): + """Serializer for case study gallery images""" + image = serializers.SerializerMethodField() + + class Meta: + model = CaseStudyImage + fields = ['id', 'image', 'caption', 'display_order'] + + def get_image(self, obj): + return obj.get_image_url + + +class CaseStudyProcessSerializer(serializers.ModelSerializer): + """Serializer for case study process steps""" + class Meta: + model = CaseStudyProcess + fields = ['id', 'title', 'description', 'step_number'] + + +class CaseStudyListSerializer(serializers.ModelSerializer): + """Serializer for case study list view""" + category_name = serializers.CharField(source='category.name', read_only=True) + category_slug = serializers.CharField(source='category.slug', read_only=True) + client_name = serializers.CharField(source='client.name', read_only=True, allow_null=True) + thumbnail = serializers.SerializerMethodField() + + class Meta: + model = CaseStudy + fields = [ + 'id', 'title', 'slug', 'subtitle', 'excerpt', 'thumbnail', + 'category_name', 'category_slug', 'client_name', + 'published_at', 'created_at', 'updated_at', + 'views_count', 'featured', 'published', 'display_order' + ] + + def get_thumbnail(self, obj): + return obj.get_thumbnail_url + + +class CaseStudyDetailSerializer(serializers.ModelSerializer): + """Serializer for case study detail view""" + category = CaseStudyCategorySerializer(read_only=True) + client = ClientSerializer(read_only=True) + thumbnail = serializers.SerializerMethodField() + featured_image = serializers.SerializerMethodField() + poster_image = serializers.SerializerMethodField() + project_image = serializers.SerializerMethodField() + gallery_images = CaseStudyImageSerializer(many=True, read_only=True) + process_steps = CaseStudyProcessSerializer(many=True, read_only=True) + related_case_studies = serializers.SerializerMethodField() + + class Meta: + model = CaseStudy + fields = [ + 'id', 'title', 'slug', 'subtitle', 'description', 'excerpt', + 'thumbnail', 'featured_image', 'poster_image', 'project_image', + 'project_overview', 'site_map_content', + 'category', 'client', 'gallery_images', 'process_steps', + 'meta_description', 'meta_keywords', + 'published', 'featured', 'views_count', 'display_order', + 'published_at', 'created_at', 'updated_at', 'related_case_studies' + ] + + def get_thumbnail(self, obj): + return obj.get_thumbnail_url + + def get_featured_image(self, obj): + return obj.get_featured_image_url + + def get_poster_image(self, obj): + return obj.get_poster_image_url + + def get_project_image(self, obj): + return obj.get_project_image_url + + def get_related_case_studies(self, obj): + """Get related case studies from the same category""" + related = CaseStudy.objects.filter( + category=obj.category, + published=True + ).exclude(id=obj.id)[:3] + return CaseStudyListSerializer(related, many=True, context=self.context).data + diff --git a/gnx-react/backend/case_studies/tests.py b/gnx-react/backend/case_studies/tests.py new file mode 100644 index 00000000..9ef51e25 --- /dev/null +++ b/gnx-react/backend/case_studies/tests.py @@ -0,0 +1,5 @@ +# Test case for case_studies app +from django.test import TestCase + +# Create your tests here. + diff --git a/gnx-react/backend/case_studies/urls.py b/gnx-react/backend/case_studies/urls.py new file mode 100644 index 00000000..e13f357e --- /dev/null +++ b/gnx-react/backend/case_studies/urls.py @@ -0,0 +1,17 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .views import ( + CaseStudyViewSet, + CaseStudyCategoryViewSet, + ClientViewSet +) + +router = DefaultRouter() +router.register(r'case-studies', CaseStudyViewSet, basename='case-study') +router.register(r'categories', CaseStudyCategoryViewSet, basename='case-study-category') +router.register(r'clients', ClientViewSet, basename='client') + +urlpatterns = [ + path('', include(router.urls)), +] + diff --git a/gnx-react/backend/case_studies/views.py b/gnx-react/backend/case_studies/views.py new file mode 100644 index 00000000..14c6770e --- /dev/null +++ b/gnx-react/backend/case_studies/views.py @@ -0,0 +1,138 @@ +from rest_framework import viewsets, filters +from rest_framework.decorators import action +from rest_framework.response import Response +from rest_framework.pagination import PageNumberPagination +from django_filters.rest_framework import DjangoFilterBackend +from django.db.models import Q +from .models import CaseStudy, CaseStudyCategory, Client +from .serializers import ( + CaseStudyListSerializer, + CaseStudyDetailSerializer, + CaseStudyCategorySerializer, + ClientSerializer +) + + +class CaseStudyPagination(PageNumberPagination): + """Custom pagination for case studies""" + page_size = 9 + page_size_query_param = 'page_size' + max_page_size = 100 + + +class CaseStudyViewSet(viewsets.ReadOnlyModelViewSet): + """ + ViewSet for case studies + Supports filtering by category, client, and search + """ + queryset = CaseStudy.objects.filter(published=True) + pagination_class = CaseStudyPagination + filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] + filterset_fields = ['category__slug', 'client', 'featured'] + search_fields = ['title', 'description', 'excerpt'] + ordering_fields = ['published_at', 'views_count', 'created_at', 'display_order'] + ordering = ['display_order', '-published_at'] + lookup_field = 'slug' + + def get_serializer_class(self): + if self.action == 'retrieve': + return CaseStudyDetailSerializer + return CaseStudyListSerializer + + def get_queryset(self): + queryset = super().get_queryset() + + # Filter by category + category_slug = self.request.query_params.get('category', None) + if category_slug and category_slug != 'all': + queryset = queryset.filter(category__slug=category_slug) + + # Filter by client + client_slug = self.request.query_params.get('client', None) + if client_slug: + queryset = queryset.filter(client__slug=client_slug) + + # Search query + search = self.request.query_params.get('search', None) + if search: + queryset = queryset.filter( + Q(title__icontains=search) | + Q(description__icontains=search) | + Q(excerpt__icontains=search) + ) + + return queryset.distinct() + + def retrieve(self, request, *args, **kwargs): + """Override retrieve to increment view count""" + instance = self.get_object() + instance.increment_views() + serializer = self.get_serializer(instance) + return Response(serializer.data) + + @action(detail=False, methods=['get']) + def featured(self, request): + """Get featured case studies""" + featured_case_studies = self.get_queryset().filter(featured=True)[:6] + serializer = self.get_serializer(featured_case_studies, many=True) + return Response(serializer.data) + + @action(detail=False, methods=['get']) + def latest(self, request): + """Get latest case studies""" + limit = int(request.query_params.get('limit', 6)) + latest_case_studies = self.get_queryset()[:limit] + serializer = self.get_serializer(latest_case_studies, many=True) + return Response(serializer.data) + + @action(detail=False, methods=['get']) + def popular(self, request): + """Get popular case studies by views""" + limit = int(request.query_params.get('limit', 6)) + popular_case_studies = self.get_queryset().order_by('-views_count')[:limit] + serializer = self.get_serializer(popular_case_studies, many=True) + return Response(serializer.data) + + @action(detail=True, methods=['get']) + def related(self, request, slug=None): + """Get related case studies for a specific case study""" + case_study = self.get_object() + related_case_studies = self.get_queryset().filter( + category=case_study.category + ).exclude(id=case_study.id)[:4] + serializer = self.get_serializer(related_case_studies, many=True) + return Response(serializer.data) + + +class CaseStudyCategoryViewSet(viewsets.ReadOnlyModelViewSet): + """ViewSet for case study categories""" + queryset = CaseStudyCategory.objects.filter(is_active=True) + serializer_class = CaseStudyCategorySerializer + lookup_field = 'slug' + + @action(detail=False, methods=['get']) + def with_case_studies(self, request): + """Get categories that have published case studies""" + categories = self.get_queryset().filter(case_studies__published=True).distinct() + serializer = self.get_serializer(categories, many=True) + return Response(serializer.data) + + +class ClientViewSet(viewsets.ReadOnlyModelViewSet): + """ViewSet for clients""" + queryset = Client.objects.filter(is_active=True) + serializer_class = ClientSerializer + lookup_field = 'slug' + + @action(detail=True, methods=['get']) + def case_studies(self, request, slug=None): + """Get all case studies for a specific client""" + client = self.get_object() + case_studies = CaseStudy.objects.filter(client=client, published=True) + page = self.paginate_queryset(case_studies) + if page is not None: + serializer = CaseStudyListSerializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = CaseStudyListSerializer(case_studies, many=True) + return Response(serializer.data) + diff --git a/gnx-react/backend/db.sqlite3 b/gnx-react/backend/db.sqlite3 index fc426836..939ac093 100644 Binary files a/gnx-react/backend/db.sqlite3 and b/gnx-react/backend/db.sqlite3 differ diff --git a/gnx-react/backend/gnx/__pycache__/settings.cpython-312.pyc b/gnx-react/backend/gnx/__pycache__/settings.cpython-312.pyc index 16c77a4e..d3949d94 100644 Binary files a/gnx-react/backend/gnx/__pycache__/settings.cpython-312.pyc and b/gnx-react/backend/gnx/__pycache__/settings.cpython-312.pyc differ diff --git a/gnx-react/backend/gnx/__pycache__/urls.cpython-312.pyc b/gnx-react/backend/gnx/__pycache__/urls.cpython-312.pyc index b4089c00..0d60be92 100644 Binary files a/gnx-react/backend/gnx/__pycache__/urls.cpython-312.pyc and b/gnx-react/backend/gnx/__pycache__/urls.cpython-312.pyc differ diff --git a/gnx-react/backend/gnx/settings.py b/gnx-react/backend/gnx/settings.py index e24623c6..347cf31f 100644 --- a/gnx-react/backend/gnx/settings.py +++ b/gnx-react/backend/gnx/settings.py @@ -52,6 +52,8 @@ INSTALLED_APPS = [ 'about', 'career', 'support', + 'blog', + 'case_studies', ] MIDDLEWARE = [ @@ -155,7 +157,7 @@ REST_FRAMEWORK = { 'rest_framework.authentication.TokenAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAuthenticated', + 'rest_framework.permissions.AllowAny', # Allow public access to read-only endpoints ], 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 20, diff --git a/gnx-react/backend/gnx/urls.py b/gnx-react/backend/gnx/urls.py index e412b2c8..79c1329c 100644 --- a/gnx-react/backend/gnx/urls.py +++ b/gnx-react/backend/gnx/urls.py @@ -51,6 +51,8 @@ urlpatterns = [ path('about/', include('about.urls')), path('career/', include('career.urls')), path('support/', include('support.urls')), + path('blog/', include('blog.urls')), + path('case-studies/', include('case_studies.urls')), ])), ] diff --git a/gnx-react/backend/logs/django.log b/gnx-react/backend/logs/django.log index 009f3e72..ab856969 100644 --- a/gnx-react/backend/logs/django.log +++ b/gnx-react/backend/logs/django.log @@ -17123,3 +17123,1267 @@ INFO 2025-10-07 19:08:18,603 basehttp 109496 124621948974784 "GET /api/services/ INFO 2025-10-07 19:08:18,613 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 INFO 2025-10-07 19:08:18,684 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 INFO 2025-10-07 19:08:18,744 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:16:19,195 autoreload 5142 137635468096960 Watching for file changes with StatReloader +INFO 2025-10-08 09:16:42,611 basehttp 5142 137635301422784 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0 +INFO 2025-10-08 09:16:42,630 basehttp 5142 137635301422784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:16:42,695 basehttp 5142 137635301422784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:16:42,745 basehttp 5142 137635301422784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:16:42,795 basehttp 5142 137635301422784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:16:59,750 basehttp 5142 137635301422784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:16:59,755 basehttp 5142 137635284637376 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:16:59,755 basehttp 5142 137635293030080 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:16:59,764 basehttp 5142 137635301422784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:17:00,075 basehttp 5142 137635284637376 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:17:00,081 basehttp 5142 137635301422784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:17:00,083 basehttp 5142 137635293030080 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:17:00,091 basehttp 5142 137635301422784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:01,554 basehttp 5142 137635301422784 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195 +INFO 2025-10-08 09:25:01,567 basehttp 5142 137635284637376 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700 +INFO 2025-10-08 09:25:01,568 basehttp 5142 137635276244672 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195 +INFO 2025-10-08 09:25:01,569 basehttp 5142 137635259459264 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700 +INFO 2025-10-08 09:25:01,576 basehttp 5142 137635293030080 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589 +INFO 2025-10-08 09:25:01,579 basehttp 5142 137635267851968 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589 +INFO 2025-10-08 09:25:13,738 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:13,747 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:14,071 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:14,080 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:21,780 basehttp 5142 137635267851968 "OPTIONS /api/career/jobs/ HTTP/1.1" 200 0 +INFO 2025-10-08 09:25:21,790 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:21,804 basehttp 5142 137635267851968 "GET /api/career/jobs/ HTTP/1.1" 200 2334 +INFO 2025-10-08 09:25:21,844 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:21,854 basehttp 5142 137635293030080 "GET /api/career/jobs/ HTTP/1.1" 200 2334 +INFO 2025-10-08 09:25:22,184 basehttp 5142 137635267851968 "GET /api/career/jobs/ HTTP/1.1" 200 2334 +INFO 2025-10-08 09:25:22,189 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:22,229 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:22,237 basehttp 5142 137635267851968 "GET /api/career/jobs/ HTTP/1.1" 200 2334 +INFO 2025-10-08 09:25:34,223 basehttp 5142 137635267851968 "OPTIONS /api/about/page/ HTTP/1.1" 200 0 +INFO 2025-10-08 09:25:34,228 basehttp 5142 137635259459264 "OPTIONS /api/about/page/ HTTP/1.1" 200 0 +INFO 2025-10-08 09:25:34,239 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:34,268 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:34,276 basehttp 5142 137635267851968 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,283 basehttp 5142 137635259459264 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,403 basehttp 5142 137635259459264 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,405 basehttp 5142 137635284637376 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,405 basehttp 5142 137635293030080 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,414 basehttp 5142 137635267851968 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,552 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:34,580 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:34,582 basehttp 5142 137635259459264 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,602 basehttp 5142 137635267851968 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,620 basehttp 5142 137635259459264 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,683 basehttp 5142 137635293030080 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,699 basehttp 5142 137635293030080 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:34,729 basehttp 5142 137634911352512 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913 +INFO 2025-10-08 09:25:34,756 basehttp 5142 137635293030080 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:25:37,238 basehttp 5142 137634911352512 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913 +INFO 2025-10-08 09:25:38,501 basehttp 5142 137634911352512 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913 +INFO 2025-10-08 09:25:51,183 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:51,193 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:51,243 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:51,296 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:51,550 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:51,562 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:51,628 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:25:51,684 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:26:09,747 basehttp 5142 137635259459264 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:26:09,750 basehttp 5142 137635267851968 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:26:09,755 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:26:09,767 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:26:10,065 basehttp 5142 137635259459264 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:26:10,071 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:26:10,077 basehttp 5142 137635267851968 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:26:10,083 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:26:32,597 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:26:32,607 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:26:32,937 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:26:32,948 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:34:52,375 basehttp 5142 137635259459264 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:34:52,384 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:34:52,385 basehttp 5142 137635267851968 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:34:52,395 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:34:52,716 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:34:52,720 basehttp 5142 137635267851968 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:34:52,726 basehttp 5142 137635259459264 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:34:52,737 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:35:05,757 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:35:05,941 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:35:06,261 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:35:06,373 basehttp 5142 137635293030080 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:38:34,739 autoreload 5142 137635468096960 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/settings.py changed, reloading. +INFO 2025-10-08 09:38:35,354 autoreload 11024 130202041570752 Watching for file changes with StatReloader +INFO 2025-10-08 09:38:47,047 autoreload 11024 130202041570752 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/urls.py changed, reloading. +INFO 2025-10-08 09:38:47,587 autoreload 11111 124934072935872 Watching for file changes with StatReloader +INFO 2025-10-08 09:42:22,990 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:23,003 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:23,304 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:23,315 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:24,763 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:24,763 basehttp 11111 124933967439552 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:42:24,764 basehttp 11111 124933753534144 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:42:24,773 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:25,077 basehttp 11111 124933967439552 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:42:25,079 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:25,080 basehttp 11111 124933753534144 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 09:42:25,095 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:27,274 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:27,297 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:27,303 basehttp 11111 124933967439552 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,321 basehttp 11111 124933967439552 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,381 basehttp 11111 124933975832256 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,451 basehttp 11111 124933975832256 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,519 basehttp 11111 124933975832256 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,597 basehttp 11111 124933975832256 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,597 basehttp 11111 124933967439552 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:27,615 basehttp 11111 124933967439552 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:42:27,665 basehttp 11111 124933975832256 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,734 basehttp 11111 124933967439552 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,765 basehttp 11111 124933975832256 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,766 basehttp 11111 124933967439552 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,851 basehttp 11111 124933967439552 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,853 basehttp 11111 124933975832256 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 09:42:27,855 basehttp 11111 124933736748736 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913 +INFO 2025-10-08 09:42:29,127 basehttp 11111 124933736748736 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913 +INFO 2025-10-08 09:42:30,394 basehttp 11111 124933736748736 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913 +INFO 2025-10-08 09:43:28,505 basehttp 11111 124933975832256 "OPTIONS /blog/categories/ HTTP/1.1" 200 0 +INFO 2025-10-08 09:43:28,516 basehttp 11111 124933967439552 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:43:28,525 log 11111 124933975832256 Not Found: /blog/categories/ +WARNING 2025-10-08 09:43:28,526 basehttp 11111 124933975832256 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:43:28,660 log 11111 124933975832256 Not Found: /blog/categories/ +WARNING 2025-10-08 09:43:28,660 basehttp 11111 124933975832256 "GET /blog/categories/ HTTP/1.1" 404 2745 +INFO 2025-10-08 09:43:28,668 basehttp 11111 124933967439552 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:43:28,996 log 11111 124933967439552 Not Found: /blog/categories/ +WARNING 2025-10-08 09:43:29,003 basehttp 11111 124933967439552 "GET /blog/categories/ HTTP/1.1" 404 2745 +INFO 2025-10-08 09:43:29,003 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:43:29,145 log 11111 124933975832256 Not Found: /blog/categories/ +WARNING 2025-10-08 09:43:29,148 basehttp 11111 124933975832256 "GET /blog/categories/ HTTP/1.1" 404 2745 +INFO 2025-10-08 09:43:29,153 basehttp 11111 124933967439552 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:43:58,124 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:43:58,281 basehttp 11111 124933967439552 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:43:58,618 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:43:58,767 basehttp 11111 124933967439552 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:44:32,273 basehttp 11111 124933753534144 "OPTIONS /blog/posts/?page_size=50 HTTP/1.1" 200 0 +WARNING 2025-10-08 09:44:32,293 log 11111 124933967439552 Not Found: /blog/categories/ +WARNING 2025-10-08 09:44:32,301 log 11111 124933745141440 Not Found: /blog/posts/ +WARNING 2025-10-08 09:44:32,301 basehttp 11111 124933967439552 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:44:32,306 basehttp 11111 124933745141440 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +WARNING 2025-10-08 09:44:32,311 log 11111 124933736748736 Not Found: /blog/categories/ +INFO 2025-10-08 09:44:32,314 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:44:32,314 basehttp 11111 124933736748736 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:44:32,317 log 11111 124933967439552 Not Found: /blog/posts/ +WARNING 2025-10-08 09:44:32,321 basehttp 11111 124933967439552 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +INFO 2025-10-08 09:44:32,327 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:44:32,611 log 11111 124933975832256 Not Found: /blog/categories/ +WARNING 2025-10-08 09:44:32,612 log 11111 124933745141440 Not Found: /blog/categories/ +WARNING 2025-10-08 09:44:32,614 log 11111 124933736748736 Not Found: /blog/posts/ +WARNING 2025-10-08 09:44:32,617 log 11111 124933753534144 Not Found: /blog/posts/ +WARNING 2025-10-08 09:44:32,619 basehttp 11111 124933975832256 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:44:32,619 basehttp 11111 124933745141440 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:44:32,623 basehttp 11111 124933736748736 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +WARNING 2025-10-08 09:44:32,624 basehttp 11111 124933753534144 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +INFO 2025-10-08 09:44:32,624 basehttp 11111 124933967439552 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:44:32,634 basehttp 11111 124933975832256 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:47:46,173 autoreload 11111 124934072935872 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/blog/views.py changed, reloading. +INFO 2025-10-08 09:47:46,870 autoreload 13796 127977282074048 Watching for file changes with StatReloader +WARNING 2025-10-08 09:47:55,897 log 13796 127977090172608 Not Found: /blog/categories/ +WARNING 2025-10-08 09:47:55,900 basehttp 13796 127977090172608 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:47:55,908 log 13796 127976872081088 Not Found: /blog/posts/ +WARNING 2025-10-08 09:47:55,909 log 13796 127977106958016 Not Found: /blog/categories/ +WARNING 2025-10-08 09:47:55,910 basehttp 13796 127976872081088 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +WARNING 2025-10-08 09:47:55,911 basehttp 13796 127977106958016 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:47:55,916 log 13796 127977098565312 Not Found: /blog/posts/ +WARNING 2025-10-08 09:47:55,917 basehttp 13796 127977098565312 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +INFO 2025-10-08 09:47:55,917 basehttp 13796 127977115350720 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:47:55,926 basehttp 13796 127977115350720 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:48:26,739 log 13796 127976863688384 Forbidden: /api/blog/categories/ +WARNING 2025-10-08 09:48:26,739 basehttp 13796 127976863688384 "GET /api/blog/categories/ HTTP/1.1" 403 58 +INFO 2025-10-08 09:49:00,352 autoreload 14318 133874323559872 Watching for file changes with StatReloader +WARNING 2025-10-08 09:49:04,269 log 14318 133874063505088 Not Found: /blog/posts/ +WARNING 2025-10-08 09:49:04,276 basehttp 14318 133874063505088 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +WARNING 2025-10-08 09:49:04,280 log 14318 133874046719680 Not Found: /blog/posts/ +WARNING 2025-10-08 09:49:04,282 log 14318 133874147387072 Not Found: /blog/categories/ +WARNING 2025-10-08 09:49:04,283 basehttp 14318 133874147387072 "GET /blog/categories/ HTTP/1.1" 404 2745 +INFO 2025-10-08 09:49:04,283 basehttp 14318 133874155779776 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:49:04,284 basehttp 14318 133874046719680 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +WARNING 2025-10-08 09:49:04,286 log 14318 133874055112384 Not Found: /blog/categories/ +WARNING 2025-10-08 09:49:04,289 basehttp 14318 133874055112384 "GET /blog/categories/ HTTP/1.1" 404 2745 +INFO 2025-10-08 09:49:04,295 basehttp 14318 133874155779776 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:49:37,648 log 14318 133874038326976 Forbidden: /api/blog/categories/ +WARNING 2025-10-08 09:49:37,649 basehttp 14318 133874038326976 "GET /api/blog/categories/ HTTP/1.1" 403 58 +INFO 2025-10-08 09:50:06,573 autoreload 14318 133874323559872 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/settings.py changed, reloading. +INFO 2025-10-08 09:50:07,117 autoreload 14794 135560936703424 Watching for file changes with StatReloader +INFO 2025-10-08 09:50:33,113 autoreload 15101 125882494625216 Watching for file changes with StatReloader +INFO 2025-10-08 09:50:37,841 basehttp 15101 125882324743872 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0 +INFO 2025-10-08 09:50:37,845 basehttp 15101 125882324743872 "OPTIONS /blog/categories/ HTTP/1.1" 200 0 +INFO 2025-10-08 09:50:37,851 basehttp 15101 125882307958464 "OPTIONS /blog/posts/?page_size=50 HTTP/1.1" 200 0 +INFO 2025-10-08 09:50:37,859 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:50:37,885 basehttp 15101 125882291173056 "OPTIONS /blog/categories/ HTTP/1.1" 200 0 +INFO 2025-10-08 09:50:37,913 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 09:50:37,917 log 15101 125882316351168 Not Found: /blog/posts/ +WARNING 2025-10-08 09:50:37,919 log 15101 125882291173056 Not Found: /blog/categories/ +WARNING 2025-10-08 09:50:37,920 log 15101 125882324743872 Not Found: /blog/categories/ +WARNING 2025-10-08 09:50:37,921 basehttp 15101 125882316351168 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +WARNING 2025-10-08 09:50:37,922 basehttp 15101 125882291173056 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:50:37,923 basehttp 15101 125882324743872 "GET /blog/categories/ HTTP/1.1" 404 2745 +WARNING 2025-10-08 09:50:37,925 log 15101 125882299565760 Not Found: /blog/posts/ +WARNING 2025-10-08 09:50:37,925 basehttp 15101 125882299565760 "GET /blog/posts/?page_size=50 HTTP/1.1" 404 2743 +INFO 2025-10-08 09:52:12,727 basehttp 15101 125882316351168 "OPTIONS /api/blog/categories/ HTTP/1.1" 200 0 +INFO 2025-10-08 09:52:12,729 basehttp 15101 125882316351168 "OPTIONS /api/blog/posts/?page_size=50 HTTP/1.1" 200 0 +INFO 2025-10-08 09:52:12,735 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:52:12,760 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:52:12,763 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:52:12,833 basehttp 15101 125882316351168 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:52:12,835 basehttp 15101 125882291173056 "GET /api/blog/posts/?page_size=50 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:52:12,918 basehttp 15101 125882307958464 "GET /api/blog/posts/?page_size=50 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:52:17,030 basehttp 15101 125882282780352 "GET /api/blog/posts/ HTTP/1.1" 200 5943 +INFO 2025-10-08 09:52:22,020 basehttp 15101 125882282780352 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:52:26,292 basehttp 15101 125882316351168 "OPTIONS /api/blog/posts/?category=digital-transformation&page_size=50 HTTP/1.1" 200 0 +INFO 2025-10-08 09:52:26,306 basehttp 15101 125882291173056 "GET /api/blog/posts/?category=digital-transformation&page_size=50 HTTP/1.1" 200 1493 +INFO 2025-10-08 09:52:36,574 basehttp 15101 125882307958464 "GET /api/blog/posts/?page_size=50 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:52:39,844 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:53:14,828 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:53:14,852 basehttp 15101 125882316351168 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:53:14,864 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:53:14,885 basehttp 15101 125882316351168 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:53:14,891 basehttp 15101 125882307958464 "GET /api/blog/posts/?page_size=50 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:53:14,949 basehttp 15101 125882307958464 "GET /api/blog/posts/?page_size=50 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:55:04,272 basehttp 15101 125882316351168 "OPTIONS /api/blog/posts/?page_size=10 HTTP/1.1" 200 0 +INFO 2025-10-08 09:55:04,296 basehttp 15101 125882291173056 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:55:04,315 basehttp 15101 125882307958464 "GET /api/blog/posts/?page_size=10 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:55:07,625 basehttp 15101 125882316351168 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:55:07,628 basehttp 15101 125882291173056 "GET /api/blog/posts/?page_size=10 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:55:34,332 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:55:34,361 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:55:34,367 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:55:34,384 basehttp 15101 125882291173056 "GET /api/blog/posts/?page_size=10 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:55:34,396 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:55:34,418 basehttp 15101 125882291173056 "GET /api/blog/posts/?page_size=10 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:56:04,242 basehttp 15101 125882291173056 "OPTIONS /api/blog/posts/?page=1&page_size=10 HTTP/1.1" 200 0 +INFO 2025-10-08 09:56:04,257 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:56:04,295 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:56:04,309 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:56:04,338 basehttp 15101 125882291173056 "GET /api/blog/posts/?page=1&page_size=10 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:56:04,338 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:56:04,474 basehttp 15101 125882316351168 "GET /api/blog/posts/?page=1&page_size=10 HTTP/1.1" 200 5943 +INFO 2025-10-08 09:56:45,802 basehttp 15101 125882291173056 "OPTIONS /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 0 +INFO 2025-10-08 09:56:45,824 basehttp 15101 125882307958464 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:56:54,568 basehttp 15101 125882316351168 "OPTIONS /api/blog/posts/?page=2&page_size=6 HTTP/1.1" 200 0 +INFO 2025-10-08 09:56:54,592 basehttp 15101 125882291173056 "GET /api/blog/posts/?page=2&page_size=6 HTTP/1.1" 200 1622 +INFO 2025-10-08 09:57:01,266 basehttp 15101 125882307958464 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:57:04,771 basehttp 15101 125882316351168 "GET /api/blog/posts/?page=2&page_size=6 HTTP/1.1" 200 1622 +INFO 2025-10-08 09:57:10,442 basehttp 15101 125882291173056 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:57:53,623 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:57:53,636 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:57:53,699 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:57:53,710 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:57:54,039 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:57:54,050 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:57:54,098 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:57:54,115 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:58:18,102 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:58:18,106 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:58:18,130 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:58:18,130 basehttp 15101 125882316351168 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:58:18,138 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:58:18,155 basehttp 15101 125882316351168 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:58:18,418 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:58:18,438 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:58:18,443 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:58:18,465 basehttp 15101 125882307958464 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:58:18,466 basehttp 15101 125882316351168 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:58:18,490 basehttp 15101 125882316351168 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:58:55,456 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:06,516 basehttp 15101 125882316351168 "OPTIONS /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 0 +INFO 2025-10-08 09:59:06,516 basehttp 15101 125882291173056 "OPTIONS /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 0 +WARNING 2025-10-08 09:59:06,519 log 15101 125882316351168 Not Found: /api/blog/posts/the-future-of-enterprise-software-architecture/ +WARNING 2025-10-08 09:59:06,521 basehttp 15101 125882316351168 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 404 23 +INFO 2025-10-08 09:59:06,527 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:06,544 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:06,554 basehttp 15101 125882291173056 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +WARNING 2025-10-08 09:59:06,566 log 15101 125882316351168 Not Found: /api/blog/posts/the-future-of-enterprise-software-architecture/ +WARNING 2025-10-08 09:59:06,566 basehttp 15101 125882316351168 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 404 23 +INFO 2025-10-08 09:59:06,617 basehttp 15101 125882307958464 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +WARNING 2025-10-08 09:59:06,841 log 15101 125882316351168 Not Found: /api/blog/posts/the-future-of-enterprise-software-architecture/ +WARNING 2025-10-08 09:59:06,845 log 15101 125882299565760 Not Found: /api/blog/posts/the-future-of-enterprise-software-architecture/ +WARNING 2025-10-08 09:59:06,846 basehttp 15101 125882316351168 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 404 23 +WARNING 2025-10-08 09:59:06,846 basehttp 15101 125882299565760 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 404 23 +INFO 2025-10-08 09:59:06,862 basehttp 15101 125882291173056 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:06,880 basehttp 15101 125882316351168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:06,890 basehttp 15101 125882307958464 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 09:59:06,911 basehttp 15101 125882291173056 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 09:59:22,756 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:22,766 basehttp 15101 125882316351168 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:59:22,798 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:22,799 basehttp 15101 125882291173056 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:59:22,799 basehttp 15101 125882316351168 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:59:22,819 basehttp 15101 125882291173056 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:59:23,081 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:23,131 basehttp 15101 125882316351168 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:59:23,153 basehttp 15101 125882307958464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 09:59:23,170 basehttp 15101 125882316351168 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 09:59:23,174 basehttp 15101 125882291173056 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:59:23,194 basehttp 15101 125882291173056 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 09:59:53,253 autoreload 15101 125882494625216 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/blog/views.py changed, reloading. +INFO 2025-10-08 09:59:53,813 autoreload 19195 137306735912384 Watching for file changes with StatReloader +INFO 2025-10-08 10:00:01,404 basehttp 19195 137306413463232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:00:01,409 basehttp 19195 137306637858496 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:00:01,434 basehttp 19195 137306413463232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:00:01,447 basehttp 19195 137306637858496 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:00:01,459 basehttp 19195 137306629465792 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 10:00:01,500 basehttp 19195 137306629465792 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4473 +INFO 2025-10-08 10:00:04,898 basehttp 19195 137306413463232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:00:04,935 basehttp 19195 137306413463232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:00:04,960 basehttp 19195 137306629465792 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:00:04,964 basehttp 19195 137306388285120 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:00:04,978 basehttp 19195 137306637858496 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 10:00:05,013 basehttp 19195 137306413463232 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 10:00:05,201 basehttp 19195 137306413463232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:00:05,223 basehttp 19195 137306413463232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:00:05,233 basehttp 19195 137306637858496 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:00:05,262 basehttp 19195 137306629465792 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 10:00:05,264 basehttp 19195 137306637858496 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:00:05,288 basehttp 19195 137306413463232 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 10:00:07,723 autoreload 19195 137306735912384 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/blog/views.py changed, reloading. +INFO 2025-10-08 10:00:08,382 autoreload 19462 125875964745152 Watching for file changes with StatReloader +INFO 2025-10-08 10:00:14,821 basehttp 19462 125875798406848 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:00:14,848 basehttp 19462 125875798406848 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:00:14,869 basehttp 19462 125875790014144 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:00:14,895 basehttp 19462 125875781621440 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 10:00:14,906 basehttp 19462 125875790014144 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:00:14,924 basehttp 19462 125875798406848 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 10:00:38,351 basehttp 19462 125875798406848 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:00:50,289 basehttp 19462 125875773228736 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:01:03,348 autoreload 19462 125875964745152 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/blog/views.py changed, reloading. +INFO 2025-10-08 10:01:03,931 autoreload 19792 128704308315584 Watching for file changes with StatReloader +INFO 2025-10-08 10:02:14,299 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:02:14,322 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:02:14,323 basehttp 19792 128704130840256 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:02:14,347 basehttp 19792 128704122447552 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 10:02:14,358 basehttp 19792 128704130840256 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3558 +INFO 2025-10-08 10:02:14,378 basehttp 19792 128704122447552 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5893 +INFO 2025-10-08 10:03:51,576 basehttp 19792 128704210532032 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3559 +INFO 2025-10-08 10:06:22,396 basehttp 19792 128704210532032 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3559 +INFO 2025-10-08 10:06:47,786 basehttp 19792 128704130840256 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:06:47,791 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:06:47,822 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:06:47,826 basehttp 19792 128704130840256 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:06:47,831 basehttp 19792 128704122447552 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4474 +INFO 2025-10-08 10:06:47,852 basehttp 19792 128704122447552 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4474 +INFO 2025-10-08 10:06:48,134 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:06:48,151 basehttp 19792 128704122447552 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:06:48,166 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:06:48,170 basehttp 19792 128704130840256 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4474 +INFO 2025-10-08 10:06:48,185 basehttp 19792 128704122447552 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:06:48,203 basehttp 19792 128704130840256 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4474 +INFO 2025-10-08 10:06:50,770 basehttp 19792 128704130840256 "OPTIONS /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 0 +INFO 2025-10-08 10:06:50,789 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:06:50,818 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:06:50,826 basehttp 19792 128704130840256 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:06:50,834 basehttp 19792 128704122447552 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5894 +INFO 2025-10-08 10:06:50,859 basehttp 19792 128704122447552 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5894 +INFO 2025-10-08 10:06:50,885 basehttp 19792 128704210532032 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:06:51,087 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:06:51,112 basehttp 19792 128704122447552 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:06:51,117 basehttp 19792 128704210532032 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:06:51,142 basehttp 19792 128704130840256 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5894 +INFO 2025-10-08 10:06:51,150 basehttp 19792 128704122447552 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:06:51,169 basehttp 19792 128704130840256 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5894 +INFO 2025-10-08 10:07:34,205 basehttp 19792 128704210532032 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:08:10,711 autoreload 19792 128704308315584 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/blog/views.py changed, reloading. +INFO 2025-10-08 10:08:11,492 autoreload 21872 125695576667584 Watching for file changes with StatReloader +INFO 2025-10-08 10:09:08,623 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:09:08,632 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:09:08,660 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:09:08,661 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:09:08,667 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4474 +INFO 2025-10-08 10:09:08,687 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4474 +INFO 2025-10-08 10:09:08,953 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:09:08,970 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:09:08,982 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:09:08,990 basehttp 21872 125695401387712 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4474 +INFO 2025-10-08 10:09:08,994 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:09:09,016 basehttp 21872 125695401387712 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4474 +INFO 2025-10-08 10:09:14,729 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:09:14,762 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:09:14,781 basehttp 21872 125695409780416 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:09:14,793 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5894 +INFO 2025-10-08 10:09:14,818 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5894 +INFO 2025-10-08 10:09:14,842 basehttp 21872 125695409780416 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:09:15,072 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:09:15,088 basehttp 21872 125695409780416 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:09:15,099 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:09:15,125 basehttp 21872 125695409780416 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3020 +INFO 2025-10-08 10:09:15,129 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5894 +INFO 2025-10-08 10:09:15,153 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5894 +INFO 2025-10-08 10:09:27,001 basehttp 21872 125695401387712 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3021 +INFO 2025-10-08 10:09:29,774 basehttp 21872 125695409780416 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3021 +INFO 2025-10-08 10:11:06,615 basehttp 21872 125695170705088 "GET /admin/ HTTP/1.1" 200 24348 +INFO 2025-10-08 10:11:06,654 basehttp 21872 125695384602304 "GET /static/admin/css/base.css HTTP/1.1" 304 0 +INFO 2025-10-08 10:11:06,656 basehttp 21872 125695170705088 "GET /static/admin/css/dark_mode.css HTTP/1.1" 304 0 +INFO 2025-10-08 10:11:06,657 basehttp 21872 125695162312384 "GET /static/admin/js/theme.js HTTP/1.1" 304 0 +INFO 2025-10-08 10:11:06,657 basehttp 21872 125695153919680 "GET /static/admin/css/nav_sidebar.css HTTP/1.1" 304 0 +INFO 2025-10-08 10:11:06,658 basehttp 21872 125695145526976 "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 304 0 +INFO 2025-10-08 10:11:06,659 basehttp 21872 125695137134272 "GET /static/admin/css/responsive.css HTTP/1.1" 304 0 +INFO 2025-10-08 10:11:06,724 basehttp 21872 125695162312384 "GET /static/admin/img/icon-changelink.svg HTTP/1.1" 200 380 +INFO 2025-10-08 10:11:06,724 basehttp 21872 125695384602304 "GET /static/admin/img/icon-addlink.svg HTTP/1.1" 200 331 +INFO 2025-10-08 10:11:09,987 basehttp 21872 125695170705088 "GET /admin/blog/blogauthor/ HTTP/1.1" 200 22980 +INFO 2025-10-08 10:11:10,031 basehttp 21872 125695384602304 "GET /static/admin/img/icon-yes.svg HTTP/1.1" 200 436 +INFO 2025-10-08 10:11:10,032 basehttp 21872 125695162312384 "GET /static/admin/img/search.svg HTTP/1.1" 200 458 +INFO 2025-10-08 10:11:10,035 basehttp 21872 125695145526976 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:11:10,063 basehttp 21872 125695162312384 "GET /static/admin/img/sorting-icons.svg HTTP/1.1" 200 1097 +INFO 2025-10-08 10:11:10,063 basehttp 21872 125695145526976 "GET /static/admin/img/tooltag-add.svg HTTP/1.1" 200 331 +INFO 2025-10-08 10:11:12,346 basehttp 21872 125695170705088 "GET /admin/blog/blogcategory/ HTTP/1.1" 200 23629 +INFO 2025-10-08 10:11:12,389 basehttp 21872 125695145526976 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:11:13,827 basehttp 21872 125695170705088 "GET /admin/blog/blogcomment/ HTTP/1.1" 200 19733 +INFO 2025-10-08 10:11:13,869 basehttp 21872 125695145526976 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:11:15,532 basehttp 21872 125695170705088 "GET /admin/blog/blogpost/ HTTP/1.1" 200 29325 +INFO 2025-10-08 10:11:15,567 basehttp 21872 125695145526976 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:11:15,569 basehttp 21872 125695162312384 "GET /static/admin/img/icon-no.svg HTTP/1.1" 200 560 +INFO 2025-10-08 10:11:20,575 basehttp 21872 125695170705088 "GET /admin/blog/blogtag/ HTTP/1.1" 200 26320 +INFO 2025-10-08 10:11:20,615 basehttp 21872 125695145526976 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:11:21,489 basehttp 21872 125695401387712 "GET /api/blog/posts/digital-transformation-strategies-for-large-enterprises/ HTTP/1.1" 200 3021 +INFO 2025-10-08 10:12:12,150 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:12,174 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:12,194 basehttp 21872 125695409780416 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:12:12,208 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:12:12,210 basehttp 21872 125695409780416 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:12:12,233 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:12:12,522 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:12,525 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:12:12,545 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:12,546 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:12:12,561 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:12:12,576 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:12:16,676 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:16,688 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:16,757 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:16,815 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:17,091 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:17,102 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:17,164 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:12:17,220 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:13:49,637 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:13:49,637 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:13:49,673 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:13:49,674 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:13:49,678 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:13:49,699 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:13:49,996 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:13:50,001 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:13:50,014 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:13:50,026 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:13:50,028 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:13:50,049 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:13:53,712 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=2&page_size=6 HTTP/1.1" 200 1622 +INFO 2025-10-08 10:13:58,746 basehttp 21872 125695401387712 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4475 +INFO 2025-10-08 10:14:05,571 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:14:05,584 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:14:05,678 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:14:05,688 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:14:06,019 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:14:06,030 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:14:06,115 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:14:06,125 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:14:38,649 basehttp 21872 125695392995008 "OPTIONS /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 0 +INFO 2025-10-08 10:14:38,673 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5895 +INFO 2025-10-08 10:15:33,241 basehttp 21872 125695145526976 "GET /admin/blog/blogpost/ HTTP/1.1" 200 29325 +INFO 2025-10-08 10:15:33,280 basehttp 21872 125695145526976 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:15:34,265 basehttp 21872 125695145526976 "GET /admin/blog/blogpost/1/change/ HTTP/1.1" 200 38559 +INFO 2025-10-08 10:15:34,302 basehttp 21872 125695145526976 "GET /static/admin/js/SelectBox.js HTTP/1.1" 200 4530 +INFO 2025-10-08 10:15:34,308 basehttp 21872 125695170705088 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:15:34,309 basehttp 21872 125695162312384 "GET /static/admin/js/SelectFilter2.js HTTP/1.1" 200 15292 +INFO 2025-10-08 10:15:34,348 basehttp 21872 125695162312384 "GET /static/admin/img/icon-deletelink.svg HTTP/1.1" 200 392 +INFO 2025-10-08 10:15:34,348 basehttp 21872 125695170705088 "GET /static/admin/img/icon-viewlink.svg HTTP/1.1" 200 581 +INFO 2025-10-08 10:15:34,409 basehttp 21872 125695162312384 "GET /static/admin/img/icon-unknown.svg HTTP/1.1" 200 655 +INFO 2025-10-08 10:15:34,413 basehttp 21872 125695170705088 "GET /static/admin/img/selector-icons.svg HTTP/1.1" 200 3291 +INFO 2025-10-08 10:15:34,414 basehttp 21872 125695153919680 "GET /static/admin/img/icon-calendar.svg HTTP/1.1" 200 1086 +INFO 2025-10-08 10:15:34,415 basehttp 21872 125695145526976 "GET /static/admin/img/icon-clock.svg HTTP/1.1" 200 677 +INFO 2025-10-08 10:15:34,416 basehttp 21872 125695384602304 "GET /static/admin/img/icon-unknown-alt.svg HTTP/1.1" 200 655 +INFO 2025-10-08 10:16:29,874 basehttp 21872 125695145526976 "POST /admin/blog/blogpost/1/change/ HTTP/1.1" 302 0 +INFO 2025-10-08 10:16:29,912 basehttp 21872 125695145526976 "GET /admin/blog/blogpost/ HTTP/1.1" 200 29568 +INFO 2025-10-08 10:16:29,988 basehttp 21872 125695162312384 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:16:33,444 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:16:33,469 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:16:33,476 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:16:33,515 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:16:33,526 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:16:33,577 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:16:41,650 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:16:41,681 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:16:41,682 basehttp 21872 125695401387712 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:16:41,722 basehttp 21872 125695401387712 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:16:41,729 basehttp 21872 125695409780416 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:16:41,753 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:16:41,994 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:16:42,010 basehttp 21872 125695392995008 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:16:42,020 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:16:42,029 basehttp 21872 125695409780416 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:16:42,054 basehttp 21872 125695392995008 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:16:42,070 basehttp 21872 125695409780416 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:17:31,542 basehttp 21872 125695401387712 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:17:31,558 basehttp 21872 125695170705088 "GET /media/blog/thumbnails/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:17:31,577 basehttp 21872 125695170705088 "GET /media/blog/featured/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:17:39,418 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:39,435 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:39,438 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:17:39,500 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:39,505 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:17:39,548 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:39,822 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:39,837 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:39,848 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:17:39,916 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:39,918 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:39,926 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:17:46,867 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:46,888 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:17:46,899 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:46,904 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:17:46,913 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:17:46,950 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:17:47,215 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:47,215 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:17:47,234 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:47,249 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:17:47,252 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:17:47,276 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:17:54,135 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:54,154 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:54,167 basehttp 21872 125695401387712 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:17:54,180 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:17:54,204 basehttp 21872 125695401387712 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:17:54,216 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:17:54,440 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:54,474 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:17:54,474 basehttp 21872 125695401387712 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:17:54,502 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:17:54,506 basehttp 21872 125695401387712 "GET /api/blog/posts/the-future-of-enterprise-software-architecture/ HTTP/1.1" 200 3658 +INFO 2025-10-08 10:17:54,530 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=8 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:18:06,183 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:06,205 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:06,210 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:18:06,273 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:06,300 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:06,310 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:18:06,601 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:06,617 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:06,627 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:18:06,695 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:06,713 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:06,721 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:18:28,295 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:28,318 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:18:28,328 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:28,345 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:18:28,347 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:18:28,376 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:18:28,614 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:28,644 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:18:28,653 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:18:28,666 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:18:28,686 basehttp 21872 125695401387712 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:18:28,710 basehttp 21872 125695392995008 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:19:07,947 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:07,963 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:07,976 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:19:08,099 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:08,120 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:08,128 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:19:08,408 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:08,422 basehttp 21872 125695392995008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:08,434 basehttp 21872 125695401387712 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:19:08,524 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:08,539 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:08,549 basehttp 21872 125695392995008 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:19:43,436 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:48,356 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:48,366 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:19:48,382 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:48,396 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:19:48,398 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:19:48,421 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:19:48,685 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:48,702 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:19:48,706 basehttp 21872 125695401387712 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:19:48,726 basehttp 21872 125695392995008 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:19:48,729 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:19:48,749 basehttp 21872 125695409780416 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:22:57,950 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:22:57,997 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:22:58,338 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:22:58,375 basehttp 21872 125695409780416 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:24:27,280 autoreload 21872 125695576667584 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/settings.py changed, reloading. +INFO 2025-10-08 10:24:27,984 autoreload 28567 130567045809600 Watching for file changes with StatReloader +INFO 2025-10-08 10:24:29,465 autoreload 28567 130567045809600 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/urls.py changed, reloading. +INFO 2025-10-08 10:24:30,025 autoreload 28587 133953657501120 Watching for file changes with StatReloader +INFO 2025-10-08 10:25:23,187 basehttp 28587 133953482647232 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 10:25:23,199 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:25:23,207 basehttp 28587 133953474254528 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 10:25:23,217 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:25:23,511 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:25:23,511 basehttp 28587 133953482647232 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 10:25:23,519 basehttp 28587 133953474254528 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 10:25:23,524 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:26:46,425 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:26:46,462 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:26:46,811 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:26:46,841 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:27:45,946 basehttp 28587 133953491039936 "OPTIONS /case-studies/case-studies/ HTTP/1.1" 200 0 +INFO 2025-10-08 10:27:45,946 basehttp 28587 133953482647232 "OPTIONS /case-studies/clients/ HTTP/1.1" 200 0 +WARNING 2025-10-08 10:27:45,966 log 28587 133953482647232 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:27:45,967 log 28587 133953491039936 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:27:45,967 basehttp 28587 133953482647232 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:27:45,968 basehttp 28587 133953491039936 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:28:21,512 log 28587 133953474254528 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:28:21,523 log 28587 133953251964608 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:28:21,525 basehttp 28587 133953474254528 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:28:21,526 basehttp 28587 133953251964608 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:28:21,533 log 28587 133953482647232 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:28:21,535 log 28587 133953465861824 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:28:21,535 basehttp 28587 133953482647232 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:28:21,538 basehttp 28587 133953465861824 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +INFO 2025-10-08 10:28:21,539 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:28:21,548 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:28:22,649 log 28587 133953482647232 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:28:22,654 basehttp 28587 133953482647232 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:28:22,675 log 28587 133953474254528 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:28:22,675 basehttp 28587 133953474254528 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:28:22,680 log 28587 133953251964608 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:28:22,682 log 28587 133953465861824 Not Found: /case-studies/clients/ +INFO 2025-10-08 10:28:22,683 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:28:22,684 basehttp 28587 133953251964608 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:28:22,684 basehttp 28587 133953465861824 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:28:22,696 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:28:49,496 basehttp 28587 133953243571904 "GET /admin/blog/blogpost/ HTTP/1.1" 200 31225 +INFO 2025-10-08 10:28:49,537 basehttp 28587 133953243571904 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:28:56,309 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:28:56,312 log 28587 133953482647232 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:28:56,318 log 28587 133953474254528 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:28:56,319 basehttp 28587 133953474254528 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:28:56,328 log 28587 133953491039936 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:28:56,329 basehttp 28587 133953491039936 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:28:56,330 basehttp 28587 133953482647232 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:28:56,339 log 28587 133953465861824 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:28:56,339 basehttp 28587 133953465861824 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:28:56,354 basehttp 28587 133953474254528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:28:56,491 basehttp 28587 133953243571904 "GET /admin/career/jobposition/ HTTP/1.1" 200 29558 +INFO 2025-10-08 10:28:56,540 basehttp 28587 133953243571904 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +WARNING 2025-10-08 10:28:56,638 log 28587 133953235179200 Not Found: /favicon.ico +INFO 2025-10-08 10:28:58,098 basehttp 28587 133953243571904 "GET /admin/career/jobposition/2/change/ HTTP/1.1" 200 45894 +INFO 2025-10-08 10:28:58,151 basehttp 28587 133953243571904 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:29:04,765 basehttp 28587 133953243571904 "GET /admin/case_studies/casestudyprocess/ HTTP/1.1" 200 41217 +INFO 2025-10-08 10:29:04,810 basehttp 28587 133953243571904 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:29:08,428 basehttp 28587 133953243571904 "GET /admin/case_studies/casestudyimage/ HTTP/1.1" 200 37998 +INFO 2025-10-08 10:29:08,476 basehttp 28587 133953235179200 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +WARNING 2025-10-08 10:29:08,529 log 28587 133953235179200 Not Found: /favicon.ico +INFO 2025-10-08 10:29:09,835 basehttp 28587 133953243571904 "GET /admin/case_studies/casestudyimage/28/change/ HTTP/1.1" 200 25710 +INFO 2025-10-08 10:29:09,879 basehttp 28587 133953243571904 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:29:09,935 basehttp 28587 133953235179200 "GET /static/admin/img/icon-viewlink.svg HTTP/1.1" 200 581 +INFO 2025-10-08 10:29:14,646 basehttp 28587 133953243571904 "GET /admin/case_studies/casestudycategory/ HTTP/1.1" 200 25622 +INFO 2025-10-08 10:29:14,679 basehttp 28587 133953235179200 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +WARNING 2025-10-08 10:29:14,726 log 28587 133953235179200 Not Found: /favicon.ico +INFO 2025-10-08 10:29:18,361 basehttp 28587 133953243571904 "GET /admin/case_studies/casestudy/ HTTP/1.1" 200 31959 +INFO 2025-10-08 10:29:18,406 basehttp 28587 133953243571904 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:29:22,680 basehttp 28587 133953243571904 "GET /admin/case_studies/client/ HTTP/1.1" 200 25049 +INFO 2025-10-08 10:29:22,723 basehttp 28587 133953235179200 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:29:55,912 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:29:55,931 basehttp 28587 133953474254528 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:29:55,946 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:29:55,964 basehttp 28587 133953474254528 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:29:55,969 basehttp 28587 133953482647232 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:29:55,989 basehttp 28587 133953482647232 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:29:56,247 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:29:56,259 basehttp 28587 133953474254528 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:29:56,270 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:29:56,287 basehttp 28587 133953474254528 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:29:56,293 basehttp 28587 133953482647232 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:29:56,313 basehttp 28587 133953482647232 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:29:56,461 basehttp 28587 133953218393792 "GET /media/blog/thumbnails/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +WARNING 2025-10-08 10:30:03,411 log 28587 133953474254528 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:30:03,416 log 28587 133953465861824 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:30:03,418 basehttp 28587 133953474254528 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:30:03,419 basehttp 28587 133953465861824 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:30:03,421 log 28587 133953251964608 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:30:03,427 log 28587 133953482647232 Not Found: /case-studies/clients/ +INFO 2025-10-08 10:30:03,428 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:30:03,428 basehttp 28587 133953482647232 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:30:03,429 basehttp 28587 133953251964608 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:30:03,437 basehttp 28587 133953474254528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:30:03,727 log 28587 133953465861824 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:30:03,729 log 28587 133953251964608 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:30:03,730 log 28587 133953482647232 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:30:03,733 basehttp 28587 133953465861824 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:30:03,734 basehttp 28587 133953251964608 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:30:03,737 log 28587 133953474254528 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:30:03,738 basehttp 28587 133953482647232 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:30:03,746 basehttp 28587 133953474254528 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +INFO 2025-10-08 10:30:03,747 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:03,758 basehttp 28587 133953474254528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:10,553 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:10,569 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:10,573 basehttp 28587 133953474254528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:30:10,604 basehttp 28587 133953474254528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:30:10,622 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:10,674 basehttp 28587 133953474254528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:10,930 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:10,946 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:10,957 basehttp 28587 133953474254528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:30:11,023 basehttp 28587 133953491039936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:11,023 basehttp 28587 133953482647232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:30:11,024 basehttp 28587 133953474254528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:30:25,355 autoreload 31001 127738580809152 Watching for file changes with StatReloader +INFO 2025-10-08 10:30:39,453 autoreload 28587 133953657501120 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/case_studies/models.py changed, reloading. +INFO 2025-10-08 10:30:40,386 autoreload 31076 130008521229760 Watching for file changes with StatReloader +WARNING 2025-10-08 10:31:04,541 log 31076 130008345470656 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:31:04,545 log 31076 130008123176640 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:31:04,547 log 31076 130008114783936 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:31:04,549 basehttp 31076 130008345470656 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:31:04,549 basehttp 31076 130008123176640 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +INFO 2025-10-08 10:31:04,549 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:31:04,551 basehttp 31076 130008114783936 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:31:04,554 log 31076 130008337077952 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:31:04,558 basehttp 31076 130008337077952 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:31:04,565 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:31:04,830 log 31076 130008114783936 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:31:04,836 basehttp 31076 130008114783936 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:31:04,838 log 31076 130008337077952 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:31:04,847 basehttp 31076 130008337077952 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:31:04,849 log 31076 130008345470656 Not Found: /case-studies/case-studies/ +INFO 2025-10-08 10:31:04,856 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:31:04,856 basehttp 31076 130008345470656 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:31:04,859 log 31076 130008123176640 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:31:04,864 basehttp 31076 130008123176640 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:31:04,872 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:31:42,578 basehttp 31076 130008106391232 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5590 +INFO 2025-10-08 10:32:04,746 basehttp 31076 130008106391232 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:32:16,346 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:32:16,372 log 31076 130008345470656 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:32:16,377 log 31076 130008114783936 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:32:16,378 basehttp 31076 130008345470656 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:32:16,380 basehttp 31076 130008114783936 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:32:16,381 log 31076 130008123176640 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:32:16,385 log 31076 130008353863360 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:32:16,387 basehttp 31076 130008123176640 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:32:16,391 basehttp 31076 130008353863360 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +INFO 2025-10-08 10:32:16,391 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:32:19,450 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:32:19,455 basehttp 31076 130008345470656 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:32:19,485 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:32:19,488 basehttp 31076 130008114783936 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:32:19,491 basehttp 31076 130008345470656 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:32:19,518 basehttp 31076 130008114783936 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:32:19,791 basehttp 31076 130008345470656 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:32:19,791 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:32:19,819 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:32:19,825 basehttp 31076 130008345470656 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:32:19,827 basehttp 31076 130008114783936 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:32:19,854 basehttp 31076 130008114783936 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:32:20,041 basehttp 31076 130008106391232 "GET /media/blog/thumbnails/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:32:23,509 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:32:23,808 log 31076 130008114783936 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:32:23,811 basehttp 31076 130008114783936 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:32:23,813 log 31076 130008353863360 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:32:23,816 basehttp 31076 130008353863360 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +INFO 2025-10-08 10:32:23,820 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:32:23,834 log 31076 130008353863360 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:32:23,835 basehttp 31076 130008353863360 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:32:23,842 log 31076 130008345470656 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:32:23,842 basehttp 31076 130008345470656 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:32:23,875 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:32:24,131 log 31076 130008353863360 Not Found: /case-studies/case-studies/ +INFO 2025-10-08 10:32:24,132 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:32:24,147 basehttp 31076 130008353863360 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:32:24,151 log 31076 130008123176640 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:32:24,150 log 31076 130008337077952 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:32:24,149 log 31076 130008345470656 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:32:24,151 basehttp 31076 130008337077952 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:32:24,152 basehttp 31076 130008345470656 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:32:24,152 basehttp 31076 130008123176640 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +INFO 2025-10-08 10:32:24,166 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:32:28,890 log 31076 130008114783936 Not Found: /case-studies/clients/ +INFO 2025-10-08 10:32:28,892 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:32:28,893 basehttp 31076 130008114783936 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +WARNING 2025-10-08 10:32:28,895 log 31076 130008345470656 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:32:28,905 log 31076 130008123176640 Not Found: /case-studies/case-studies/ +WARNING 2025-10-08 10:32:28,905 basehttp 31076 130008345470656 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:32:28,906 log 31076 130008337077952 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:32:28,907 basehttp 31076 130008123176640 "GET /case-studies/case-studies/ HTTP/1.1" 404 2775 +WARNING 2025-10-08 10:32:28,910 basehttp 31076 130008337077952 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:32:28,916 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:33:35,251 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:33:35,263 log 31076 130008345470656 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:33:35,264 basehttp 31076 130008345470656 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:33:35,277 basehttp 31076 130008114783936 "OPTIONS /api/case-studies/case-studies/ HTTP/1.1" 200 0 +WARNING 2025-10-08 10:33:35,281 log 31076 130008353863360 Not Found: /case-studies/clients/ +WARNING 2025-10-08 10:33:35,282 basehttp 31076 130008353863360 "GET /case-studies/clients/ HTTP/1.1" 404 2760 +INFO 2025-10-08 10:33:35,287 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:33:35,333 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5590 +INFO 2025-10-08 10:33:35,434 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5590 +INFO 2025-10-08 10:33:55,947 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:33:55,968 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5590 +INFO 2025-10-08 10:33:55,975 basehttp 31076 130008114783936 "OPTIONS /api/case-studies/clients/ HTTP/1.1" 200 0 +INFO 2025-10-08 10:33:55,988 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:33:56,001 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:33:56,010 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5590 +INFO 2025-10-08 10:33:56,052 basehttp 31076 130008345470656 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:34:15,390 basehttp 31076 130008114783936 "OPTIONS /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 0 +INFO 2025-10-08 10:34:15,391 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:34:15,408 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:34:15,425 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,449 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,519 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,547 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,590 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,590 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,721 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:34:15,734 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:34:15,743 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,769 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,836 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,859 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3409 +INFO 2025-10-08 10:34:15,883 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3410 +INFO 2025-10-08 10:34:15,904 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ai-driven-user-experience-design-process/ HTTP/1.1" 200 3410 +INFO 2025-10-08 10:35:03,465 basehttp 31076 130008345470656 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:35:03,484 basehttp 31076 130008345470656 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:35:03,488 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:03,500 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5591 +INFO 2025-10-08 10:35:03,505 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:03,519 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5591 +INFO 2025-10-08 10:35:03,778 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:35:03,789 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:03,799 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:35:03,813 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5591 +INFO 2025-10-08 10:35:03,817 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:03,836 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5591 +INFO 2025-10-08 10:35:34,166 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:34,178 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:35:34,203 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:34,203 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:35:34,208 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5591 +INFO 2025-10-08 10:35:34,230 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5591 +INFO 2025-10-08 10:35:43,042 basehttp 31076 130008353863360 "OPTIONS /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 0 +INFO 2025-10-08 10:35:43,043 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:43,063 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:43,084 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,115 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,136 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,195 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,215 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,255 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,400 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:43,416 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,444 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:35:43,466 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,538 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3906 +INFO 2025-10-08 10:35:43,574 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:35:43,612 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:35:43,613 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:36:21,952 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:36:21,974 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:36:21,979 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:36:22,006 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:36:22,064 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:36:22,092 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:36:22,096 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:36:22,113 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 3907 +INFO 2025-10-08 10:36:47,341 basehttp 31076 130008123176640 "GET /admin/case_studies/client/ HTTP/1.1" 200 25049 +INFO 2025-10-08 10:36:47,385 basehttp 31076 130008123176640 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:36:54,324 basehttp 31076 130008123176640 "GET /admin/case_studies/casestudyprocess/ HTTP/1.1" 200 41217 +INFO 2025-10-08 10:36:54,365 basehttp 31076 130008123176640 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:36:57,913 basehttp 31076 130008123176640 "GET /admin/case_studies/casestudyprocess/33/change/ HTTP/1.1" 200 25056 +INFO 2025-10-08 10:36:57,969 basehttp 31076 130008337077952 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:36:57,970 basehttp 31076 130008106391232 "GET /static/admin/img/icon-viewlink.svg HTTP/1.1" 200 581 +INFO 2025-10-08 10:36:59,965 basehttp 31076 130008123176640 "GET /admin/case_studies/casestudyprocess/ HTTP/1.1" 200 41217 +INFO 2025-10-08 10:37:20,323 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:37:20,338 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:37:20,349 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:37:20,387 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:37:20,405 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:37:20,415 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:37:20,730 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:37:20,751 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:37:20,754 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:37:20,789 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:37:20,806 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:37:20,841 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:38:31,252 basehttp 31076 130008114783936 "OPTIONS /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 0 +INFO 2025-10-08 10:38:31,270 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3647 +WARNING 2025-10-08 10:38:47,301 log 31076 130008097998528 Not Found: /media//images/case/five.png +WARNING 2025-10-08 10:38:47,302 basehttp 31076 130008097998528 "GET /media//images/case/five.png HTTP/1.1" 404 2998 +WARNING 2025-10-08 10:38:51,602 log 31076 130008097998528 Not Found: /media//images/case/four.png +WARNING 2025-10-08 10:38:51,603 basehttp 31076 130008097998528 "GET /media//images/case/four.png HTTP/1.1" 404 2998 +INFO 2025-10-08 10:38:58,560 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:38:58,589 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3647 +INFO 2025-10-08 10:38:58,620 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:38:58,622 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:38:58,644 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:38:58,654 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3647 +INFO 2025-10-08 10:38:58,655 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:38:58,693 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +WARNING 2025-10-08 10:39:00,310 log 31076 130008123176640 Not Found: /media//images/case/two.png +WARNING 2025-10-08 10:39:00,310 basehttp 31076 130008123176640 "GET /media//images/case/two.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:39:02,474 log 31076 130008123176640 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:39:02,475 basehttp 31076 130008123176640 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:39:03,152 log 31076 130008123176640 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:39:03,153 basehttp 31076 130008123176640 "GET /media//images/case/three.png HTTP/1.1" 404 3002 +WARNING 2025-10-08 10:39:03,902 log 31076 130008123176640 Not Found: /media//images/case/four.png +WARNING 2025-10-08 10:39:03,903 basehttp 31076 130008123176640 "GET /media//images/case/four.png HTTP/1.1" 404 2998 +INFO 2025-10-08 10:39:06,620 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3647 +WARNING 2025-10-08 10:39:06,625 log 31076 130008123176640 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:39:06,626 basehttp 31076 130008123176640 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:39:06,667 log 31076 130008123176640 Not Found: /media//images/case/two.png +WARNING 2025-10-08 10:39:06,667 basehttp 31076 130008123176640 "GET /media//images/case/two.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:39:07,383 log 31076 130008123176640 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:39:07,384 basehttp 31076 130008123176640 "GET /media//images/case/three.png HTTP/1.1" 404 3002 +WARNING 2025-10-08 10:39:08,566 log 31076 130008123176640 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:39:08,568 basehttp 31076 130008123176640 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +INFO 2025-10-08 10:39:19,243 basehttp 31076 130008337077952 "GET /admin/case_studies/casestudy/ HTTP/1.1" 200 31961 +INFO 2025-10-08 10:39:19,275 basehttp 31076 130008337077952 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:39:19,321 basehttp 31076 130008123176640 "GET /static/admin/img/icon-yes.svg HTTP/1.1" 200 436 +INFO 2025-10-08 10:39:19,322 basehttp 31076 130008106391232 "GET /static/admin/img/icon-no.svg HTTP/1.1" 200 560 +INFO 2025-10-08 10:39:20,232 basehttp 31076 130008337077952 "GET /admin/case_studies/casestudy/7/change/ HTTP/1.1" 200 68505 +INFO 2025-10-08 10:39:20,277 basehttp 31076 130008106391232 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:39:20,281 basehttp 31076 130008106391232 "GET /static/admin/img/icon-deletelink.svg HTTP/1.1" 200 392 +INFO 2025-10-08 10:39:20,369 basehttp 31076 130008106391232 "GET /static/admin/img/inline-delete.svg HTTP/1.1" 200 560 +INFO 2025-10-08 10:39:28,439 basehttp 31076 130008337077952 "POST /admin/case_studies/casestudy/7/change/ HTTP/1.1" 200 68842 +INFO 2025-10-08 10:39:28,486 basehttp 31076 130008106391232 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:39:38,039 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:39:38,066 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:39:38,074 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3647 +INFO 2025-10-08 10:39:38,097 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:39:38,110 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3647 +INFO 2025-10-08 10:39:38,112 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:39:38,134 basehttp 31076 130008097998528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:39:38,147 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:39:39,809 log 31076 130008087508672 Not Found: /media//images/case/two.png +WARNING 2025-10-08 10:39:39,812 basehttp 31076 130008087508672 "GET /media//images/case/two.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:39:41,227 log 31076 130008087508672 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:39:41,227 basehttp 31076 130008087508672 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:39:42,384 log 31076 130008087508672 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:39:42,385 basehttp 31076 130008087508672 "GET /media//images/case/three.png HTTP/1.1" 404 3002 +WARNING 2025-10-08 10:39:43,482 log 31076 130008087508672 Not Found: /media//images/case/four.png +WARNING 2025-10-08 10:39:43,482 basehttp 31076 130008087508672 "GET /media//images/case/four.png HTTP/1.1" 404 2998 +WARNING 2025-10-08 10:39:45,827 log 31076 130008087508672 Not Found: /media//images/case/five.png +WARNING 2025-10-08 10:39:45,828 basehttp 31076 130008087508672 "GET /media//images/case/five.png HTTP/1.1" 404 2998 +INFO 2025-10-08 10:40:03,155 basehttp 31076 130008337077952 "POST /admin/case_studies/casestudy/7/change/ HTTP/1.1" 302 0 +INFO 2025-10-08 10:40:03,192 basehttp 31076 130008337077952 "GET /admin/case_studies/casestudy/ HTTP/1.1" 200 32210 +INFO 2025-10-08 10:40:03,281 basehttp 31076 130008106391232 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:40:06,500 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:40:06,542 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:40:06,556 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:40:06,569 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:40:06,573 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:40:06,589 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:40:06,600 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:40:06,619 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +WARNING 2025-10-08 10:40:08,080 log 31076 130008079115968 Not Found: /media//images/case/two.png +WARNING 2025-10-08 10:40:08,081 basehttp 31076 130008079115968 "GET /media//images/case/two.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:40:08,814 log 31076 130008079115968 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:40:08,814 basehttp 31076 130008079115968 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:40:12,549 log 31076 130008079115968 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:40:12,550 basehttp 31076 130008079115968 "GET /media//images/case/three.png HTTP/1.1" 404 3002 +WARNING 2025-10-08 10:40:13,730 log 31076 130008079115968 Not Found: /media//images/case/four.png +WARNING 2025-10-08 10:40:13,731 basehttp 31076 130008079115968 "GET /media//images/case/four.png HTTP/1.1" 404 2998 +WARNING 2025-10-08 10:40:15,036 log 31076 130008079115968 Not Found: /media//images/case/five.png +WARNING 2025-10-08 10:40:15,037 basehttp 31076 130008079115968 "GET /media//images/case/five.png HTTP/1.1" 404 2998 +INFO 2025-10-08 10:40:20,049 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:40:20,065 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:40:20,071 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:40:20,076 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:40:20,090 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:40:20,102 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:40:20,358 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:40:20,372 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:40:20,387 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:40:20,402 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:40:20,405 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:40:20,429 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:40:30,477 basehttp 31076 130008337077952 "GET /admin/case_studies/casestudy/7/change/ HTTP/1.1" 200 69254 +INFO 2025-10-08 10:40:30,521 basehttp 31076 130008106391232 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:40:55,407 basehttp 31076 130008337077952 "GET /media/case_studies/gallery/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:40:57,057 basehttp 31076 130008337077952 "GET /admin/case_studies/casestudy/7/change/ HTTP/1.1" 200 69254 +INFO 2025-10-08 10:41:54,087 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:54,092 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:41:54,116 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:41:54,122 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:41:54,136 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:54,153 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:41:58,235 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:58,256 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:58,277 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:41:58,304 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:58,315 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:41:58,331 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:58,331 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:41:58,359 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:41:58,638 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:58,651 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:41:58,657 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:58,682 basehttp 31076 130008114783936 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:41:58,685 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:41:58,703 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:41:58,716 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:41:58,734 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:41:58,771 log 31076 130008123176640 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:41:58,771 basehttp 31076 130008123176640 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:41:58,961 log 31076 130008123176640 Not Found: /media//images/case/two.png +WARNING 2025-10-08 10:41:58,963 log 31076 130008079115968 Not Found: /media//images/case/four.png +WARNING 2025-10-08 10:41:58,963 basehttp 31076 130008123176640 "GET /media//images/case/two.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:41:58,963 basehttp 31076 130008079115968 "GET /media//images/case/four.png HTTP/1.1" 404 2998 +WARNING 2025-10-08 10:41:59,714 log 31076 130008123176640 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:41:59,715 basehttp 31076 130008123176640 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:42:02,928 log 31076 130008123176640 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:42:02,929 basehttp 31076 130008123176640 "GET /media//images/case/three.png HTTP/1.1" 404 3002 +WARNING 2025-10-08 10:42:04,490 log 31076 130008123176640 Not Found: /media//images/case/five.png +WARNING 2025-10-08 10:42:04,490 basehttp 31076 130008123176640 "GET /media//images/case/five.png HTTP/1.1" 404 2998 +INFO 2025-10-08 10:42:14,585 basehttp 31076 130008097998528 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:42:14,593 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:14,607 basehttp 31076 130008345470656 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:42:14,613 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:14,617 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:42:14,634 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:42:14,886 basehttp 31076 130008097998528 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:42:14,899 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:14,910 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:42:14,910 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:42:14,917 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:14,931 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5585 +INFO 2025-10-08 10:42:19,765 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:42:19,766 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:19,786 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:19,791 basehttp 31076 130008097998528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:42:19,830 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:19,855 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:19,857 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:42:19,863 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:42:20,141 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:20,161 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:20,171 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:42:20,187 basehttp 31076 130008114783936 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:42:20,232 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3640 +INFO 2025-10-08 10:42:20,233 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:20,259 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:20,271 basehttp 31076 130008097998528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +WARNING 2025-10-08 10:42:21,513 log 31076 130008123176640 Not Found: /media//images/case/two.png +WARNING 2025-10-08 10:42:21,514 basehttp 31076 130008123176640 "GET /media//images/case/two.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:42:22,096 log 31076 130008123176640 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:42:22,096 basehttp 31076 130008123176640 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:42:22,718 log 31076 130008123176640 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:42:22,718 basehttp 31076 130008123176640 "GET /media//images/case/three.png HTTP/1.1" 404 3002 +WARNING 2025-10-08 10:42:23,111 log 31076 130008123176640 Not Found: /media//images/case/four.png +WARNING 2025-10-08 10:42:23,111 basehttp 31076 130008123176640 "GET /media//images/case/four.png HTTP/1.1" 404 2998 +WARNING 2025-10-08 10:42:23,709 log 31076 130008123176640 Not Found: /media//images/case/five.png +WARNING 2025-10-08 10:42:23,709 basehttp 31076 130008123176640 "GET /media//images/case/five.png HTTP/1.1" 404 2998 +INFO 2025-10-08 10:42:47,964 basehttp 31076 130008337077952 "POST /admin/case_studies/casestudy/7/change/ HTTP/1.1" 302 0 +INFO 2025-10-08 10:42:48,007 basehttp 31076 130008337077952 "GET /admin/case_studies/casestudy/ HTTP/1.1" 200 32210 +INFO 2025-10-08 10:42:48,088 basehttp 31076 130008337077952 "GET /admin/jsi18n/ HTTP/1.1" 200 3343 +INFO 2025-10-08 10:42:51,522 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:51,535 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:42:51,566 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:51,585 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:51,608 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:42:51,610 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:42:51,610 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:42:51,636 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:42:53,946 basehttp 31076 130008123176640 "GET /media/case_studies/thumbnails/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +WARNING 2025-10-08 10:42:54,894 log 31076 130008123176640 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:42:54,894 basehttp 31076 130008123176640 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:42:55,373 log 31076 130008123176640 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:42:55,373 basehttp 31076 130008123176640 "GET /media//images/case/three.png HTTP/1.1" 404 3002 +INFO 2025-10-08 10:43:00,929 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:00,929 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:00,953 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:00,957 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:00,965 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:00,983 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:01,261 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:01,264 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:01,269 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:01,280 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:01,287 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:01,298 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:07,487 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:07,488 basehttp 31076 130008114783936 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:43:07,510 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:07,525 basehttp 31076 130008345470656 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:43:07,526 basehttp 31076 130008097998528 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:43:07,549 basehttp 31076 130008114783936 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:43:07,826 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:07,826 basehttp 31076 130008097998528 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:43:07,852 basehttp 31076 130008114783936 "GET /api/blog/categories/ HTTP/1.1" 200 1007 +INFO 2025-10-08 10:43:07,861 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:07,866 basehttp 31076 130008345470656 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:43:07,889 basehttp 31076 130008353863360 "GET /api/blog/posts/?page=1&page_size=6 HTTP/1.1" 200 4501 +INFO 2025-10-08 10:43:08,007 basehttp 31076 130008123176640 "GET /media/blog/thumbnails/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:43:20,936 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:20,945 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:20,955 basehttp 31076 130008097998528 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:20,964 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:20,969 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:20,986 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:21,253 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:21,264 basehttp 31076 130008353863360 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:21,291 basehttp 31076 130008097998528 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:21,292 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:21,292 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:21,322 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:26,850 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:26,872 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:43:26,880 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:26,887 basehttp 31076 130008097998528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:43:26,919 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:26,940 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:26,952 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:43:26,971 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:43:27,255 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:27,277 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:27,284 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:43:27,309 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:27,313 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:43:27,329 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:43:27,342 basehttp 31076 130008097998528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:43:27,364 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +WARNING 2025-10-08 10:43:30,750 log 31076 130008123176640 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:43:30,751 basehttp 31076 130008123176640 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:43:32,711 log 31076 130008123176640 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:43:32,712 basehttp 31076 130008123176640 "GET /media//images/case/three.png HTTP/1.1" 404 3002 +INFO 2025-10-08 10:43:52,723 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:52,729 basehttp 31076 130008097998528 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:52,749 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:52,756 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:52,756 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:52,807 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:53,034 basehttp 31076 130008114783936 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:53,047 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:53,057 basehttp 31076 130008097998528 "GET /api/case-studies/clients/ HTTP/1.1" 200 571 +INFO 2025-10-08 10:43:53,067 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:53,071 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:53,090 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/ HTTP/1.1" 200 5626 +INFO 2025-10-08 10:43:54,812 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:54,830 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:54,839 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:54,865 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:54,866 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:54,883 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:54,942 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:54,946 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:55,117 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:55,132 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:43:55,135 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:55,167 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:55,169 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:55,206 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:55,207 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:55,217 basehttp 31076 130008123176640 "GET /media/case_studies/posters/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:43:55,219 basehttp 31076 130008106391232 "GET /media/case_studies/projects/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:43:55,233 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/3d-computer-graphics-or-3d-graphics/ HTTP/1.1" 200 4255 +INFO 2025-10-08 10:43:56,004 basehttp 31076 130008123176640 "GET /media/case_studies/gallery/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:43:56,005 basehttp 31076 130008106391232 "GET /media/case_studies/gallery/what-is-a-blog-1200x600-1_P4JD66T.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:43:56,020 basehttp 31076 130008087508672 "GET /media/case_studies/gallery/what-is-a-blog-1200x600-1_aXzf0tJ.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:43:56,021 basehttp 31076 130008079115968 "GET /media/case_studies/gallery/what-is-a-blog-1200x600-1_rzqiGWy.jpeg HTTP/1.1" 200 67330 +INFO 2025-10-08 10:44:01,225 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:01,242 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:01,264 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:44:01,275 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:44:01,328 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:01,372 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:01,379 basehttp 31076 130008345470656 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:44:01,381 basehttp 31076 130008114783936 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:44:01,652 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:01,677 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:01,679 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:44:01,691 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:44:01,756 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:44:01,768 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:01,786 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:01,798 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +WARNING 2025-10-08 10:44:01,864 log 31076 130008087508672 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:44:01,865 basehttp 31076 130008087508672 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +INFO 2025-10-08 10:44:07,053 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:07,065 basehttp 31076 130008097998528 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 10:44:07,066 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:07,068 basehttp 31076 130008353863360 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 10:44:07,386 basehttp 31076 130008097998528 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 10:44:07,387 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:07,392 basehttp 31076 130008345470656 "GET /api/support/categories/ HTTP/1.1" 200 1108 +INFO 2025-10-08 10:44:07,398 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,370 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,385 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,397 basehttp 31076 130008114783936 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:44:52,406 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:44:52,488 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,513 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:44:52,518 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,536 basehttp 31076 130008114783936 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:44:52,822 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,849 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:44:52,857 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,867 basehttp 31076 130008345470656 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:44:52,941 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,965 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:52,979 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:44:52,983 basehttp 31076 130008114783936 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:44:55,091 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:55,112 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:55,121 basehttp 31076 130008345470656 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,160 basehttp 31076 130008097998528 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,161 basehttp 31076 130008114783936 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,181 basehttp 31076 130008353863360 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,205 basehttp 31076 130008345470656 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,225 basehttp 31076 130008114783936 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,405 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:55,424 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:44:55,431 basehttp 31076 130008097998528 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,452 basehttp 31076 130008114783936 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,467 basehttp 31076 130008353863360 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,487 basehttp 31076 130008345470656 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,525 basehttp 31076 130008097998528 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,530 basehttp 31076 130008114783936 "GET /api/about/page/ HTTP/1.1" 200 5073 +INFO 2025-10-08 10:44:55,564 basehttp 31076 130008337077952 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913 +INFO 2025-10-08 10:44:59,731 basehttp 31076 130008337077952 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913 +INFO 2025-10-08 10:45:04,735 basehttp 31076 130008337077952 "GET /api/services/ HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:04,819 basehttp 31076 130008087508672 "GET /api/services/restful-api-development/ HTTP/1.1" 200 3414 +INFO 2025-10-08 10:45:05,093 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:05,124 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:05,457 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:05,496 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:12,647 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:12,649 basehttp 31076 130008345470656 "OPTIONS /api/services/ HTTP/1.1" 200 0 +INFO 2025-10-08 10:45:12,661 basehttp 31076 130008097998528 "GET /api/services/ HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:12,669 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:12,674 basehttp 31076 130008353863360 "GET /api/services/ HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:12,801 basehttp 31076 130008087508672 "GET /media/services/images/cross-platform-mobile-app.webp HTTP/1.1" 200 160008 +INFO 2025-10-08 10:45:36,941 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:36,958 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:37,273 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:37,283 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:49,887 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:49,895 basehttp 31076 130008097998528 "GET /api/career/jobs/ HTTP/1.1" 200 2334 +INFO 2025-10-08 10:45:49,957 basehttp 31076 130008353863360 "GET /api/career/jobs/ HTTP/1.1" 200 2334 +INFO 2025-10-08 10:45:49,964 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:50,279 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:50,279 basehttp 31076 130008097998528 "GET /api/career/jobs/ HTTP/1.1" 200 2334 +INFO 2025-10-08 10:45:50,327 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:45:50,331 basehttp 31076 130008114783936 "GET /api/career/jobs/ HTTP/1.1" 200 2334 +INFO 2025-10-08 10:46:03,755 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:46:03,784 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:46:03,790 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:46:03,801 basehttp 31076 130008353863360 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:46:03,839 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:46:03,861 basehttp 31076 130008097998528 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:46:03,874 basehttp 31076 130008353863360 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:46:03,881 basehttp 31076 130008114783936 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:46:04,172 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:46:04,191 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:46:04,192 basehttp 31076 130008114783936 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:46:04,209 basehttp 31076 130008097998528 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +INFO 2025-10-08 10:46:04,251 basehttp 31076 130008345470656 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:46:04,256 basehttp 31076 130008353863360 "GET /api/case-studies/case-studies/?ordering=display_order&page_size=5 HTTP/1.1" 200 3681 +INFO 2025-10-08 10:46:04,269 basehttp 31076 130008097998528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882 +INFO 2025-10-08 10:46:04,275 basehttp 31076 130008114783936 "GET /api/blog/posts/latest/?limit=12 HTTP/1.1" 200 5921 +WARNING 2025-10-08 10:46:04,330 log 31076 130008087508672 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:46:04,330 basehttp 31076 130008087508672 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +INFO 2025-10-08 10:46:04,456 basehttp 31076 130008087508672 "GET /media/case_studies/thumbnails/what-is-a-blog-1200x600-1.jpeg HTTP/1.1" 200 67330 +WARNING 2025-10-08 10:46:04,560 log 31076 130008087508672 Not Found: /media//images/case/one.png +WARNING 2025-10-08 10:46:04,561 basehttp 31076 130008087508672 "GET /media//images/case/one.png HTTP/1.1" 404 2994 +WARNING 2025-10-08 10:46:05,263 log 31076 130008087508672 Not Found: /media//images/case/three.png +WARNING 2025-10-08 10:46:05,263 basehttp 31076 130008087508672 "GET /media//images/case/three.png HTTP/1.1" 404 3002 diff --git a/gnx-react/backend/media/blog/featured/what-is-a-blog-1200x600-1.jpeg b/gnx-react/backend/media/blog/featured/what-is-a-blog-1200x600-1.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/blog/featured/what-is-a-blog-1200x600-1.jpeg differ diff --git a/gnx-react/backend/media/blog/thumbnails/what-is-a-blog-1200x600-1.jpeg b/gnx-react/backend/media/blog/thumbnails/what-is-a-blog-1200x600-1.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/blog/thumbnails/what-is-a-blog-1200x600-1.jpeg differ diff --git a/gnx-react/backend/media/case_studies/featured/what-is-a-blog-1200x600-1.jpeg b/gnx-react/backend/media/case_studies/featured/what-is-a-blog-1200x600-1.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/case_studies/featured/what-is-a-blog-1200x600-1.jpeg differ diff --git a/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1.jpeg b/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1.jpeg differ diff --git a/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_P4JD66T.jpeg b/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_P4JD66T.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_P4JD66T.jpeg differ diff --git a/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_aXzf0tJ.jpeg b/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_aXzf0tJ.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_aXzf0tJ.jpeg differ diff --git a/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_rzqiGWy.jpeg b/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_rzqiGWy.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/case_studies/gallery/what-is-a-blog-1200x600-1_rzqiGWy.jpeg differ diff --git a/gnx-react/backend/media/case_studies/posters/what-is-a-blog-1200x600-1.jpeg b/gnx-react/backend/media/case_studies/posters/what-is-a-blog-1200x600-1.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/case_studies/posters/what-is-a-blog-1200x600-1.jpeg differ diff --git a/gnx-react/backend/media/case_studies/projects/what-is-a-blog-1200x600-1.jpeg b/gnx-react/backend/media/case_studies/projects/what-is-a-blog-1200x600-1.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/case_studies/projects/what-is-a-blog-1200x600-1.jpeg differ diff --git a/gnx-react/backend/media/case_studies/thumbnails/what-is-a-blog-1200x600-1.jpeg b/gnx-react/backend/media/case_studies/thumbnails/what-is-a-blog-1200x600-1.jpeg new file mode 100644 index 00000000..1c6c6f9f Binary files /dev/null and b/gnx-react/backend/media/case_studies/thumbnails/what-is-a-blog-1200x600-1.jpeg differ diff --git a/gnx-react/components/pages/blog/BlogItems.tsx b/gnx-react/components/pages/blog/BlogItems.tsx index 2861432c..82c50616 100644 --- a/gnx-react/components/pages/blog/BlogItems.tsx +++ b/gnx-react/components/pages/blog/BlogItems.tsx @@ -1,13 +1,73 @@ +"use client"; +import { useState } from "react"; import Link from "next/link"; import PostFilterItems from "./post-filter/PostFilterItems"; const BlogItems = () => { + const [currentPage, setCurrentPage] = useState(1); + const [totalPages, setTotalPages] = useState(1); + const postsPerPage = 6; + + const handlePageChange = (page: number) => { + if (page >= 1 && page <= totalPages) { + setCurrentPage(page); + // Scroll to top of posts section + window.scrollTo({ top: 0, behavior: 'smooth' }); + } + }; + + const handleTotalPagesChange = (total: number) => { + setTotalPages(total); + }; + + // Generate page numbers to display + const getPageNumbers = () => { + const pages: (number | string)[] = []; + const maxPagesToShow = 5; + + if (totalPages <= maxPagesToShow) { + // Show all pages if total is small + for (let i = 1; i <= totalPages; i++) { + pages.push(i); + } + } else { + // Show first page + pages.push(1); + + // Calculate range around current page + let startPage = Math.max(2, currentPage - 1); + let endPage = Math.min(totalPages - 1, currentPage + 1); + + // Add ellipsis after first page if needed + if (startPage > 2) { + pages.push('...'); + } + + // Add pages around current page + for (let i = startPage; i <= endPage; i++) { + pages.push(i); + } + + // Add ellipsis before last page if needed + if (endPage < totalPages - 1) { + pages.push('...'); + } + + // Show last page + if (totalPages > 1) { + pages.push(totalPages); + } + } + + return pages; + }; + return (Scope:
-Denial Lio
- -18 Dec 2022
-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec - nec tortor id erat faucibus tempor id eget turpis. Donec - lobortis et neque eget congue. Mauris laoreet orci ac dictum - interdum. Sed dapibus convallis arcu, a aliquam purus sodales - nec. Integer consequat et magna sit amet porta. Maecenas - consectetur eros sed risus porta convallis eget et massa. - Integer auctor convallis ligula, sit amet sollicitudin justo - tincidunt a. Sed tellus diam. -
-- Bibendum tincidunt orci vel, sollicitudin bibendum ligula. - Pellentesque sollicitudin nulla felis, a ornare tellus - tristique ac. Proin ultricies a turpis sit amet lacinia. Ut - laoreet nunc leo, ac congue enim laoreet in. Aenean suscipit - arcu at ligula tempor porta. -
-- Quisque et fringilla lacus, quis luctus elit. Curabitur eu dui - mattis turpis commodo eleifend. Sed porta ornare nunc et - tristique. Curabitur vel eros a ante cursus lacinia. Nam nisl - leo, aliquet a placerat at, porttitor quis augue. Proin quis - aliquet libero. Pellentesque habitant morbi tristique senectus - et netus et malesuada fames ac turpis egestas. Vestibulum - varius a ipsum ornare blandit. Integer vitae eleifend risus, - id tincidunt elit. Integer tincidunt ipsum vitae sagittis - porta. Aenean ut facilisis dui. Praesent at ultricies purus. - Nam a arcu vel diam ullamcorper tincidunt. Curabitur - vestibulum commodo erat non laoreet. Proin nibh nibh, - scelerisque a nibh nec, scelerisque convallis leo. Nunc eget - elit nunc. -
-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. - Donec nec tortor id erat faucibus tempor id eget turpis. - Donec lobortis et neque eget congue. Mauris laoreet orci - ac dictum interdum. Sed dapibus convallis arcu, a aliquam - purus sodales nec. -
-- Quisque et fringilla lacus, quis luctus elit. Curabitur eu - dui mattis turpis commodo eleifend. Sed porta ornare nunc - et tristique. Curabitur vel eros a ante cursus lacinia. - Nam nisl leo, aliquet a placerat at, porttitor quis augue. - Proin quis aliquet libero. Pellentesque habitant morbi - tristique senectus et netus et malesuada fames ac turpis - egestas. Vestibulum varius a ipsum ornare blandit. -
-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec - nec tortor id erat faucibus tempor id eget turpis. Donec - lobortis et neque eget congue. Mauris laoreet orci ac dictum - interdum. Sed dapibus convallis arcu, a aliquam purus sodales - nec. -
-- Quisque et fringilla lacus, quis luctus elit. Curabitur eu dui - mattis turpis commodo eleifend. Sed porta ornare nunc et - tristique. Curabitur vel eros a ante cursus lacinia. Nam nisl - leo, aliquet a placerat at, porttitor quis augue. Proin quis - aliquet libero. Pellentesque habitant morbi tristique senectus - et netus et malesuada fames ac turpis egestas. Vestibulum - varius a ipsum ornare blandit. -
-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec - nec tortor id erat faucibus tempor id eget turpis. Donec - lobortis et neque eget congue. Mauris laoreet orci ac dictum - interdum. Sed dapibus convallis arcu, a aliquam purus sodales - nec. -
-- Quisque et fringilla lacus, quis luctus elit. Curabitur eu dui - mattis turpis commodo eleifend. Sed porta ornare nunc et - tristique. Curabitur vel eros a ante cursus lacinia. Nam nisl - leo, aliquet a placerat at, porttitor quis augue. Proin quis - aliquet libero. Pellentesque habitant morbi tristique senectus - et netus et malesuada fames ac turpis egestas. Vestibulum - varius a ipsum ornare blandit. -
+Loading insight...
Share :
-+ The insight you're looking for doesn't exist or has been removed. +
+ + + Back to Insights + +{post.excerpt}
+Loading latest posts...
+- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
- Denial Lio -
- -- 18 Dec 2022 -
++ {post.author_name || 'Admin'} +
+ ++ {new Date(post.published_at || post.created_at).toLocaleDateString('en-US', { + day: 'numeric', + month: 'short', + year: 'numeric' + })} +
+- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-Loading categories...
+Loading posts...
+Error loading posts. Please try again later.
+- {new Date(item.created_at).toLocaleDateString('en-US', { + {new Date(item.published_at || item.created_at).toLocaleDateString('en-US', { day: 'numeric', month: 'short', year: 'numeric' @@ -145,7 +124,7 @@ const PostFilterItems = () => {
Loading case studies...
+No case studies found.
- Lorem ipsum dolor sit amet consectetur. Pharetra sit - amet est tellus nibh sit lacus in duis. Condimentum - tellus sit pharetra consectetur magna massa. In odio - leo pellentesque aenean egestas est risus etiam. - Quam in nunc consectetur blandit id. -
-+ {caseStudy.excerpt || caseStudy.client?.description} +
+- Lorem ipsum dolor sit amet consectetur. Pharetra sit - amet est tellus nibh sit lacus in duis. Condimentum - tellus sit pharetra consectetur magna massa. In odio - leo pellentesque aenean egestas est risus etiam. - Quam in nunc consectetur blandit id. -
-- Lorem ipsum dolor sit amet consectetur. Pharetra sit - amet est tellus nibh sit lacus in duis. Condimentum - tellus sit pharetra consectetur magna massa. In odio - leo pellentesque aenean egestas est risus etiam. - Quam in nunc consectetur blandit id. -
-No client case studies found.
- Lorem ipsum dolor sit amet consectetur. Pharetra sit - amet est tellus nibh sit lacus in duis. Condimentum - tellus sit pharetra consectetur magna massa. In odio - leo pellentesque aenean egestas est risus etiam. - Quam in nunc consectetur blandit id. -
-Loading case study...
+Case study not found.
+- Lorem ipsum dolor sit amet consectetur. Vestibulum - malesuada amet sagittis urna. Mattis eget ultricies est - morbi velit ultrices viverra elit facilisi. Amet est cras - euismod accumsan ornare sagittis ut integer. Sagittis sed - neque massa amet. Lorem vulputate nunc pulvinar maecenas - convallis augue. Magna massa viverra tincidunt vitae lacus - donec arcu consequat in. Maecenas dui nunc in convallis - vulputate vitae lectus eu lacus donec arcu consequat in. - Maecenas dui nunc in convallis vulputate vitae lectus eu. -
+ {caseStudy.project_overview ? ( +{caseStudy.project_overview}
+ ) : ( + + )}- Lorem ipsum dolor sit amet consectetur. Vestibulum - malesuada amet sagittis urna. Mattis eget ultricies est - morbi velit ultrices viverra elit facilisi. Amet est cras - euismod accumsan ornare sagittis ut integer. Sagittis sed - neque massa amet. Lorem vulputate nunc pulvinar maecenas - convallis augue. Magna massa viverra tincidunt vitae lacus - donec arcu consequat in. Maecenas dui nunc in convallis - vulputate vitae lectus eu. -
-{caseStudy.site_map_content}
- Quisque varius malesuada dui, ut posuere purus gravida in. - Phasellus ultricies ullamcorper mollis. Pellentesque varius - lectus in massa placerat cursus. Donec in dictum nisl. In - maximus posuere leo nec porttitor. + {caseStudy.excerpt}
- Quisque varius malesuada dui, ut posuere purus gravida in. - Phasellus ultricies ullamcorper mollis. -
-- Quisque varius malesuada dui, ut posuere purus gravida in. - Phasellus ultricies ullamcorper mollis. -
-- Quisque varius malesuada dui, ut posuere purus gravida in. - Phasellus ultricies ullamcorper mollis. -
-- Quisque varius malesuada dui, ut posuere purus gravida in. - Phasellus ultricies ullamcorper mollis. -
-- Quisque varius malesuada dui, ut posuere purus gravida in. - Phasellus ultricies ullamcorper mollis. -
-+ {step.description} +
+- Denial Lio -
- -- 18 Dec 2022 -
+ {loading ? ( +Loading insights...
+Error loading insights. Please try again later.
+No insights available yet.
++ {post.author_name || 'Admin'} +
+ ++ {new Date(post.published_at || post.created_at).toLocaleDateString('en-US', { + day: 'numeric', + month: 'short', + year: 'numeric' + })} +
+- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- Denial Lio -
- -- 18 Dec 2022 -
-- {item.destination} + + {item.category_name || "Case Study"} +
{item.subtitle}
+{item.excerpt}