Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: p2pu/learning-circles
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 632ea40d555d6492f0944f6d5ac49dfd552efa15
Choose a base ref
..
head repository: p2pu/learning-circles
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 74ae455af3e61e2fead96984206836ec5be72fa6
Choose a head ref
Showing with 1,620 additions and 1,018 deletions.
  1. +0 −38 .travis.yml
  2. +1 −1 README.md
  3. +18 −0 community_calendar/migrations/0004_alter_event_moderation_approved.py
  4. +9 −2 custom_registration/views.py
  5. +3 −4 docker-compose.test.yml
  6. +4 −0 docker-compose.yml
  7. +42 −4 e2e/fixtures/test_studygroups.json
  8. +2 −2 e2e/tests/test_learning_circle_creation.py
  9. +3 −1 e2e/tests/test_learning_circle_manage.py
  10. +17 −9 frontend/components/create-learning-circle-page.jsx
  11. +1 −3 frontend/components/dashboard/FacilitatorDashboard.jsx
  12. +1 −1 frontend/components/dashboard/TeamInvitationsTable.jsx
  13. +0 −149 frontend/components/dashboard/UpcomingLearningCirclesTable.jsx
  14. +0 −117 frontend/components/dashboard/UpcomingMeetings.jsx
  15. +60 −4 frontend/components/learning_circle_form/FinalizeSection.jsx
  16. +3 −1 frontend/components/learning_circle_form/FormTabs.jsx
  17. +0 −1 frontend/components/weekly-meetings-list.jsx
  18. +0 −8 frontend/helpers/constants.js
  19. +2 −1 frontend/learning-circle-create.jsx
  20. +6 −4 learnwithpeople/settings.py
  21. +1 −1 p2pu-theme
  22. +0 −35 release-notes.md
  23. +1 −1 requirements.txt
  24. +6 −0 static/sass/_learningcircle.scss
  25. +8 −0 static/sass/p2pu-custom.scss
  26. +7 −4 studygroups/admin.py
  27. +0 −2 studygroups/api_urls.py
  28. +3 −2 studygroups/charts.py
  29. +3 −2 studygroups/decorators.py
  30. +40 −4 studygroups/fixtures/test_studygroups.json
  31. +15 −0 studygroups/forms.py
  32. +6 −2 studygroups/ics.py
  33. +0 −16 studygroups/management/commands/add_team_to_learning_circles.py
  34. +17 −0 studygroups/management/commands/update_courses.py
  35. +18 −0 studygroups/migrations/0159_auto_20220510_0925.py
  36. +18 −0 studygroups/migrations/0160_rename_unlisted_studygroup_members_only.py
  37. +18 −0 studygroups/migrations/0161_reminder_edited_by_facilitator.py
  38. +23 −0 studygroups/migrations/0162_auto_20220614_0508.py
  39. +25 −0 studygroups/migrations/0163_facilitator.py
  40. +22 −0 studygroups/migrations/0164_facilitator_data_migration.py
  41. +18 −0 studygroups/migrations/0165_rename_facilitator_studygroup_created_by.py
  42. +95 −39 studygroups/models/__init__.py
  43. +1 −1 studygroups/models/base.py
  44. +55 −24 studygroups/models/learningcircle.py
  45. +14 −6 studygroups/models/team.py
  46. +15 −4 studygroups/signals.py
  47. +68 −19 studygroups/tasks.py
  48. +1 −1 studygroups/tests/api/test_course_api.py
  49. +3 −1 studygroups/tests/api/test_feedback_api.py
  50. +0 −44 studygroups/tests/api/test_landing_page_api.py
  51. +215 −3 studygroups/tests/api/test_learning_circle_api.py
  52. +1 −1 studygroups/tests/api/test_teams_api.py
  53. +23 −23 studygroups/tests/test_facilitator_views.py
  54. +12 −9 studygroups/tests/test_learner_views.py
  55. +1 −1 studygroups/tests/test_models.py
  56. +23 −20 studygroups/tests/test_organizer_views.py
  57. +3 −3 studygroups/tests/test_report_views.py
  58. +8 −6 studygroups/tests/test_tasks.py
  59. +13 −7 studygroups/urls.py
  60. +106 −87 studygroups/views/api.py
  61. +10 −15 studygroups/views/drf.py
  62. +89 −11 studygroups/views/facilitate.py
  63. +8 −12 studygroups/views/learner.py
  64. +4 −46 studygroups/views/organizer.py
  65. +58 −26 studygroups/views/staff.py
  66. +42 −4 surveys/fixtures/test_studygroups.json
  67. +3 −3 surveys/models.py
  68. +2 −2 templates/email_base.html
  69. +2 −5 templates/nav.html
  70. +9 −2 templates/studygroups/{add_member.html → add_learner.html}
  71. +59 −0 templates/studygroups/add_learners.html
  72. +1 −1 templates/studygroups/course_page.html
  73. +1 −0 templates/studygroups/email/facilitator_added-subject.txt
  74. +15 −0 templates/studygroups/email/facilitator_added.html
  75. +1 −1 templates/studygroups/email/facilitator_meeting_reminder.html
  76. +1 −1 templates/studygroups/email/facilitator_meeting_reminder.txt
  77. +1 −1 templates/studygroups/email/facilitator_meeting_wrapup.html
  78. +1 −0 templates/studygroups/email/facilitator_removed-subject.txt
  79. +14 −0 templates/studygroups/email/facilitator_removed.html
  80. +1 −1 templates/studygroups/email/facilitator_survey.html
  81. +1 −1 templates/studygroups/email/facilitator_survey.txt
  82. +14 −2 templates/studygroups/email/learner_signup.html
  83. +1 −1 templates/studygroups/email/learning_circle_created.html
  84. +5 −1 templates/studygroups/email/meeting_reminder.html
  85. +156 −109 templates/studygroups/email/weekly-update.html
  86. +1 −1 templates/studygroups/learner_survey.html
  87. +17 −13 templates/studygroups/signup.html
  88. +7 −0 templates/studygroups/studygroup_form.html
  89. +0 −23 templates/studygroups/studygroup_react.html
  90. +18 −18 templates/studygroups/view_study_group.html
