Skip to content
Snippets Groups Projects
Commit c63f455d authored by Julian's avatar Julian
Browse files

Merge remote-tracking branch 'origin/feature/vuejs' into feature/vuejs

# Conflicts:
#	aleksis/core/schema.py
parents 0ffbd6a5 217c4299
No related branches found
No related tags found
1 merge request!1045Introduce Vuetify and GraphQL
Pipeline #79535 canceled
......@@ -9,17 +9,9 @@ and this project adheres to `Semantic Versioning`_.
Unreleased
----------
Deprecated
~~~~~~~~~~
* Numeric object IDs (primary keys) will be removed and replaced by UUIDs in
AlekSIS-Core 4.0. All apps must update their URLs, foriegn keys and the
like.
Added
~~~~~
* Introduce a UUID for every object
* Introduce GraphQL API
`2.10`_ - 2022-06-25
......
# Generated by Django 3.2.14 on 2022-07-16 12:49
import uuid
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('core', '0041_update_gender_choices'),
]
operations = [
migrations.AddField(
model_name='activity',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='additionalfield',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='announcement',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='announcementrecipient',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='custommenu',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='custommenuitem',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='dashboardwidgetorder',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='datacheckresult',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='group',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='grouptype',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='notification',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='pdffile',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='person',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='persongroupthrough',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='schoolterm',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
migrations.AddField(
model_name='taskuserassignment',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
),
]
# flake8: noqa: DJ12
import os
import uuid
from datetime import datetime
from typing import Any, Callable, List, Optional, Union
......@@ -127,8 +126,6 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
- Dominik George <dominik.george@teckids.org>
"""
uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
# Defines a material design icon associated with this type of model
icon_ = "radio_button_unchecked"
......
......@@ -3,8 +3,13 @@ from graphene_django import DjangoObjectType
from graphene_django.forms.mutation import DjangoModelFormMutation
from .forms import PersonForm
from .models import Group, Person
from .util.core_helpers import get_app_module, get_app_packages
from .models import Group, Notification, Person
from .util.core_helpers import get_app_module, get_app_packages, has_person
class NotificationType(DjangoObjectType):
class Meta:
model = Notification
class PersonType(DjangoObjectType):
......@@ -27,8 +32,15 @@ class PersonMutation(DjangoModelFormMutation):
class Query(graphene.ObjectType):
ping = graphene.String(default_value="pong")
notifications = graphene.List(NotificationType)
persons = graphene.List(PersonType)
person_by_id = graphene.Field(PersonType, id=graphene.ID())
who_am_i = graphene.Field(PersonType)
def resolve_notifications(root, info, **kwargs):
# FIXME do permission stuff
return Notification.objects.all()
def resolve_persons(root, info, **kwargs):
# FIXME do permission stuff
......@@ -37,6 +49,12 @@ class Query(graphene.ObjectType):
def resolve_person_by_id(root, info, id):
return Person.objects.get(pk=id)
def resolve_who_am_i(root, info, **kwargs):
if has_person(info.context.user):
return info.context.user.person
else:
return None
class Mutation(graphene.ObjectType):
update_person = PersonMutation.Field()
......
......@@ -586,6 +586,9 @@ YARN_INSTALLED_APPS = [
"vue@^2.6.14",
"vuetify@^2.6.5",
"@mdi/font",
"vue-apollo@^3",
"apollo-boost",
"graphql",
]
merge_app_settings("YARN_INSTALLED_APPS", YARN_INSTALLED_APPS, True)
......@@ -627,7 +630,16 @@ ANY_JS = {
"css_url": JS_URL + "/vuetify/dist/vuetify.min.css",
"js_url": JS_URL + "/vuetify/dist/vuetify.min.js",
},
"mdi-font": {"css_url": JS_URL + "/@mdi/font/css/materialdesignicons.css"}
"vue-apollo": {
"js_url": JS_URL + "/vue-apollo/dist/vue-apollo.min.js",
},
"apollo-boost": {
"js_url": JS_URL + "/apollo-boost/lib/bundle.cjs.js",
},
"graphql": {
"js_url": JS_URL + "/graphql/index.mjs",
},
"mdi-font": {"css_url": JS_URL + "/@mdi/font/css/materialdesignicons.css"},
}
merge_app_settings("ANY_JS", ANY_JS, True)
......
......@@ -38,6 +38,10 @@ const vuetify = new Vuetify({
}
})
const apolloClient = new ApolloClient({
uri: JSON.parse(document.getElementById("graphql-url").textContent)
})
import CacheNotification from "./components/core/CacheNotification.js";
import LanguageForm from "./components/core/LanguageForm.js";
......@@ -49,6 +53,8 @@ Vue.component(MessageBox.name, MessageBox); // Load MessageBox globally as other
const app = new Vue({
el: '#app',
apolloProvider,
render: h => h(App),
vuetify: vuetify,
// delimiters: ["<%","%>"] // FIXME: discuss new delimiters, [[ <% [{ {[ <[ (( …
data: () => ({
......@@ -65,3 +71,9 @@ const app = new Vue({
"sidenav-search": SidenavSearch,
},
})
Vue.use(VueApollo)
const apolloProvider = new VueApollo({
defaultClient: apolloClient,
})
{# -*- engine:django -*- #}
{% load i18n menu_generator static sass_tags any_js rules %}
{% load i18n menu_generator static sass_tags any_js rules html_helpers %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
......@@ -169,13 +169,13 @@
</v-container>
</v-main>
<v-footer app absolute inset color="primary" class="white--text">
<v-footer app absolute inset class="white--text">
<v-container>
<v-row>
<v-col cols="12" lg="6">
{% include "core/partials/vue_footer_menu.html" %}
</v-col>
<v-col cols="12" class="text-white-darken-1">
<v-col cols="12" >
<v-row>
<v-btn plain rounded href="{% url "about_aleksis" %}" color="white">
{% trans "About AlekSIS® — The Free School Information System" %}
......@@ -208,9 +208,15 @@
{#{% include_js "materialize" %}#}
{% include_js "vue" %}
{% include_js "vuetify" %}
<script type="module" src="{% static 'apollo-boost/lib/bundle.esm.js' %}"></script>
<script type="module" src="{% static 'vue-apollo/dist/vue-apollo.esm.js' %}"></script>
<script type="module" src="{% static 'graphql-tag/lib/index.js' %}"></script>
<script type="module" src="{% static 'graphql/index.mjs' %}"></script>
{% include_js "sortablejs" %}
{# Fixme: das muss weg ↓ #}
{% include_js "jquery-sortablejs" %}
{% absolute_url "graphql" as GRAPHQL_URL %}
{{ GRAPHQL_URL|json_script:"graphql-url" }}
{{ request.user.person.preferences.theme__design|json_script:"design-mode" }}
{{ request.site.preferences.theme__primary|json_script:"primary-color" }}
{{ request.site.preferences.theme__secondary|json_script:"secondary-color" }}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment