diff --git a/src/bornhack/settings.py b/src/bornhack/settings.py
index 8bf4cd27..91590962 100644
--- a/src/bornhack/settings.py
+++ b/src/bornhack/settings.py
@@ -46,6 +46,7 @@ INSTALLED_APPS = [
'bar',
'backoffice',
'events',
+ 'rideshare',
'allauth',
'allauth.account',
diff --git a/src/bornhack/urls.py b/src/bornhack/urls.py
index cda0e36c..fb665d83 100644
--- a/src/bornhack/urls.py
+++ b/src/bornhack/urls.py
@@ -182,6 +182,11 @@ urlpatterns = [
include('teams.urls', namespace='teams')
),
+ path(
+ 'rideshare/',
+ include('rideshare.urls', namespace='rideshare')
+ ),
+
path(
'backoffice/',
include('backoffice.urls', namespace='backoffice')
diff --git a/src/rideshare/__init__.py b/src/rideshare/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/rideshare/admin.py b/src/rideshare/admin.py
new file mode 100644
index 00000000..6a674531
--- /dev/null
+++ b/src/rideshare/admin.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+
+from .models import Ride
+
+
+@admin.register(Ride)
+class RideModelAdmin(admin.ModelAdmin):
+ list_display = ('location', 'when', 'seats', 'user')
+ list_filter = ('camp', 'user')
diff --git a/src/rideshare/apps.py b/src/rideshare/apps.py
new file mode 100644
index 00000000..9a8b366f
--- /dev/null
+++ b/src/rideshare/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class RideshareConfig(AppConfig):
+ name = 'rideshare'
diff --git a/src/rideshare/migrations/0001_initial.py b/src/rideshare/migrations/0001_initial.py
new file mode 100644
index 00000000..b1a843f3
--- /dev/null
+++ b/src/rideshare/migrations/0001_initial.py
@@ -0,0 +1,36 @@
+# Generated by Django 2.0.4 on 2018-08-08 20:18
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import uuid
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('camps', '0028_auto_20180525_1025'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Ride',
+ fields=[
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('updated', models.DateTimeField(auto_now=True)),
+ ('seats', models.PositiveIntegerField()),
+ ('location', models.CharField(max_length=100)),
+ ('when', models.DateTimeField()),
+ ('description', models.TextField()),
+ ('camp', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='camps.Camp')),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ ]
diff --git a/src/rideshare/migrations/__init__.py b/src/rideshare/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/rideshare/models.py b/src/rideshare/models.py
new file mode 100644
index 00000000..42e5a033
--- /dev/null
+++ b/src/rideshare/models.py
@@ -0,0 +1,30 @@
+from django.db import models
+from django.urls import reverse
+
+from utils.models import UUIDModel, CampRelatedModel
+
+
+class Ride(UUIDModel, CampRelatedModel):
+ camp = models.ForeignKey('camps.Camp', on_delete=models.PROTECT)
+ user = models.ForeignKey('auth.User', on_delete=models.PROTECT)
+ seats = models.PositiveIntegerField()
+ location = models.CharField(max_length=100)
+ when = models.DateTimeField()
+ description = models.TextField()
+
+ def get_absolute_url(self):
+ return reverse(
+ 'rideshare:detail',
+ kwargs={
+ 'pk': self.pk,
+ 'camp_slug': self.camp.slug
+ }
+ )
+
+ def __str__(self):
+ return "{} seats from {} at {} by {}".format(
+ self.seats,
+ self.location,
+ self.when,
+ self.user
+ )
diff --git a/src/rideshare/templates/rideshare/emails/contact_mail.html b/src/rideshare/templates/rideshare/emails/contact_mail.html
new file mode 100644
index 00000000..6855a686
--- /dev/null
+++ b/src/rideshare/templates/rideshare/emails/contact_mail.html
@@ -0,0 +1,13 @@
+Hello!
+
+The following message has been submitted to your rideshare on {{ rideshare_url }}.
+
+<message>
+
+ {{ message }}
+
+</message>
+
+Best regards,
+
+The BornHack Teamp
diff --git a/src/rideshare/templates/rideshare/emails/contact_mail.txt b/src/rideshare/templates/rideshare/emails/contact_mail.txt
new file mode 100644
index 00000000..8225c0d5
--- /dev/null
+++ b/src/rideshare/templates/rideshare/emails/contact_mail.txt
@@ -0,0 +1,13 @@
+Hello!
+
+The following message has been submitted to your rideshare on {{ rideshare_url }}.
+
+
+ {{ object.description|untrustedcommonmark }} +
++On this page participants of {{ camp.title }} can communicate about ridesharing to and from the festival. +
+ + + + Create ride + + + ++ When + | + Location + | + Seats + | + | + +{% for ride in ride_list %} +
---|---|---|---|
+ {{ ride.when|date:"c" }} + | + {{ ride.location }} + | + {{ ride.seats }} + | + + Details + + +{% empty %} + + |
+ No rideshares yet! + +{% endfor %} + |