diff --git a/crimsonbouquet/content/__pycache__/__init__.cpython-37.pyc b/crimsonbouquet/content/__pycache__/__init__.cpython-37.pyc old mode 100755 new mode 100644 index 2d74ef3..0d60a61 Binary files a/crimsonbouquet/content/__pycache__/__init__.cpython-37.pyc and b/crimsonbouquet/content/__pycache__/__init__.cpython-37.pyc differ diff --git a/crimsonbouquet/content/__pycache__/admin.cpython-37.pyc b/crimsonbouquet/content/__pycache__/admin.cpython-37.pyc old mode 100755 new mode 100644 index a0fbba6..e9b99ef Binary files a/crimsonbouquet/content/__pycache__/admin.cpython-37.pyc and b/crimsonbouquet/content/__pycache__/admin.cpython-37.pyc differ diff --git a/crimsonbouquet/content/__pycache__/apps.cpython-37.pyc b/crimsonbouquet/content/__pycache__/apps.cpython-37.pyc old mode 100755 new mode 100644 index f0b342a..c9a394c Binary files a/crimsonbouquet/content/__pycache__/apps.cpython-37.pyc and b/crimsonbouquet/content/__pycache__/apps.cpython-37.pyc differ diff --git a/crimsonbouquet/content/__pycache__/models.cpython-37.pyc b/crimsonbouquet/content/__pycache__/models.cpython-37.pyc old mode 100755 new mode 100644 index 87d208a..a4e11f7 Binary files a/crimsonbouquet/content/__pycache__/models.cpython-37.pyc and b/crimsonbouquet/content/__pycache__/models.cpython-37.pyc differ diff --git a/crimsonbouquet/content/__pycache__/schema.cpython-37.pyc b/crimsonbouquet/content/__pycache__/schema.cpython-37.pyc old mode 100755 new mode 100644 index ef248d3..283e75a Binary files a/crimsonbouquet/content/__pycache__/schema.cpython-37.pyc and b/crimsonbouquet/content/__pycache__/schema.cpython-37.pyc differ diff --git a/crimsonbouquet/content/__pycache__/urls.cpython-37.pyc b/crimsonbouquet/content/__pycache__/urls.cpython-37.pyc old mode 100755 new mode 100644 index 6328616..89466b3 Binary files a/crimsonbouquet/content/__pycache__/urls.cpython-37.pyc and b/crimsonbouquet/content/__pycache__/urls.cpython-37.pyc differ diff --git a/crimsonbouquet/content/__pycache__/views.cpython-37.pyc b/crimsonbouquet/content/__pycache__/views.cpython-37.pyc old mode 100755 new mode 100644 index 5b89d4e..b8b6e30 Binary files a/crimsonbouquet/content/__pycache__/views.cpython-37.pyc and b/crimsonbouquet/content/__pycache__/views.cpython-37.pyc differ diff --git a/crimsonbouquet/content/admin.py b/crimsonbouquet/content/admin.py index ec50db8..8f000b1 100755 --- a/crimsonbouquet/content/admin.py +++ b/crimsonbouquet/content/admin.py @@ -2,3 +2,7 @@ # Register your models here. +from .models import Contributor, Article + +admin.site.register(Contributor) +admin.site.register(Article) \ No newline at end of file diff --git a/crimsonbouquet/content/migrations/0001_initial.py b/crimsonbouquet/content/migrations/0001_initial.py new file mode 100644 index 0000000..3fe09c6 --- /dev/null +++ b/crimsonbouquet/content/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# Generated by Django 3.2.18 on 2023-04-08 18:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Contributor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=100)), + ('last_name', models.CharField(max_length=100)), + ('middle_name', models.CharField(max_length=100)), + ('bio_text', models.CharField(blank=True, max_length=500, null=True)), + ('_title', models.CharField(blank=True, choices=[('cstaff', 'Crimson staff writer'), ('contrib', 'Contributing writer'), ('photog', 'Photographer'), ('design', 'Designer'), ('editor', 'Editor'), ('opinion', 'Crimson opinion writer'), ('opinion_contrib', 'Contributing opinion writer'), ('sponsored_contrib', 'Sponsored Contributor')], max_length=70, null=True, verbose_name='title')), + ], + ), + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('text', models.TextField()), + ('created_on', models.DateTimeField(auto_now_add=True)), + ('slug', models.SlugField(max_length=70)), + ('contributors', models.ManyToManyField(related_name='content', to='content.Contributor')), + ], + ), + ] diff --git a/crimsonbouquet/content/migrations/__pycache__/0001_initial.cpython-37.pyc b/crimsonbouquet/content/migrations/__pycache__/0001_initial.cpython-37.pyc old mode 100755 new mode 100644 index 50e2421..61a92b4 Binary files a/crimsonbouquet/content/migrations/__pycache__/0001_initial.cpython-37.pyc and b/crimsonbouquet/content/migrations/__pycache__/0001_initial.cpython-37.pyc differ diff --git a/crimsonbouquet/content/migrations/__pycache__/__init__.cpython-37.pyc b/crimsonbouquet/content/migrations/__pycache__/__init__.cpython-37.pyc old mode 100755 new mode 100644 index fb5cc4d..d0b6de7 Binary files a/crimsonbouquet/content/migrations/__pycache__/__init__.cpython-37.pyc and b/crimsonbouquet/content/migrations/__pycache__/__init__.cpython-37.pyc differ diff --git a/crimsonbouquet/content/models.py b/crimsonbouquet/content/models.py index b096caa..a7ca2c7 100755 --- a/crimsonbouquet/content/models.py +++ b/crimsonbouquet/content/models.py @@ -2,3 +2,48 @@ # Create your models here. +class Contributor(models.Model): + first_name = models.CharField(max_length = 100) + last_name = models.CharField(max_length = 100) + middle_name = models.CharField(max_length = 100) + + bio_text = models.CharField(blank = True, max_length = 500, null = True) + + TITLE_CHOICES = ( + ('cstaff', 'Crimson staff writer'), + ('contrib', 'Contributing writer'), + ('photog', 'Photographer'), + ('design', 'Designer'), + ('editor', 'Editor'), + ('opinion', 'Crimson opinion writer'), + ('opinion_contrib', 'Contributing opinion writer'), + ('sponsored_contrib', 'Sponsored Contributor'), + ) + + _title = models.CharField( + blank=True, null=True, max_length=70, choices=TITLE_CHOICES, + verbose_name='title' + ) + + @property + def title(self): + TITLE_CHOICES_MAP = dict(self.TITLE_CHOICES) + + if self._title: + return TITLE_CHOICES_MAP[self._title] + # generate default title + else: + return 'Contributor' + + def __str__(self): + return " ".join(filter(None, [self.first_name, self.middle_name, self.last_name])) + +class Article(models.Model): + title = models.CharField(max_length = 200) + contributors = models.ManyToManyField(Contributor, related_name = 'content') + text = models.TextField() + created_on = models.DateTimeField(auto_now_add=True) + slug = models.SlugField(max_length = 70) + + def __str__(self): + return self.title \ No newline at end of file diff --git a/crimsonbouquet/content/schema.py b/crimsonbouquet/content/schema.py new file mode 100644 index 0000000..dde7622 --- /dev/null +++ b/crimsonbouquet/content/schema.py @@ -0,0 +1,32 @@ +import graphene +from graphene_django import DjangoObjectType + +from content.models import Contributor, Article + +class ContributorGQL(DjangoObjectType): + class Meta: + model = Contributor + +class ArticleGQL(DjangoObjectType): + class Meta: + model = Article + +class Query(graphene.ObjectType): + contributor = graphene.Field(ContributorGQL, id = graphene.Int()) + content = graphene.Field(ArticleGQL, slug = graphene.String(required = True)) + all_content = graphene.List(ArticleGQL) + all_contributors = graphene.List(ContributorGQL) + + def resolve_content(self, info, slug): + return Article.objects.get(slug = slug) + + def resolve_contributor(self, info, id): + return Contributor.objects.get(pk = id) + + def resolve_all_content(self, info): + return Article.objects.all() + + def resolve_all_contributors(self, info): + return Contributor.objects.all() + +schema = graphene.Schema(query=Query) \ No newline at end of file diff --git a/crimsonbouquet/content/urls.py b/crimsonbouquet/content/urls.py new file mode 100644 index 0000000..80880b3 --- /dev/null +++ b/crimsonbouquet/content/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from . import views + +urlpatterns = [ + path('', views.index, name='index'), + path('contrib//', views.display_contributor, name = "display_contributor"), + path('article//', views.display_article, name = "display_article") +] \ No newline at end of file diff --git a/crimsonbouquet/content/views.py b/crimsonbouquet/content/views.py index 42ea46a..d340781 100755 --- a/crimsonbouquet/content/views.py +++ b/crimsonbouquet/content/views.py @@ -1,3 +1,16 @@ +from django.shortcuts import render, get_object_or_404 + +from .models import Contributor, Article from django.http import HttpResponse # Create your views here. +def index(request): + return HttpResponse("Hello lah.") + +def display_contributor(request, contrib_id): + contributor = get_object_or_404(Contributor, pk = contrib_id) + return render(request, "content/contributor.html", {"contributor": contributor}) + +def display_article(request, slug): + article = get_object_or_404(Article, slug = slug) + return render(request, "content/article.html", {"article": article}) \ No newline at end of file diff --git a/crimsonbouquet/crimsonbouquet/__pycache__/__init__.cpython-37.pyc b/crimsonbouquet/crimsonbouquet/__pycache__/__init__.cpython-37.pyc old mode 100755 new mode 100644 index a2fddf0..a6e46ac Binary files a/crimsonbouquet/crimsonbouquet/__pycache__/__init__.cpython-37.pyc and b/crimsonbouquet/crimsonbouquet/__pycache__/__init__.cpython-37.pyc differ diff --git a/crimsonbouquet/crimsonbouquet/__pycache__/settings.cpython-37.pyc b/crimsonbouquet/crimsonbouquet/__pycache__/settings.cpython-37.pyc old mode 100755 new mode 100644 index 3218a46..60b364d Binary files a/crimsonbouquet/crimsonbouquet/__pycache__/settings.cpython-37.pyc and b/crimsonbouquet/crimsonbouquet/__pycache__/settings.cpython-37.pyc differ diff --git a/crimsonbouquet/crimsonbouquet/__pycache__/urls.cpython-37.pyc b/crimsonbouquet/crimsonbouquet/__pycache__/urls.cpython-37.pyc old mode 100755 new mode 100644 index c34a8e8..af6b4b5 Binary files a/crimsonbouquet/crimsonbouquet/__pycache__/urls.cpython-37.pyc and b/crimsonbouquet/crimsonbouquet/__pycache__/urls.cpython-37.pyc differ diff --git a/crimsonbouquet/crimsonbouquet/__pycache__/wsgi.cpython-37.pyc b/crimsonbouquet/crimsonbouquet/__pycache__/wsgi.cpython-37.pyc old mode 100755 new mode 100644 index b2f6060..ce44d41 Binary files a/crimsonbouquet/crimsonbouquet/__pycache__/wsgi.cpython-37.pyc and b/crimsonbouquet/crimsonbouquet/__pycache__/wsgi.cpython-37.pyc differ diff --git a/crimsonbouquet/crimsonbouquet/settings.py b/crimsonbouquet/crimsonbouquet/settings.py index 52e31a2..c1a09c1 100755 --- a/crimsonbouquet/crimsonbouquet/settings.py +++ b/crimsonbouquet/crimsonbouquet/settings.py @@ -37,7 +37,8 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'graphene_django' + 'graphene_django', + 'content.apps.ContentConfig' ] MIDDLEWARE = [ @@ -114,9 +115,9 @@ USE_TZ = True -# GRAPHENE = { -# 'SCHEMA': 'content.schema.schema' -# } +GRAPHENE = { + 'SCHEMA': 'content.schema.schema' +} # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.1/howto/static-files/ diff --git a/crimsonbouquet/crimsonbouquet/urls.py b/crimsonbouquet/crimsonbouquet/urls.py index e5a7716..5ccb0e4 100755 --- a/crimsonbouquet/crimsonbouquet/urls.py +++ b/crimsonbouquet/crimsonbouquet/urls.py @@ -20,7 +20,7 @@ from graphene_django.views import GraphQLView urlpatterns = [ - # path('content/', include('content.urls')), + path('content/', include('content.urls')), path('admin/', admin.site.urls), - # path("graphql/", csrf_exempt(GraphQLView.as_view(graphiql=True))), + path("graphql/", csrf_exempt(GraphQLView.as_view(graphiql=True))), ] diff --git a/crimsonbouquet/db.sqlite3 b/crimsonbouquet/db.sqlite3 new file mode 100644 index 0000000..bc45dd1 Binary files /dev/null and b/crimsonbouquet/db.sqlite3 differ