38 changes: 0 additions & 38 deletions .travis.yml

This file was deleted.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Learning circles [![Build Status](https://travis-ci.org/p2pu/learning-circles.svg?branch=master)](https://travis-ci.org/p2pu/learning-circles)
# Learning circles

Learning circles are study groups that meet weekly at a physical location to work together through an online course.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2.13 on 2022-06-14 05:08

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('community_calendar', '0003_auto_20200302_1350'),
]

operations = [
migrations.AlterField(
model_name='event',
name='moderation_approved',
field=models.BooleanField(blank=True, null=True),
),
]
11 changes: 9 additions & 2 deletions custom_registration/views.py
Original file line number Diff line number Diff line change
@@ -29,6 +29,7 @@
from studygroups.models import TeamMembership
from studygroups.models import Profile
from studygroups.forms import TeamMembershipForm
from studygroups.models.learningcircle import StudyGroup
from uxhelpers.utils import json_response
from api import schema
from .models import create_user
@@ -309,8 +310,14 @@ def delete(self, request, *args, **kwargs):
user.username = random_username
user.save()

# delete any active or future learning circles
user.studygroup_set.update(deleted_at=timezone.now())
for lc in StudyGroup.objects.active().filter(facilitator__user=user):
if lc.facilitator_set.count() == 1:
lc.deleted_at = timezone.now()

if lc.facilitator_set.count() > 1:
lc.facilitator_set.filter(user=user).delete()

lc.save()

# delete profile data
profile = user.profile
7 changes: 3 additions & 4 deletions docker-compose.test.yml
Original file line number Diff line number Diff line change
@@ -2,8 +2,8 @@ version: '3'
services:
postgres:
image: postgres:11
ports:
- "5432:5432"
volumes:
- ./compose/postgres:/var/lib/postgresql/data
email:
image: djfarrelly/maildev
ports:
@@ -13,13 +13,12 @@ services:
image: p2pu/learning-circles:local
links:
- selenium
ports:
- "8000:8000"
volumes:
- .:/opt/app
depends_on:
- postgres
- email
- selenium
command: /opt/django-venv/bin/python manage.py test
environment:
- DATABASE_URL=postgres://lc:password@postgres:5432/lc
4 changes: 4 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -2,8 +2,12 @@ version: '3'
services:
postgres:
image: postgres:11
ports:
- 5432:5432
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
volumes:
- ./compose/postgres:/var/lib/postgresql/data
rabbitmq:
image: rabbitmq:3
email:
46 changes: 42 additions & 4 deletions e2e/fixtures/test_studygroups.json
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@
"longitude" : "-87.650050",
"language" : "en",
"place_id" : "",
"facilitator": 1,
"created_by": 1,
"venue_name": "Harold Washington",
"venue_address": "123 Street",
"venue_details": "3rd floor",
@@ -45,6 +45,16 @@
"model": "studygroups.studygroup",
"pk": 1
},
{
"fields": {
"added_at": "2015-03-23T15:18:39.462Z",
"user": 1,
"study_group": 1
},
"model": "studygroups.facilitator",
"pk": 1
},

