Skip to content

Commit 4742d33

Browse files
authored
Merge pull request #137 from UCL-ARC/split-vwi
splitting vwis into vis and written
2 parents d088c26 + fab1dfd commit 4742d33

File tree

6 files changed

+190
-18
lines changed

6 files changed

+190
-18
lines changed

dashboard.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ def init_with_context(self, context):
8686
"mod_app.models.support_models.OtherLink",
8787
"mod_app.models.support_models.Tag",
8888
"mod_app.models.feedback_model.Feedback",
89-
"mod_app.models.visual_written_influences_model.VisualWrittenInfluences",
89+
"mod_app.models.visual_written_influences_model.VisualInfluences",
90+
"mod_app.models.visual_written_influences_model.WrittenInfluences",
9091
),
9192
),
9293
],

mod_app/admin/film_admin.py

+15-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
StillInline,
1919
VideoInline,
2020
)
21-
from mod_app.admin.note_admin import VWIInline
21+
from mod_app.admin.note_admin import VisInline, WritInline
2222
from mod_app.utils.mixins import EmailMixin
2323

2424
from ..models import Analysis, TeachingResources, Film
@@ -72,7 +72,8 @@ class Media:
7272
inlines = [
7373
FilmAnalysisInline,
7474
TRInline,
75-
VWIInline,
75+
VisInline,
76+
WritInline,
7677
SourceInline,
7778
OtherLinkInline,
7879
VideoInline,
@@ -210,10 +211,21 @@ def preview_video(self, obj):
210211
None,
211212
{"classes": ("placeholder TeachingResources_films-group",), "fields": ()},
212213
),
214+
(
215+
"Visual & Written Influences",
216+
{"fields": []},
217+
),
218+
(
219+
None,
220+
{
221+
"classes": ("placeholder VisualInfluences_films-group",),
222+
"fields": (),
223+
},
224+
),
213225
(
214226
None,
215227
{
216-
"classes": ("placeholder VisualWrittenInfluences_films-group",),
228+
"classes": ("placeholder WrittenInfluences_films-group",),
217229
"fields": (),
218230
},
219231
),

mod_app/admin/note_admin.py

+37-7
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.utils.html import format_html
44

55

6-
from mod_app.models import ProjectNote, Feedback, VisualWrittenInfluences
6+
from mod_app.models import ProjectNote, Feedback, VisualInfluences, WrittenInfluences
77
from mod_app.utils.mixins import s3BrowserButtonMixin
88

99

@@ -43,19 +43,49 @@ def safe_content(self, obj):
4343
safe_content.short_description = "Content"
4444

4545

46-
class VWIInline(s3BrowserButtonMixin, admin.TabularInline):
47-
model = VisualWrittenInfluences.films.through
46+
class VisInline(s3BrowserButtonMixin, admin.TabularInline):
47+
model = VisualInfluences.films.through
4848
extra = 1
4949
classes = [
5050
"grp-collapse",
5151
"grp-open",
5252
]
53-
verbose_name = "Visual & Written Influences"
54-
verbose_name_plural = "Visual & Written Influences"
53+
verbose_name = "Visual Influences"
54+
verbose_name_plural = "Visual Influences"
5555

5656

57-
@admin.register(VisualWrittenInfluences)
58-
class VWIAdmin(s3BrowserButtonMixin, admin.ModelAdmin):
57+
class WritInline(s3BrowserButtonMixin, admin.TabularInline):
58+
model = WrittenInfluences.films.through
59+
extra = 1
60+
classes = [
61+
"grp-collapse",
62+
"grp-open",
63+
]
64+
verbose_name = "Written Influences"
65+
verbose_name_plural = "Written Influences"
66+
67+
68+
@admin.register(VisualInfluences)
69+
class VisualInfluencesAdmin(s3BrowserButtonMixin, admin.ModelAdmin):
70+
class Media:
71+
js = ("admin/js/mentionsPluginConfig.js",)
72+
73+
search_fields = ["title"]
74+
list_display = ["title", "safe_content"]
75+
readonly_fields = ("bibliography",)
76+
filter_horizontal = ("films",)
77+
78+
def safe_content(self, obj):
79+
truncated_content = truncatechars_html(obj.content, 200)
80+
modified_content = truncated_content.replace("{", "(").replace("}", ")")
81+
return format_html(modified_content)
82+
83+
safe_content.allow_tags = True
84+
safe_content.short_description = "Content"
85+
86+
87+
@admin.register(WrittenInfluences)
88+
class WrittenInfluencesAdmin(s3BrowserButtonMixin, admin.ModelAdmin):
5989
class Media:
6090
js = ("admin/js/mentionsPluginConfig.js",)
6191

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# Generated by Django 4.2.5 on 2025-01-08 13:14
2+
3+
import ckeditor_uploader.fields
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
dependencies = [
9+
("mod_app", "0030_add_films_to_vwi"),
10+
]
11+
12+
operations = [
13+
migrations.CreateModel(
14+
name="VisualInfluences",
15+
fields=[
16+
(
17+
"id",
18+
models.BigAutoField(
19+
auto_created=True,
20+
primary_key=True,
21+
serialize=False,
22+
verbose_name="ID",
23+
),
24+
),
25+
("title", models.CharField(max_length=255)),
26+
(
27+
"content",
28+
ckeditor_uploader.fields.RichTextUploadingField(
29+
blank=True, help_text="Mentions are available here.", null=True
30+
),
31+
),
32+
(
33+
"bibliography",
34+
models.ManyToManyField(
35+
blank=True,
36+
help_text="This field updates on save, and some items may not be visible immediately",
37+
related_name="visual_influences",
38+
to="mod_app.bibliographyitem",
39+
),
40+
),
41+
(
42+
"films",
43+
models.ManyToManyField(
44+
blank=True, related_name="visual_influences", to="mod_app.film"
45+
),
46+
),
47+
],
48+
options={
49+
"verbose_name": "Visual Influence",
50+
"verbose_name_plural": "Visual Influences",
51+
},
52+
),
53+
migrations.CreateModel(
54+
name="WrittenInfluences",
55+
fields=[
56+
(
57+
"id",
58+
models.BigAutoField(
59+
auto_created=True,
60+
primary_key=True,
61+
serialize=False,
62+
verbose_name="ID",
63+
),
64+
),
65+
("title", models.CharField(max_length=255)),
66+
(
67+
"content",
68+
ckeditor_uploader.fields.RichTextUploadingField(
69+
blank=True, help_text="Mentions are available here.", null=True
70+
),
71+
),
72+
(
73+
"bibliography",
74+
models.ManyToManyField(
75+
blank=True,
76+
help_text="This field updates on save, and some items may not be visible immediately",
77+
related_name="written_influences",
78+
to="mod_app.bibliographyitem",
79+
),
80+
),
81+
(
82+
"films",
83+
models.ManyToManyField(
84+
blank=True, related_name="written_influences", to="mod_app.film"
85+
),
86+
),
87+
],
88+
options={
89+
"verbose_name": "Written Influence",
90+
"verbose_name_plural": "Written Influences",
91+
},
92+
),
93+
migrations.DeleteModel(
94+
name="VisualWrittenInfluences",
95+
),
96+
]

mod_app/models/__init__.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
Analysis,
2424
TeachingResources,
2525
)
26-
from .visual_written_influences_model import VisualWrittenInfluences
26+
from .visual_written_influences_model import VisualInfluences, WrittenInfluences
2727

2828
__all__ = [
2929
"Analysis",
@@ -47,5 +47,6 @@
4747
"Video",
4848
"ProjectNote",
4949
"Feedback",
50-
"VisualWrittenInfluences",
50+
"VisualInfluences",
51+
"WrittenInfluences",
5152
]

mod_app/models/visual_written_influences_model.py

+37-5
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
from ..utils.extract_citations import update_bibliography
66

77

8-
class VisualWrittenInfluences(models.Model):
8+
class VisualInfluences(models.Model):
99
class Meta:
10-
verbose_name = "Visual and Written Influences"
11-
verbose_name_plural = "Visual and Written Influences"
10+
verbose_name = "Visual Influence"
11+
verbose_name_plural = "Visual Influences"
1212

1313
def __str__(self):
1414
return self.title
1515

1616
title = models.CharField(max_length=255, null=False)
17-
films = models.ManyToManyField("Film", related_name="vwis", blank=True)
17+
films = models.ManyToManyField("Film", related_name="visual_influences", blank=True)
1818

1919
content = RichTextUploadingField(
2020
null=True,
@@ -25,7 +25,39 @@ def __str__(self):
2525
bibliography = models.ManyToManyField(
2626
BibliographyItem,
2727
blank=True,
28-
related_name="vwis",
28+
related_name="visual_influences",
29+
help_text="This field updates on save, and some items may not be visible immediately",
30+
)
31+
32+
def save(self, *args, **kwargs):
33+
super().save(*args, **kwargs)
34+
35+
update_bibliography(self, [self.content])
36+
37+
38+
class WrittenInfluences(models.Model):
39+
class Meta:
40+
verbose_name = "Written Influence"
41+
verbose_name_plural = "Written Influences"
42+
43+
def __str__(self):
44+
return self.title
45+
46+
title = models.CharField(max_length=255, null=False)
47+
films = models.ManyToManyField(
48+
"Film", related_name="written_influences", blank=True
49+
)
50+
51+
content = RichTextUploadingField(
52+
null=True,
53+
blank=True,
54+
help_text="Mentions are available here.",
55+
)
56+
57+
bibliography = models.ManyToManyField(
58+
BibliographyItem,
59+
blank=True,
60+
related_name="written_influences",
2961
help_text="This field updates on save, and some items may not be visible immediately",
3062
)
3163

0 commit comments

Comments
 (0)