diff --git a/Pipfile.lock b/Pipfile.lock index 8e56e4e2..35ce49bb 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -25,10 +25,10 @@ }, "autopep8": { "hashes": [ - "sha256:9e136c472c475f4ee4978b51a88a494bfcd4e3ed17950a44a988d9e434837bea", - "sha256:cae4bc0fb616408191af41d062d7ec7ef8679c7f27b068875ca3a9e2878d5443" + "sha256:276ced7e9e3cb22e5d7c14748384a5cf5d9002257c0ed50c0e075b68011bb6d0", + "sha256:aa213493c30dcdac99537249ee65b24af0b2c29f2e83cd8b3f68760441ed0db9" ], - "version": "==1.5.5" + "version": "==1.5.7" }, "backcall": { "hashes": [ @@ -55,18 +55,18 @@ }, "boto3": { "hashes": [ - "sha256:1ca39de26205439832fa740fcc200de85f107b615dae445f869a16b76672e663", - "sha256:d6716f6701aae771f6ff2386a1d641855a99a9fedd64bd25476b83bacdd50c94" + "sha256:1db618cfe0e9d8c6ff4fc31ef4f9620bd72f472da0f3095f0be9372d77b671e9", + "sha256:61fe8cbb2d4bf1c9a69a73b3f2c68464e0ab587c9367b35f0ef691f372d5ce67" ], "index": "pypi", - "version": "==1.17.23" + "version": "==1.17.67" }, "botocore": { "hashes": [ - "sha256:d5ea913331e93cecde25773841397c5d2abbc04f38b1c96c636444e8bb3478f8", - "sha256:f3ae5cae250c3fb200d33abacbee3f0c6513fc6f1d17a851b04a3998de68c829" + "sha256:4666fb5bdf7d78c51d465bac7d9eb1d31c34be46990cd1ad2d1b338bbec8c049", + "sha256:adb26d8bc65761b5a46744f67b7e7096dedb2071aff876e0962cd648f28e9a8f" ], - "version": "==1.20.23" + "version": "==1.20.67" }, "certifi": { "hashes": [ @@ -84,10 +84,10 @@ }, "decorator": { "hashes": [ - "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", - "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" + "sha256:6f201a6c4dac3d187352661f508b9364ec8091217442c9478f1f83c003a0f060", + "sha256:945d84890bb20cc4a2f4a31fc4311c0c473af65ea318617f13a7257c9a58bc98" ], - "version": "==4.4.2" + "version": "==5.0.7" }, "dj-database-url": { "hashes": [ @@ -98,11 +98,11 @@ }, "django": { "hashes": [ - "sha256:30c235dec87e05667597e339f194c9fed6c855bda637266ceee891bf9093da43", - "sha256:e319a7164d6d30cb177b3fd74d02c52f1185c37304057bb76d74047889c605d9" + "sha256:db2214db1c99017cbd971e58824e6f424375154fe358afc30e976f5b99fc6060", + "sha256:e831105edb153af1324de44d06091ca75520a227456387dda4a47d2f1cc2731a" ], "index": "pypi", - "version": "==2.2.19" + "version": "==2.2.22" }, "django-appconf": { "hashes": [ @@ -113,11 +113,11 @@ }, "django-compressor": { "hashes": [ - "sha256:57ac0a696d061e5fc6fbc55381d2050f353b973fb97eee5593f39247bc0f30af", - "sha256:d2ed1c6137ddaac5536233ec0a819e14009553fee0a869bea65d03e5285ba74f" + "sha256:3358077605c146fdcca5f9eaffb50aa5dbe15f238f8854679115ebf31c0415e0", + "sha256:f8313f59d5e65712fc28787d084fe834997c9dfa92d064a1a3ec3d3366594d04" ], "index": "pypi", - "version": "==2.4" + "version": "==2.4.1" }, "django-cors-headers": { "hashes": [ @@ -220,10 +220,10 @@ }, "faker": { "hashes": [ - "sha256:97fb6748031569a65265d38d85370b3c3970f4333b40430d52a60b37dea97877", - "sha256:ee86c3140e1d1651b76a7aab637c7da068660f33937143e7063c663f4cec45ab" + "sha256:156854f36d4086bb21ff85a79b4d6a6403a240cd2c17a33a44b8ea4ff4e957c2", + "sha256:a2ed065342e91a7672407325848cd5728d5e5eb4928d0a1c478fd4f0dd97d1f7" ], - "version": "==6.5.2" + "version": "==8.1.2" }, "future": { "hashes": [ @@ -290,11 +290,11 @@ }, "ipython": { "hashes": [ - "sha256:04323f72d5b85b606330b6d7e2dc8d2683ad46c3905e955aa96ecc7a99388e70", - "sha256:34207ffb2f653bced2bc8e3756c1db86e7d93e44ed049daae9814fed66d408ec" + "sha256:714810a5c74f512b69d5f3b944c86e592cee0a5fb9c728e582f074610f6cf038", + "sha256:f78c6a3972dde1cc9e4041cbf4de583546314ba52d3c97208e5b6b2221a9cb7d" ], "index": "pypi", - "version": "==7.21.0" + "version": "==7.23.1" }, "ipython-genutils": { "hashes": [ @@ -400,6 +400,13 @@ ], "version": "==1.1.1" }, + "matplotlib-inline": { + "hashes": [ + "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811", + "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e" + ], + "version": "==0.1.2" + }, "newrelic": { "hashes": [ "sha256:242a5e901d684f7ffdd621bc58da8fe9a85d5545b4b63e1070589f5ab45c9e1e", @@ -501,10 +508,10 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:0fa02fa80363844a4ab4b8d6891f62dd0645ba672723130423ca4037b80c1974", - "sha256:62c811e46bd09130fb11ab759012a4ae385ce4fb2073442d1898867a824183bd" + "sha256:bf00f22079f5fadc949f42ae8ff7f05702826a97059ffcc6281036ad40ac6f04", + "sha256:e1b4f11b9336a28fa11810bc623c357420f69dfdb6d2dac41ca2c21a55c033bc" ], - "version": "==3.0.16" + "version": "==3.0.18" }, "psycopg2": { "hashes": [ @@ -536,17 +543,17 @@ }, "pycodestyle": { "hashes": [ - "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367", - "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e" + "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", + "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" ], - "version": "==2.6.0" + "version": "==2.7.0" }, "pygments": { "hashes": [ - "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94", - "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8" + "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f", + "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e" ], - "version": "==2.8.1" + "version": "==2.9.0" }, "pyparsing": { "hashes": [ @@ -635,17 +642,17 @@ }, "s3transfer": { "hashes": [ - "sha256:1e28620e5b444652ed752cf87c7e0cb15b0e578972568c6609f0f18212f259ed", - "sha256:7fdddb4f22275cf1d32129e21f056337fd2a80b6ccef1664528145b72c49e6d2" + "sha256:9b3752887a2880690ce628bc263d6d13a3864083aeacff4890c1c9839a5eb0bc", + "sha256:cb022f4b16551edebbb31a377d3f09600dbada7363d8c5db7976e7f47732e1b2" ], - "version": "==0.3.4" + "version": "==0.4.2" }, "sendgrid": { "hashes": [ - "sha256:2eb1dcb1f7d8656eed4db586e428c2c86f347590b8511d7f92993882d0e4fab9", - "sha256:e422c8263563ac7d664066d2f87b90bcb005b067eb7c33a9b1396442b2ed285b" + "sha256:273bdc0abec649bf6319df7b6267980f79e53ab64e92906d65eea6d4330d00b4", + "sha256:74b0dcf9a79188948f61f456bd1bf67ffa676a5d388aba1c76bff516566d7084" ], - "version": "==6.6.0" + "version": "==6.7.0" }, "sentry-sdk": { "hashes": [ @@ -664,10 +671,10 @@ }, "six": { "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "version": "==1.15.0" + "version": "==1.16.0" }, "sqlparse": { "hashes": [ @@ -705,10 +712,11 @@ }, "typing": { "hashes": [ - "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9", - "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5" + "sha256:12fbdfbe7d6cca1a42e485229afcb0b0c8259258cfb919b8a5e2a5c953742f89", + "sha256:13b4ad211f54ddbf93e5901a9967b1e07720c1d1b78d596ac6a439641aa1b130", + "sha256:c7219ef20c5fbf413b4567092adfc46fa6203cb8454eda33c3fc1afe1398a308" ], - "version": "==3.7.4.3" + "version": "==3.10.0.0" }, "unidecode": { "hashes": [ @@ -727,10 +735,10 @@ }, "urllib3": { "hashes": [ - "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80", - "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73" + "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df", + "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" ], - "version": "==1.26.3" + "version": "==1.26.4" }, "wagtail": { "hashes": [ @@ -742,10 +750,10 @@ }, "wagtail-autocomplete": { "hashes": [ - "sha256:5f8ddf16d3ca365af4ad0f09e8f45d9e982ca854dc1b084a8a30f66b00a7739d" + "sha256:73602db77eb3eee27f17a0b22aa88badf9fb5079fb1822c921f06a17224ce4db" ], "index": "pypi", - "version": "==0.6" + "version": "==0.6.3" }, "wagtail-factories": { "hashes": [ @@ -788,25 +796,25 @@ "develop": { "asgiref": { "hashes": [ - "sha256:5ee950735509d04eb673bd7f7120f8fa1c9e2df495394992c73234d526907e17", - "sha256:7162a3cb30ab0609f1a4c95938fd73e8604f63bdba516a7f7d64b83ff09478f0" + "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee", + "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78" ], - "version": "==3.3.1" + "version": "==3.3.4" }, "autopep8": { "hashes": [ - "sha256:9e136c472c475f4ee4978b51a88a494bfcd4e3ed17950a44a988d9e434837bea", - "sha256:cae4bc0fb616408191af41d062d7ec7ef8679c7f27b068875ca3a9e2878d5443" + "sha256:276ced7e9e3cb22e5d7c14748384a5cf5d9002257c0ed50c0e075b68011bb6d0", + "sha256:aa213493c30dcdac99537249ee65b24af0b2c29f2e83cd8b3f68760441ed0db9" ], - "version": "==1.5.5" + "version": "==1.5.7" }, "awscli": { "hashes": [ - "sha256:191c07061bf227775437bf0b6e6209e0db50affcd8d5a37ba9fe5d87b6b80585", - "sha256:426e2eb8412b59e677ac28603cb6a038bea50ae8fab60ee9edf3756b28d4f419" + "sha256:23aaea71d9b159946bb4b4f9d76b0e7375acde79595d006d988225d1d07692db", + "sha256:d24d33d91f642fdd80ea989b37fddf59e46b2122be5ad04f0f8faee3a1140de8" ], "index": "pypi", - "version": "==1.19.23" + "version": "==1.19.67" }, "backcall": { "hashes": [ @@ -817,10 +825,10 @@ }, "botocore": { "hashes": [ - "sha256:d5ea913331e93cecde25773841397c5d2abbc04f38b1c96c636444e8bb3478f8", - "sha256:f3ae5cae250c3fb200d33abacbee3f0c6513fc6f1d17a851b04a3998de68c829" + "sha256:4666fb5bdf7d78c51d465bac7d9eb1d31c34be46990cd1ad2d1b338bbec8c049", + "sha256:adb26d8bc65761b5a46744f67b7e7096dedb2071aff876e0962cd648f28e9a8f" ], - "version": "==1.20.23" + "version": "==1.20.67" }, "certifi": { "hashes": [ @@ -903,18 +911,18 @@ }, "decorator": { "hashes": [ - "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", - "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" + "sha256:6f201a6c4dac3d187352661f508b9364ec8091217442c9478f1f83c003a0f060", + "sha256:945d84890bb20cc4a2f4a31fc4311c0c473af65ea318617f13a7257c9a58bc98" ], - "version": "==4.4.2" + "version": "==5.0.7" }, "django": { "hashes": [ - "sha256:30c235dec87e05667597e339f194c9fed6c855bda637266ceee891bf9093da43", - "sha256:e319a7164d6d30cb177b3fd74d02c52f1185c37304057bb76d74047889c605d9" + "sha256:db2214db1c99017cbd971e58824e6f424375154fe358afc30e976f5b99fc6060", + "sha256:e831105edb153af1324de44d06091ca75520a227456387dda4a47d2f1cc2731a" ], "index": "pypi", - "version": "==2.2.19" + "version": "==2.2.22" }, "django-silk": { "hashes": [ @@ -946,18 +954,18 @@ }, "ipdb": { "hashes": [ - "sha256:1aa37e19e5b3b96c930fe7fe97193a54202c23a8d1b1c7763f76553f5b275731" + "sha256:178c367a61c1039e44e17c56fcc4a6e7dc11b33561261382d419b6ddb4401810" ], "index": "pypi", - "version": "==0.13.6" + "version": "==0.13.7" }, "ipython": { "hashes": [ - "sha256:04323f72d5b85b606330b6d7e2dc8d2683ad46c3905e955aa96ecc7a99388e70", - "sha256:34207ffb2f653bced2bc8e3756c1db86e7d93e44ed049daae9814fed66d408ec" + "sha256:714810a5c74f512b69d5f3b944c86e592cee0a5fb9c728e582f074610f6cf038", + "sha256:f78c6a3972dde1cc9e4041cbf4de583546314ba52d3c97208e5b6b2221a9cb7d" ], "index": "pypi", - "version": "==7.21.0" + "version": "==7.23.1" }, "ipython-genutils": { "hashes": [ @@ -1045,6 +1053,13 @@ ], "version": "==1.1.1" }, + "matplotlib-inline": { + "hashes": [ + "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811", + "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e" + ], + "version": "==0.1.2" + }, "parso": { "hashes": [ "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea", @@ -1069,10 +1084,10 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:0fa02fa80363844a4ab4b8d6891f62dd0645ba672723130423ca4037b80c1974", - "sha256:62c811e46bd09130fb11ab759012a4ae385ce4fb2073442d1898867a824183bd" + "sha256:bf00f22079f5fadc949f42ae8ff7f05702826a97059ffcc6281036ad40ac6f04", + "sha256:e1b4f11b9336a28fa11810bc623c357420f69dfdb6d2dac41ca2c21a55c033bc" ], - "version": "==3.0.16" + "version": "==3.0.18" }, "ptyprocess": { "hashes": [ @@ -1101,17 +1116,17 @@ }, "pycodestyle": { "hashes": [ - "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367", - "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e" + "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", + "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" ], - "version": "==2.6.0" + "version": "==2.7.0" }, "pygments": { "hashes": [ - "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94", - "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8" + "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f", + "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e" ], - "version": "==2.8.1" + "version": "==2.9.0" }, "python-dateutil": { "hashes": [ @@ -1174,21 +1189,22 @@ "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2", "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9" ], + "markers": "python_version > '2.7'", "version": "==4.7.2" }, "s3transfer": { "hashes": [ - "sha256:1e28620e5b444652ed752cf87c7e0cb15b0e578972568c6609f0f18212f259ed", - "sha256:7fdddb4f22275cf1d32129e21f056337fd2a80b6ccef1664528145b72c49e6d2" + "sha256:9b3752887a2880690ce628bc263d6d13a3864083aeacff4890c1c9839a5eb0bc", + "sha256:cb022f4b16551edebbb31a377d3f09600dbada7363d8c5db7976e7f47732e1b2" ], - "version": "==0.3.4" + "version": "==0.4.2" }, "six": { "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "version": "==1.15.0" + "version": "==1.16.0" }, "sqlparse": { "hashes": [ @@ -1213,10 +1229,10 @@ }, "urllib3": { "hashes": [ - "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80", - "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73" + "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df", + "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" ], - "version": "==1.26.3" + "version": "==1.26.4" }, "wcwidth": { "hashes": [ diff --git a/client/src/graphql/gql/queries/snapshots/detail.gql b/client/src/graphql/gql/queries/snapshots/detail.gql index e61dfa74..69f73007 100644 --- a/client/src/graphql/gql/queries/snapshots/detail.gql +++ b/client/src/graphql/gql/queries/snapshots/detail.gql @@ -7,6 +7,17 @@ query SnapshotDetail($id: ID!) { title metaTitle heroImage + created + changes { + newContentBlocks + newObjectives + hiddenContentBlocks + hiddenObjectives + } + creator { + firstName + lastName + } chapters { id description diff --git a/server/books/schema/mutations/snapshot.py b/server/books/schema/mutations/snapshot.py index 5e31013c..5700ff67 100644 --- a/server/books/schema/mutations/snapshot.py +++ b/server/books/schema/mutations/snapshot.py @@ -1,10 +1,11 @@ import graphene +from django.db.models import Q from graphene import relay from api.utils import get_object -from books.models import Module, ContentBlock +from books.models import Module, ContentBlock, Chapter from books.models.snapshot import Snapshot -from books.schema.nodes import SnapshotNode +from books.schema.nodes import SnapshotNode, ModuleNode from users.models import SchoolClass @@ -35,6 +36,7 @@ class ApplySnapshot(relay.ClientIDMutation): selected_class = graphene.ID(required=True) success = graphene.Boolean() + module = graphene.Field(ModuleNode) @classmethod def mutate_and_get_payload(cls, root, info, **args): @@ -43,6 +45,17 @@ class ApplySnapshot(relay.ClientIDMutation): user = info.context.user selected_class_id = args.get('selected_class') selected_class = get_object(SchoolClass, selected_class_id) + #reset everything + for chapter in Chapter.get_by_parent(snapshot.module): + cb_qs = ContentBlock.get_by_parent(chapter) + without_owner = Q(owner__isnull=True) + no_snapshot = Q(contentblocksnapshot__isnull=True) + owner_user = Q(owner=user) + for cb in cb_qs.filter(without_owner & no_snapshot): + cb.hidden_for.remove(selected_class) + for cb in cb_qs.filter(owner_user): + cb.visible_for.remove(selected_class) + #apply snapshot if not selected_class.users.filter(username=user.username).exists() or not user.is_teacher(): raise PermissionError('Not allowed') for content_block in snapshot.hidden_content_blocks.all(): @@ -55,4 +68,4 @@ class ApplySnapshot(relay.ClientIDMutation): chapter.title_hidden_for.add(selected_class) if chapter_snapshot.description_hidden: chapter.description_hidden_for.add(selected_class) - return cls(success=True) + return cls(success=True, module=snapshot.module) diff --git a/server/books/schema/nodes/snapshot.py b/server/books/schema/nodes/snapshot.py index 1b2df07c..95542bb4 100644 --- a/server/books/schema/nodes/snapshot.py +++ b/server/books/schema/nodes/snapshot.py @@ -59,6 +59,11 @@ class SnapshotChapterNode(ObjectType): title_hidden = graphene.Boolean() +class SnapshotChangesNode(ObjectType): + hidden_objectives = graphene.Int(required=True) + new_objectives = graphene.Int(required=True) + hidden_content_blocks = graphene.Int(required=True) + new_content_blocks = graphene.Int(required=True) class SnapshotNode(DjangoObjectType): @@ -66,6 +71,7 @@ class SnapshotNode(DjangoObjectType): chapters = graphene.List(SnapshotChapterNode) meta_title = graphene.String() hero_image = graphene.String() + changes = graphene.Field(SnapshotChangesNode) class Meta: model = Snapshot @@ -85,7 +91,7 @@ class SnapshotNode(DjangoObjectType): @staticmethod def resolve_title(parent, info, **kwargs): - return parent.__str__() + return parent.module.title @staticmethod def resolve_meta_title(parent, info, **kwargs): @@ -96,3 +102,12 @@ class SnapshotNode(DjangoObjectType): if parent.module.hero_image: return parent.module.hero_image.file.url return '' + + @staticmethod + def resolve_changes(parent, info, **kwargs): + return { + 'hidden_objectives': 0, + 'new_objectives': 0, + 'hidden_content_blocks': parent.hidden_content_blocks.count(), + 'new_content_blocks': parent.custom_content_blocks.count() + }