Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
R
red_brick_board
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ciella Francisco
red_brick_board
Commits
1491549b
Unverified
Commit
1491549b
authored
Apr 13, 2024
by
Daniella Joan Francisco
Committed by
GitHub
Apr 13, 2024
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #9 from avraiel/event_management
Event management
parents
ceb0df7f
dfc29402
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
263 additions
and
50 deletions
+263
-50
forms.py
redbrickboard/event_management/forms.py
+22
-17
models.py
redbrickboard/event_management/models.py
+17
-16
event-details.html
..._management/templates/event_management/event-details.html
+10
-2
event-form.html
...ent_management/templates/event_management/event-form.html
+129
-4
event-list.html
...ent_management/templates/event_management/event-list.html
+1
-0
urls.py
redbrickboard/event_management/urls.py
+2
-1
views.py
redbrickboard/event_management/views.py
+82
-10
No files found.
redbrickboard/event_management/forms.py
View file @
1491549b
from
accounts
import
models
as
accounts
from
django
import
forms
from
django.forms
import
ModelForm
from
.models
import
Event
# class EventForm(forms.ModelForm):
# class Meta:
# model = Event
# fields = ["event_name", "event_datetime_start", "event_datetime_end", "event_organizer", "event_header", "last_time_bumped"]
from
django.forms
import
ModelForm
,
BaseModelFormSet
,
inlineformset_factory
from
.models
import
Event
,
Promo
class
EventForm
(
ModelForm
):
# event_name = forms.CharField(label='Event Name', max_length=150)
# event_datetime_start = forms.DateTimeField(label='Event Start Date and Time')
# event_datetime_end = forms.DateTimeField(label='Event End Date and Time')
# event_organizer = forms.ModelChoiceField(label='Event Organizer', queryset=accounts.CustomUser.objects.all())
# event_header = forms.ImageField(label='Event Header Photo')
# last_time_bumped = forms.DateTimeField(label='Last Time Bump')
class
Meta
:
model
=
Event
fields
=
"__all__"
# fields = ["event_name", "event_datetime_start", "event_datetime_end",
# "event_organizer", "event_header", "last_time_bumped"]
# fields = ["event_datetime_start"]
widgets
=
{
'event_datetime_start'
:
forms
.
TextInput
(
attrs
=
{
'type'
:
'datetime-local'
}),
'event_datetime_end'
:
forms
.
TextInput
(
attrs
=
{
'type'
:
'datetime-local'
}),
'last_time_bumped'
:
forms
.
TextInput
(
attrs
=
{
'type'
:
'datetime-local'
}),
}
\ No newline at end of file
}
class
PromoForm
(
ModelForm
):
model
=
Promo
fields
=
"__all__"
# Source for the whole formset integration:
# https://www.letscodemore.com/blog/django-inline-formset-factory-with-examples/
PromoFormSet
=
inlineformset_factory
(
Event
,
Promo
,
form
=
PromoForm
,
extra
=
1
,
fields
=
[
'img'
],
can_delete
=
True
,
can_delete_extra
=
True
)
\ No newline at end of file
redbrickboard/event_management/models.py
View file @
1491549b
...
...
@@ -8,24 +8,12 @@ from uuid import uuid4
# from datetime import timedelta
class
Event
(
models
.
Model
):
def
rename_image
(
path
):
def
wrapper
(
instance
,
filename
):
ext
=
filename
.
split
(
'.'
)[
-
1
]
# get filename
if
instance
.
pk
:
filename
=
'event{}header.{}'
.
format
(
instance
.
pk
,
ext
)
else
:
# set filename as random string
filename
=
'{}.{}'
.
format
(
uuid4
()
.
hex
,
ext
)
# return the whole path to the file
return
os
.
path
.
join
(
path
,
filename
)
return
wrapper
event_name
=
models
.
CharField
(
default
=
''
,
max_length
=
150
)
event_description
=
models
.
TextField
(
default
=
''
,
max_length
=
255
)
event_datetime_start
=
models
.
DateTimeField
(
default
=
timezone
.
now
,
null
=
False
)
event_datetime_end
=
models
.
DateTimeField
(
default
=
None
,
null
=
True
)
event_organizer
=
models
.
ForeignKey
(
accounts
.
CustomUser
,
on_delete
=
models
.
CASCADE
,
related_name
=
'events_organized'
)
event_header
=
ResizedImageField
(
size
=
[
815
,
315
],
crop
=
[
'middle'
,
'center'
],
quality
=
75
,
force_format
=
'WebP'
,
upload_to
=
rename_image
(
'headers/'
)
)
event_header
=
ResizedImageField
(
quality
=
75
,
force_format
=
'WebP'
,
upload_to
=
'headers/'
)
last_time_bumped
=
models
.
DateTimeField
()
def
__str__
(
self
):
...
...
@@ -33,6 +21,9 @@ class Event(models.Model):
def
get_absolute_url
(
self
):
return
reverse
(
'event_management:event-details'
,
kwargs
=
{
'pk'
:
self
.
pk
})
def
get_update_url
(
self
):
return
reverse
(
'event_management:event-update'
,
kwargs
=
{
'pk'
:
self
.
pk
})
# def save(self, *args, **kwargs):
# if self.event_datetime_end is None:
...
...
@@ -42,8 +33,18 @@ class Event(models.Model):
# super(Event, self).save(*args, **kwargs)
class
Promo
(
models
.
Model
):
img
=
models
.
ImageField
(
upload_to
=
'images/'
,
height_field
=
None
,
width_field
=
None
,
max_length
=
100
,
blank
=
True
)
event_name
=
models
.
ForeignKey
(
Event
,
on_delete
=
models
.
CASCADE
)
event
=
models
.
ForeignKey
(
Event
,
related_name
=
"promos"
,
on_delete
=
models
.
CASCADE
,
null
=
True
)
img
=
ResizedImageField
(
quality
=
75
,
force_format
=
'WebP'
,
upload_to
=
'promos/'
)
def
__str__
(
self
):
return
self
.
event
.
event_name
def
get_absolute_url
(
self
):
return
reverse
(
'event_management:event-details'
,
kwargs
=
{
'pk'
:
self
.
pk
})
class
Comment
(
models
.
Model
):
event_comment
=
models
.
TextField
(
default
=
''
,
max_length
=
255
)
...
...
redbrickboard/event_management/templates/event_management/event-details.html
View file @
1491549b
...
...
@@ -3,6 +3,14 @@
{% block title %}Widget's Forum{% endblock %}
{% block content %}
<img
src=
"{{ object.event_header.url }}"
width =
'300'
/>
<p><a
href=
'{{ object.get_absolute_url }}'
>
{{ object }}
</a></p>
<p>
{{ object.event_organizer }}
</p>
<p>
{{ object }}
</p>
<p>
{{object.event_description}}
</p>
<p>
{{object.event_datetime_start}}
</p>
<p>
{{object.event_datetime_end}}
</p>
<p>
{{object.event_organizer }}
</p>
<p>
{{object.last_time_bumped}}
</p>
{% for promo in object.promos.all %}
<img
src=
"{{ promo.img.url }}"
/>
{% endfor %}
<button
type=
"button"
onclick=
"location.href='{{ event.get_update_url }}'"
>
Update
</button>
{% endblock %}
redbrickboard/event_management/templates/event_management/event-form.html
View file @
1491549b
...
...
@@ -8,7 +8,7 @@
{% load static %}
{% block title %}Widget's Forum{% endblock %}
{% block content %}
{{ form.non_field_errors }}
<!--
{{ form.non_field_errors }}
{% for field in form %}
{% if field.errors %}
<p>{{ field.label }} has the following errors:</p>
...
...
@@ -18,10 +18,135 @@
{% endfor %}
</ul>
{% endif %}
{% endfor %}
{% endfor %}
-->
<form
enctype=
"multipart/form-data"
method=
"post"
>
{% csrf_token %}
{{ form }}
<input
type=
"submit"
value=
"Save"
/>
<!-- {{ form }} -->
<div
class=
"card"
>
<div
class=
"card-header card-header-secondary"
>
<h4
class=
"card-title"
>
Add Event
</h4>
</div>
{% for field in form %}
<div
class=
"form-group card-body"
>
<label>
{{field.label}}
</label>
{% if field.field.required %}
<span
style=
"color: red;"
class=
"required"
>
*
</span>
{% endif %}
{{field}}
{% if field.help_text %}
<small
style=
"color: grey"
>
{{ field.help_text }}
</small>
{% endif %}
{% for error in field.errors %}
<p
style=
"color: red"
>
{{ error }}
</p>
{% endfor %}
</div>
{% endfor %}
</div>
{% with named_formsets.images as formset %}
{{ formset.management_form }}
<script
type=
"text/html"
id=
"images-template"
>
<
tr
id
=
"images-__prefix__"
class
=
hide_all
>
{
%
for
fields
in
formset
.
empty_form
.
hidden_fields
%
}
{{
fields
}}
{
%
endfor
%
}
{
%
for
fields
in
formset
.
empty_form
.
visible_fields
%
}
<
td
>
{{
fields
}}
<
/td
>
{
%
endfor
%
}
<
/tr
>
</script>
<div
class=
"table-responsive card mt-4"
>
<div
class=
"card-header card-header-secondary"
>
<h4
class=
"card-title"
>
Add Promotional Images
</h4>
</div>
<table
class=
"table card-body"
>
<thead
class=
"text-secondary"
>
<th>
Image
<span
style=
"color: red;"
class=
"required"
>
*
</span></th>
<th>
Delete?
</th>
<th>
Custom Delete btn
</th>
</thead>
<tbody
id=
"item-images"
>
<!-- id="item-inlineformsetname" -->
<!-- formset non forms errors -->
{% for error in formset.non_form_errors %}
<span
style=
"color: red"
>
{{ error }}
</span>
{% endfor %}
{% for formss in formset %}
{{ formss.management_form }}
<tr
id=
"images-{{ forloop.counter0 }}"
class=
hide_all
>
<!-- id="inlineformsetname-counter" -->
{{ formss.id }}
{% for field in formss.visible_fields %}
<td>
{{field}}
{% for error in field.errors %}
<span
style=
"color: red"
>
{{ error }}
</span>
{% endfor %}
</td>
{% endfor %}
<!-- delete code -->
{% if formss.instance.pk %}
<td>
<button
type=
"button"
class=
"btn btn-danger"
data-toggle=
"modal"
data-target=
"#exampleModal{{formss.instance.pk}}"
>
Delete
</button>
<!-- Modal -->
<div
class=
"modal fade"
id=
"exampleModal{{formss.instance.pk}}"
tabindex=
"-1"
role=
"dialog"
aria-labelledby=
"exampleModalLabel{{formss.instance.pk}}"
aria-hidden=
"true"
>
<div
class=
"modal-dialog"
role=
"document"
>
<div
class=
"modal-content"
>
<div
class=
"modal-header"
>
<h5
class=
"modal-title"
id=
"exampleModalLabel{{formss.instance.pk}}"
>
Are Your Sure You Want To Delete This?
</h5>
<button
type=
"button"
class=
"close"
data-dismiss=
"modal"
aria-label=
"Close"
>
<span
aria-hidden=
"true"
>
×
</span>
</button>
</div>
<div
class=
"modal-footer"
>
<a
href=
"{% url 'event_management:delete_image' formss.instance.pk %}"
type=
"button"
class=
"btn btn-primary"
>
Yes, Delete
</a>
<button
type=
"button"
class=
"btn btn-secondary"
data-dismiss=
"modal"
>
Close
</button>
</div>
</div>
</div>
</div>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
<a
href=
"#"
id=
"add-image-button"
class=
"btn btn-secondary add-images"
>
Add More
</a>
<!-- id="add-inlineformsetname-button" -->
</div>
{% endwith %}
<div
class=
"form-group"
>
<button
type=
"submit"
class=
"btn btn-secondary btn-block"
>
Submit
</button>
</div>
</form>
<script
src=
"https://code.jquery.com/jquery-3.2.1.slim.min.js"
integrity=
"sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
crossorigin=
"anonymous"
></script>
<script>
$
(
document
).
ready
(
function
()
{
// when user clicks add more btn of images
$
(
'.add-images'
).
click
(
function
(
ev
)
{
ev
.
preventDefault
();
var
count
=
$
(
'#item-images'
).
children
().
length
;
var
tmplMarkup
=
$
(
'#images-template'
).
html
();
var
compiledTmpl
=
tmplMarkup
.
replace
(
/__prefix__/g
,
count
);
$
(
'#item-images'
).
append
(
compiledTmpl
);
// update form count
$
(
'#id_images-TOTAL_FORMS'
).
attr
(
'value'
,
count
+
1
);
});
});
$
(
document
).
ready
(
function
()
{
// when user clicks add more btn of variants
$
(
'.add-variants'
).
click
(
function
(
ev
)
{
ev
.
preventDefault
();
var
count
=
$
(
'#item-variants'
).
children
().
length
;
var
tmplMarkup
=
$
(
'#variants-template'
).
html
();
var
compiledTmpl
=
tmplMarkup
.
replace
(
/__prefix__/g
,
count
);
$
(
'#item-variants'
).
append
(
compiledTmpl
);
// update form count
$
(
'#id_variants-TOTAL_FORMS'
).
attr
(
'value'
,
count
+
1
);
});
});
</script>
{% endblock %}
\ No newline at end of file
redbrickboard/event_management/templates/event_management/event-list.html
View file @
1491549b
...
...
@@ -13,4 +13,5 @@
</ul>
{% endfor %}
</ul>
<button
type=
"button"
onclick=
"location.href='/events/add/'"
>
Add Event
</button>
{% endblock %}
redbrickboard/event_management/urls.py
View file @
1491549b
from
django.urls
import
path
from
.views
import
EventListView
,
EventDetailView
,
EventCreateView
,
EventUpdateView
from
.views
import
EventListView
,
EventDetailView
,
EventCreateView
,
EventUpdateView
,
delete_image
urlpatterns
=
[
path
(
''
,
EventListView
.
as_view
(),
name
=
'event-list'
),
path
(
'<int:pk>/details'
,
EventDetailView
.
as_view
(),
name
=
'event-details'
),
path
(
'add/'
,
EventCreateView
.
as_view
(),
name
=
'event-create'
),
path
(
'<int:pk>/update'
,
EventUpdateView
.
as_view
(),
name
=
'event-update'
),
path
(
'int<pk>/delete-image'
,
delete_image
,
name
=
'delete_image'
),
]
app_name
=
"event_management"
\ No newline at end of file
redbrickboard/event_management/views.py
View file @
1491549b
...
...
@@ -5,11 +5,53 @@ from django.views.generic.detail import DetailView
from
django.views.generic.list
import
ListView
from
django.views.generic.edit
import
CreateView
,
UpdateView
from
.forms
import
EventForm
from
.models
import
Event
from
.forms
import
(
EventForm
,
PromoFormSet
)
from
.models
import
Event
,
Promo
def
delete_image
(
request
,
pk
):
try
:
image
=
Promo
.
objects
.
get
(
id
=
pk
)
except
Promo
.
DoesNotExist
:
messages
.
success
(
request
,
'Object Does not exist'
)
return
redirect
(
'event_management:event-update'
,
pk
=
image
.
event
.
id
)
image
.
delete
()
messages
.
success
(
request
,
'Image deleted successfully'
)
return
redirect
(
'event_management:event-update'
,
pk
=
image
.
event
.
id
)
class
PromoInline
():
form_class
=
EventForm
template_name
=
'event_management/event-form.html'
def
form_valid
(
self
,
form
):
named_formsets
=
self
.
get_named_formsets
()
if
not
all
((
x
.
is_valid
()
for
x
in
named_formsets
.
values
())):
return
self
.
render_to_response
(
self
.
get_context_data
(
form
=
form
))
self
.
object
=
form
.
save
()
for
name
,
formset
in
named_formsets
.
items
():
formset_save_func
=
getattr
(
self
,
'formset_{0}_valid'
.
format
(
name
),
None
)
if
formset_save_func
is
not
None
:
formset_save_func
(
formset
)
else
:
formset
.
save
()
return
redirect
(
'event_management:event-list'
)
def
formset_images_valid
(
self
,
formset
):
images
=
formset
.
save
(
commit
=
False
)
for
obj
in
formset
.
deleted_objects
:
obj
.
delete
()
for
image
in
images
:
image
.
event
=
self
.
object
image
.
save
()
class
EventDetailView
(
DetailView
):
model
=
Event
fields
=
'__all__'
template_name
=
'event_management/event-details.html'
class
EventListView
(
ListView
):
...
...
@@ -17,13 +59,43 @@ class EventListView(ListView):
fields
=
'__all__'
template_name
=
'event_management/event-list.html'
class
EventCreateView
(
CreateView
):
model
=
Event
form_class
=
EventForm
success_url
=
'/events/'
template_name
=
'event_management/event-form.html'
#
class EventCreateView(CreateView):
#
model = Event
#
form_class = EventForm
#
success_url = '/events/'
#
template_name = 'event_management/event-form.html'
class
EventUpdateView
(
UpdateView
):
# class EventUpdateView(UpdateView):
# model = Event
# fields = '__all__'
# # success_url =
# template_name = 'event_management/event-form.html'
class
EventCreateView
(
PromoInline
,
CreateView
):
model
=
Event
fields
=
'__all__'
template_name
=
'event_management/event-form.html'
\ No newline at end of file
def
get_context_data
(
self
,
**
kwargs
):
ctx
=
super
(
EventCreateView
,
self
)
.
get_context_data
(
**
kwargs
)
ctx
[
'named_formsets'
]
=
self
.
get_named_formsets
()
return
ctx
def
get_named_formsets
(
self
):
if
self
.
request
.
method
==
"GET"
:
return
{
'images'
:
PromoFormSet
(
prefix
=
'images'
)
}
else
:
return
{
'images'
:
PromoFormSet
(
self
.
request
.
POST
or
None
,
self
.
request
.
FILES
or
None
,
prefix
=
'images'
)
}
class
EventUpdateView
(
PromoInline
,
UpdateView
):
model
=
Event
def
get_context_data
(
self
,
**
kwargs
):
ctx
=
super
(
EventUpdateView
,
self
)
.
get_context_data
(
**
kwargs
)
ctx
[
'named_formsets'
]
=
self
.
get_named_formsets
()
return
ctx
def
get_named_formsets
(
self
):
return
{
'images'
:
PromoFormSet
(
self
.
request
.
POST
or
None
,
self
.
request
.
FILES
or
None
,
instance
=
self
.
object
,
prefix
=
'images'
),
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment