Skip to content

Commit 152766f

Browse files
JacobCoffeeewdurbindependabot[bot]miketheman
authored
release: merge main into release (#2607)
* fix: display active events, fix time not displaying for some events (#2556) * fix: display active events, fix time not displaying for some events * test: passing events view tests * style: different icon * Update views.py Co-authored-by: Ee Durbin <[email protected]> --------- Co-authored-by: Ee Durbin <[email protected]> * Bump django-admin-interface from 0.24.2 to 0.28.9 (#2589) Bumps [django-admin-interface](https://github.com/fabiocaccamo/django-admin-interface) from 0.24.2 to 0.28.9. - [Release notes](https://github.com/fabiocaccamo/django-admin-interface/releases) - [Changelog](https://github.com/fabiocaccamo/django-admin-interface/blob/main/CHANGELOG.md) - [Commits](fabiocaccamo/django-admin-interface@0.24.2...0.28.9) --- updated-dependencies: - dependency-name: django-admin-interface dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jacob Coffee <[email protected]> * Bump django-pipeline from 3.0.0 to 3.1.0 (#2549) Bumps [django-pipeline](https://github.com/jazzband/django-pipeline) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/jazzband/django-pipeline/releases) - [Changelog](https://github.com/jazzband/django-pipeline/blob/master/HISTORY.rst) - [Commits](jazzband/django-pipeline@3.0.0...3.1.0) --- updated-dependencies: - dependency-name: django-pipeline dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump factory-boy from 3.2.1 to 3.3.1 (#2548) Bumps [factory-boy](https://github.com/FactoryBoy/factory_boy) from 3.2.1 to 3.3.1. - [Changelog](https://github.com/FactoryBoy/factory_boy/blob/master/docs/changelog.rst) - [Commits](FactoryBoy/factory_boy@3.2.1...3.3.1) --- updated-dependencies: - dependency-name: factory-boy dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(frontend): add help text to story form (#2594) * fix(frontend): add help text to story form Closes #2364 * chore: source migration * fix: use meta class overrides instead * feat: linkify * Bump python-decouple from 3.4 to 3.8 (#2596) Bumps [python-decouple](https://github.com/henriquebastos/python-decouple) from 3.4 to 3.8. - [Release notes](https://github.com/henriquebastos/python-decouple/releases) - [Changelog](https://github.com/HBNetwork/python-decouple/blob/master/CHANGELOG.md) - [Commits](HBNetwork/python-decouple@v3.4...v3.8) --- updated-dependencies: - dependency-name: python-decouple dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jacob Coffee <[email protected]> * deps: no mo boto (#2598) * Bump django-tastypie from 0.14.6 to 0.14.7 (#2602) Bumps [django-tastypie](https://github.com/django-tastypie/django-tastypie) from 0.14.6 to 0.14.7. - [Release notes](https://github.com/django-tastypie/django-tastypie/releases) - [Commits](django-tastypie/django-tastypie@v0.14.6...v0.14.7) --- updated-dependencies: - dependency-name: django-tastypie dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump cssselect from 1.1.0 to 1.2.0 (#2606) Bumps [cssselect](https://github.com/scrapy/cssselect) from 1.1.0 to 1.2.0. - [Changelog](https://github.com/scrapy/cssselect/blob/master/CHANGES) - [Commits](scrapy/cssselect@v1.1.0...v1.2.0) --- updated-dependencies: - dependency-name: cssselect dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chores & docs: clean up some inaccuracies in getting started (#2600) * chore: remove obsolete version entry from compose Currently raises a warning: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion Signed-off-by: Mike Fiedler <[email protected]> * docs: staging site does not exist Signed-off-by: Mike Fiedler <[email protected]> * docs: format the link to be clickable Signed-off-by: Mike Fiedler <[email protected]> * docs: use what's currently in docker-compose.yml Signed-off-by: Mike Fiedler <[email protected]> * docs: remove version specificity Signed-off-by: Mike Fiedler <[email protected]> --------- Signed-off-by: Mike Fiedler <[email protected]> --------- Signed-off-by: dependabot[bot] <[email protected]> Signed-off-by: Mike Fiedler <[email protected]> Co-authored-by: Ee Durbin <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mike Fiedler <[email protected]>
1 parent 5f354bb commit 152766f

File tree

11 files changed

+178
-69
lines changed

11 files changed

+178
-69
lines changed

.github/dependabot.yml

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ updates:
1616
- 0.13.0
1717
- 0.13.1
1818
- 0.13.2
19+
- dependency-name: "boto3"
20+
- dependency-name: "boto3-stubs"
21+
- dependency-name: "botocore"
22+
- dependency-name: "botocore-stubs"
1923
- dependency-name: lxml
2024
versions:
2125
- 4.6.2

base-requirements.txt

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
dj-database-url==0.5.0
2-
django-pipeline==3.0.0 # 3.0.0 is first version that supports Django 4.2
2+
django-pipeline==3.1.0 # 3.0.0 is first version that supports Django 4.2
33
django-sitetree==1.18.0 # >=1.17.1 is (?) first version that supports Django 4.2
44
django-apptemplates==1.5
5-
django-admin-interface==0.24.2
5+
django-admin-interface==0.28.9
66
django-translation-aliases==0.1.0
77
Django==4.2.16
88
docutils==0.21.2
@@ -11,10 +11,10 @@ cmarkgfm==0.6.0
1111
Pillow==10.4.0
1212
psycopg2-binary==2.9.9
1313
python3-openid==3.2.0
14-
python-decouple==3.4
14+
python-decouple==3.8
1515
# lxml used by BeautifulSoup.
1616
lxml==5.2.2
17-
cssselect==1.1.0
17+
cssselect==1.2.0
1818
feedparser==6.0.11
1919
beautifulsoup4==4.12.3
2020
icalendar==4.0.7
@@ -26,7 +26,7 @@ django-imagekit==5.0 # 5.0 is first version that supports Django 4.2
2626
django-haystack==3.2.1
2727
elasticsearch>=7,<8
2828
# TODO: 0.14.0 only supports Django 1.8 and 1.11.
29-
django-tastypie==0.14.6 # 0.14.6 is first version that supports Django 4.2
29+
django-tastypie==0.14.7 # 0.14.6 is first version that supports Django 4.2
3030

3131
pytz==2021.1
3232
python-dateutil==2.8.2

dev-requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# Required for running tests
44

5-
factory-boy==3.2.1
5+
factory-boy==3.3.1
66
Faker==0.8.1
77
tblib==1.7.0
88
responses==0.13.3

docker-compose.yml

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
version: "3.9"
2-
31
services:
42
postgres:
53
image: postgres:15.3-bullseye

docs/source/index.rst

-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ General information
1010
:Issue tracker: https://github.com/python/pythondotorg/issues
1111
:Mailing list: pydotorg-www_
1212
:IRC: ``#pydotorg`` on Freenode
13-
:Staging site: https://staging.python.org/ (``main`` branch)
1413
:Production configuration: https://github.com/python/psf-salt
1514
:GitHub Actions:
1615
.. image:: https://github.com/python/pythondotorg/actions/workflows/ci.yml/badge.svg

docs/source/install.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ web_1 | Starting development server at http://0.0.0.0:8000/
5555
web_1 | Quit the server with CONTROL-C.
5656
```
5757

58-
You can view these results in your local web browser at: `http://localhost:8000`
58+
You can view these results in your local web browser at: <http://localhost:8000>
5959

6060
To reset your local environment, run:
6161

@@ -88,7 +88,7 @@ This is a simple wrapper around running `python manage.py` in the container, all
8888
Manual setup
8989
------------
9090

91-
First, install [PostgreSQL](https://www.postgresql.org/download/) on your machine and run it. *pythondotorg* currently uses Postgres 10.21.
91+
First, install [PostgreSQL](https://www.postgresql.org/download/) on your machine and run it. *pythondotorg* currently uses Postgres 15.x.
9292

9393
Then clone the repository:
9494

@@ -99,7 +99,7 @@ $ git clone git://github.com/python/pythondotorg.git
9999
Then create a virtual environment:
100100

101101
```
102-
$ python3.9 -m venv venv
102+
$ python3 -m venv venv
103103
```
104104

105105
And then you'll need to install dependencies. You don't need to use `pip3` inside a Python 3 virtual environment:

events/models.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,15 @@ def previous_time(self):
211211
return None
212212

213213
@property
214-
def next_or_previous_time(self):
215-
return self.next_time or self.previous_time
214+
def next_or_previous_time(self) -> models.Model:
215+
"""Return the next or previous time of the event OR the occurring rule."""
216+
if next_time := self.next_time:
217+
return next_time
218+
219+
if previous_time := self.previous_time:
220+
return previous_time
221+
222+
return self.occurring_rule if hasattr(self, "occurring_rule") else None
216223

217224
@property
218225
def is_past(self):

events/tests/test_views.py

+54-7
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,50 @@ def setUpTestData(cls):
3535
finish=cls.now - datetime.timedelta(days=1),
3636
)
3737

38+
# Future event
39+
cls.future_event = Event.objects.create(title='Future Event', creator=cls.user, calendar=cls.calendar, featured=True)
40+
RecurringRule.objects.create(
41+
event=cls.future_event,
42+
begin=cls.now + datetime.timedelta(days=1),
43+
finish=cls.now + datetime.timedelta(days=2),
44+
)
45+
46+
# Happening now event
47+
cls.current_event = Event.objects.create(title='Current Event', creator=cls.user, calendar=cls.calendar)
48+
RecurringRule.objects.create(
49+
event=cls.current_event,
50+
begin=cls.now - datetime.timedelta(hours=1),
51+
finish=cls.now + datetime.timedelta(hours=1),
52+
)
53+
54+
# Just missed event
55+
cls.just_missed_event = Event.objects.create(title='Just Missed Event', creator=cls.user, calendar=cls.calendar)
56+
RecurringRule.objects.create(
57+
event=cls.just_missed_event,
58+
begin=cls.now - datetime.timedelta(hours=3),
59+
finish=cls.now - datetime.timedelta(hours=1),
60+
)
61+
62+
# Past event
63+
cls.past_event = Event.objects.create(title='Past Event', creator=cls.user, calendar=cls.calendar)
64+
RecurringRule.objects.create(
65+
event=cls.past_event,
66+
begin=cls.now - datetime.timedelta(days=2),
67+
finish=cls.now - datetime.timedelta(days=1),
68+
)
69+
3870
def test_events_homepage(self):
3971
url = reverse('events:events')
4072
response = self.client.get(url)
73+
events = response.context['object_list']
74+
event_titles = [event.title for event in events]
75+
4176
self.assertEqual(response.status_code, 200)
42-
self.assertEqual(len(response.context['object_list']), 1)
77+
self.assertEqual(len(events), 6)
78+
79+
self.assertIn('Future Event', event_titles)
80+
self.assertIn('Current Event', event_titles)
81+
self.assertIn('Past Event', event_titles)
4382

4483
def test_calendar_list(self):
4584
calendars_count = Calendar.objects.count()
@@ -54,7 +93,7 @@ def test_event_list(self):
5493
response = self.client.get(url)
5594

5695
self.assertEqual(response.status_code, 200)
57-
self.assertEqual(len(response.context['object_list']), 1)
96+
self.assertEqual(len(response.context['object_list']), 3)
5897

5998
url = reverse('events:event_list_past', kwargs={"calendar_slug": 'unexisting'})
6099
response = self.client.get(url)
@@ -66,7 +105,7 @@ def test_event_list_past(self):
66105
response = self.client.get(url)
67106

68107
self.assertEqual(response.status_code, 200)
69-
self.assertEqual(len(response.context['object_list']), 1)
108+
self.assertEqual(len(response.context['object_list']), 4)
70109

71110
def test_event_list_category(self):
72111
category = EventCategory.objects.create(
@@ -114,7 +153,7 @@ def test_event_list_date(self):
114153
response = self.client.get(url)
115154
self.assertEqual(response.status_code, 200)
116155
self.assertEqual(response.context['object'], dt.date())
117-
self.assertEqual(len(response.context['object_list']), 2)
156+
self.assertEqual(len(response.context['object_list']), 6)
118157

119158
def test_eventlocation_list(self):
120159
venue = EventLocation.objects.create(
@@ -150,12 +189,20 @@ def test_event_detail(self):
150189
self.assertEqual(self.event, response.context['object'])
151190

152191
def test_upcoming_tag(self):
153-
self.assertEqual(len(get_events_upcoming()), 1)
154-
self.assertEqual(len(get_events_upcoming(only_featured=True)), 0)
192+
self.assertEqual(len(get_events_upcoming()), 3)
193+
self.assertEqual(len(get_events_upcoming(only_featured=True)), 1)
155194
self.rule.begin = self.now - datetime.timedelta(days=3)
156195
self.rule.finish = self.now - datetime.timedelta(days=2)
157196
self.rule.save()
158-
self.assertEqual(len(get_events_upcoming()), 0)
197+
self.assertEqual(len(get_events_upcoming()), 2)
198+
199+
def test_context_data(self):
200+
url = reverse("events:events")
201+
response = self.client.get(url)
202+
203+
self.assertIn("events_just_missed", response.context)
204+
self.assertIn("upcoming_events", response.context)
205+
self.assertIn("events_now", response.context)
159206

160207

161208
class EventSubmitTests(TestCase):

events/views.py

+18-5
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,21 @@ def get_context_data(self, **kwargs):
4040

4141
class EventHomepage(ListView):
4242
""" Main Event Landing Page """
43-
template_name = 'events/event_list.html'
43+
template_name = "events/event_list.html"
4444

45-
def get_queryset(self):
46-
return Event.objects.for_datetime(timezone.now()).order_by('occurring_rule__dt_start')
45+
def get_queryset(self) -> Event:
46+
"""Queryset to return all events, ordered by START date."""
47+
return Event.objects.all().order_by("-occurring_rule__dt_start")
48+
49+
def get_context_data(self, **kwargs: dict) -> dict:
50+
"""Add more ctx, specifically events that are happening now, just missed, and upcoming."""
51+
context = super().get_context_data(**kwargs)
52+
context["events_just_missed"] = Event.objects.until_datetime(timezone.now())[:2]
53+
context["upcoming_events"] = Event.objects.for_datetime(timezone.now())
54+
context["events_now"] = Event.objects.filter(
55+
occurring_rule__dt_start__lte=timezone.now(),
56+
occurring_rule__dt_end__gte=timezone.now())[:2]
57+
return context
4758

4859

4960
class EventDetail(DetailView):
@@ -68,11 +79,13 @@ def get_context_data(self, **kwargs):
6879
class EventList(EventListBase):
6980

7081
def get_queryset(self):
71-
return Event.objects.for_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug']).order_by('occurring_rule__dt_start')
82+
return Event.objects.for_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug']).order_by(
83+
'occurring_rule__dt_start')
7284

7385
def get_context_data(self, **kwargs):
7486
context = super().get_context_data(**kwargs)
75-
context['events_today'] = Event.objects.until_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug'])[:2]
87+
context['events_today'] = Event.objects.until_datetime(timezone.now()).filter(
88+
calendar__slug=self.kwargs['calendar_slug'])[:2]
7689
context['calendar'] = get_object_or_404(Calendar, slug=self.kwargs['calendar_slug'])
7790
return context
7891

successstories/forms.py

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ class Meta:
2424
labels = {
2525
'name': 'Story name',
2626
}
27+
help_texts = {
28+
"content": "Note: Submissions in <a href='https://www.markdownguide.org/basic-syntax/'>Markdown</a> "
29+
"are strongly preferred and can be processed faster.",
30+
}
2731

2832
def clean_name(self):
2933
name = self.cleaned_data.get('name')

0 commit comments

Comments
 (0)