{
"fields": {
"created_at": "2015-03-23T15:19:04.318Z",
@@ -57,7 +67,7 @@
"end_date": "2015-03-23",
"duration": 120,
"timezone": "US/Central",
"facilitator": 1,
"created_by": 1,
"venue_name": "Harold Washington",
"venue_address": "123 Street",
"venue_details": "3rd floor",
@@ -71,6 +81,16 @@
"model": "studygroups.studygroup",
"pk": 2
},
{
"fields": {
"added_at": "2015-03-23T15:18:39.462Z",
"user": 1,
"study_group": 2
},
"model": "studygroups.facilitator",
"pk": 2
},

{
"fields": {
"created_at": "2015-03-25T14:35:02.227Z",
@@ -83,7 +103,7 @@
"end_date": "2015-03-23",
"duration": 120,
"timezone": "US/Central",
"facilitator": 1,
"created_by": 1,
"venue_name": "Harold Washington",
"venue_address": "123 Street",
"venue_details": "3rd floor",
@@ -97,6 +117,15 @@
"model": "studygroups.studygroup",
"pk": 3
},
{
"fields": {
"added_at": "2015-03-23T15:18:39.462Z",
"user": 1,
"study_group": 3
},
"model": "studygroups.facilitator",
"pk": 3
},
{
"fields": {
"created_at": "2015-03-25T15:55:44.525Z",
@@ -109,7 +138,7 @@
"end_date": "2015-03-23",
"duration": 120,
"timezone": "US/Central",
"facilitator": 1,
"created_by": 1,
"venue_name": "Harold Washington",
"venue_address": "123 Street",
"venue_details": "3rd floor",
@@ -122,5 +151,14 @@
},
"model": "studygroups.studygroup",
"pk": 4
},
{
"fields": {
"added_at": "2015-03-23T15:18:39.462Z",
"user": 1,
"study_group": 4
},
"model": "studygroups.facilitator",
"pk": 4
}
]
4 changes: 2 additions & 2 deletions e2e/tests/test_learning_circle_creation.py
Original file line number Diff line number Diff line change
@@ -155,7 +155,7 @@ def test_save_draft_learning_circle(self):
self.wait.until(expected_conditions.url_changes('%s%s' % (self.live_server_url, '/en/studygroup/create/')))

saved_studygroup = StudyGroup.objects.filter(draft=True).last()
self.assertEqual(saved_studygroup.facilitator, facilitator)
self.assertEqual(saved_studygroup.created_by, facilitator)
self.assertTrue(expected_conditions.url_to_be('{}/en/studygroup/{}/'.format(self.live_server_url, saved_studygroup.id)))


@@ -196,7 +196,7 @@ def test_publish_learning_circle(self):
self.wait.until(expected_conditions.url_changes('%s%s' % (self.live_server_url, '/en/studygroup/create/')))

published_studygroup = StudyGroup.objects.published().last()
self.assertEqual(published_studygroup.facilitator, facilitator)
self.assertEqual(published_studygroup.created_by, facilitator)
self.assertTrue(expected_conditions.url_to_be('{}/en/studygroup/{}/'.format(self.live_server_url, published_studygroup.id)))


4 changes: 3 additions & 1 deletion e2e/tests/test_learning_circle_manage.py
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
from studygroups.models import Course
from studygroups.models import StudyGroup
from studygroups.models import Meeting
from studygroups.models import Facilitator
from custom_registration.models import create_user

from datetime import timedelta, time
@@ -56,8 +57,9 @@ def tearDownClass(cls):
def setUp(self):
self.facilitator = create_user('hi@example.net', 'bowie', 'wowie', 'password')
sg = StudyGroup.objects.get(pk=1)
sg.facilitator = self.facilitator
sg.created_by = self.facilitator
sg.save()
Facilitator.objects.create(study_group=sg, user=self.facilitator)
self.study_group = sg
meeting_date = timezone.now() - timedelta(days=2)
meeting = Meeting.objects.create(study_group=sg, meeting_date=meeting_date.date(), meeting_time=time(18, 0))
26 changes: 17 additions & 9 deletions frontend/components/create-learning-circle-page.jsx
Original file line number Diff line number Diff line change
@@ -30,6 +30,13 @@ function dateObjectToStringForDB(date){
return { meeting_date: `${year}-${month}-${day}`, meeting_time: `${hours}:${minutes}` };
}

function parseMeetingDate(meetingObj){
const parsedMeeting = JSON.parse(meetingObj)
const [year, month, day] = parsedMeeting['meeting_date'].split('-')
const [hour, minute] = parsedMeeting['meeting_time'].split(':')
const date = new Date(year, month-1, day, hour, minute)
return date
}

export default class CreateLearningCirclePage extends React.Component {
static defaultProps = {
@@ -39,16 +46,18 @@ export default class CreateLearningCirclePage extends React.Component {
constructor(props){
super(props);
console.log(this.props.learningCircle)
const meetings = this.props.learningCircle.meetings.map(m => this.parseMeetingDate(m)).sort((a,b) => a - b)
const meetings = this.props.learningCircle.meetings.map(m => parseMeetingDate(m)).sort((a,b) => a - b)
this.state = {
currentTab: 0,
learningCircle: {
...this.props.learningCircle,
meetings: meetings
},
team: this.props.team,
showModal: false,
showHelp: window.screen.width > DESKTOP_BREAKPOINT,
user: this.props.user,
userId: this.props.userId,
errors: {},
alert: { show: false },
isSaving: false,
@@ -78,6 +87,11 @@ export default class CreateLearningCirclePage extends React.Component {
const urlParams = new URL(window.location.href).searchParams;
let courseId;

if (this.props.learningCircle.reminders_edited){
this.showAlert(`You have previously edited reminder messages for future meetings. Updating the learning circle name or venue information will cause the reminders to be regenerated and your edits will be lost.`, 'warning');
}


if (urlParams.get('course_id')) {
courseId = urlParams.get('course_id')
} else if (this.props.learningCircle && this.props.learningCircle.course) {
@@ -179,14 +193,6 @@ export default class CreateLearningCirclePage extends React.Component {
return this.state.learningCircle.meetings.map(m=> dateObjectToStringForDB(m))
}

parseMeetingDate = (meetingObj) => {
const parsedMeeting = JSON.parse(meetingObj)
const [year, month, day] = parsedMeeting['meeting_date'].split('-')
const [hour, minute] = parsedMeeting['meeting_time'].split(':')
const date = new Date(year, month-1, day, hour, minute)
return date
}

_onSubmitForm(draft=true) {
if (!this.state.user) {
this.showModal();
@@ -286,7 +292,9 @@ export default class CreateLearningCirclePage extends React.Component {
currentTab={this.state.currentTab}
allTabs={this.allTabs}
changeTab={this.changeTab}
userId={this.props.userId}
learningCircle={this.state.learningCircle}
team={this.state.team}
errors={this.state.errors}
onCancel={this.onCancel}
onSubmitForm={this.onSubmitForm}
4 changes: 1 addition & 3 deletions frontend/components/dashboard/FacilitatorDashboard.jsx
Original file line number Diff line number Diff line change
@@ -10,11 +10,9 @@ import Notification from './Notification';
import DiscourseTable from './DiscourseTable';
import CoursesTable from './CoursesTable';
import MemberLearningCirclesTable from './MemberLearningCirclesTable';
import UpcomingLearningCirclesTable from './UpcomingLearningCirclesTable';
import CurrentLearningCirclesTable from './CurrentLearningCirclesTable';
import ActiveLearningCirclesTable from './ActiveLearningCirclesTable';
import CompletedLearningCirclesTable from './CompletedLearningCirclesTable';
import UpcomingMeetings from './UpcomingMeetings';
import RecommendedResources from "./RecommendedResources";
import GlobalSuccesses from "./GlobalSuccesses";
import InstagramFeed from "./InstagramFeed";
@@ -115,7 +113,7 @@ export default class FacilitatorDashboard extends React.Component {
memberSupportUrl={this.props.memberSupportUrl}
/>

{ this.props.isMemberTeam &&
{ (this.props.isMemberTeam || this.props.isStaff) &&
<Card>
<div className="card-title">Member Learning Circles</div>
<MemberLearningCirclesTable />
2 changes: 1 addition & 1 deletion frontend/components/dashboard/TeamInvitationsTable.jsx
Original file line number Diff line number Diff line change
@@ -77,7 +77,7 @@ export default class TeamMembersTable extends Component {
if (this.state.teamMembers.length === 0) {
return(
<div className="py-2">
<div>You don't have any team members.</div>
<div>You don't have any pending invitations.</div>
</div>
)
}
Loading