Commit 69483e86 by Waheed Ahmed

Added workflow data models.

ECOM-7004
parent f6666e02
...@@ -8,3 +8,13 @@ class PublisherUserRole(DjangoChoices): ...@@ -8,3 +8,13 @@ class PublisherUserRole(DjangoChoices):
MarketingReviewer = ChoiceItem('marketing_reviewer', _('Marketing Reviewer')) MarketingReviewer = ChoiceItem('marketing_reviewer', _('Marketing Reviewer'))
Publisher = ChoiceItem('publisher', _('Publisher')) Publisher = ChoiceItem('publisher', _('Publisher'))
CourseTeam = ChoiceItem('course_team', _('Course Team')) CourseTeam = ChoiceItem('course_team', _('Course Team'))
class CourseStateChoices(DjangoChoices):
Draft = ChoiceItem('draft', _('Draft'))
Review = ChoiceItem('review', _('Review'))
Approved = ChoiceItem('approved', _('Approved'))
class CourseRunStateChoices(CourseStateChoices):
Published = ChoiceItem('published', _('Published'))
# -*- coding: utf-8 -*-
# Generated by Django 1.9.11 on 2017-02-01 07:32
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django_extensions.db.fields
import django_fsm
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('publisher', '0030_create_switch_add_instructor_feature'),
]
operations = [
migrations.CreateModel(
name='CourseRunState',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')),
('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')),
('name', django_fsm.FSMField(choices=[('draft', 'Draft'), ('review', 'Review'), ('approved', 'Approved'), ('published', 'Published')], default='draft', max_length=50)),
('approved_by_role', models.CharField(blank=True, choices=[('partner_manager', 'Partner Manager'), ('partner_coordinator', 'Partner Coordinator'), ('marketing_reviewer', 'Marketing Reviewer'), ('publisher', 'Publisher'), ('course_team', 'Course Team')], max_length=63, null=True)),
('owner_role', models.CharField(choices=[('partner_manager', 'Partner Manager'), ('partner_coordinator', 'Partner Coordinator'), ('marketing_reviewer', 'Marketing Reviewer'), ('publisher', 'Publisher'), ('course_team', 'Course Team')], max_length=63)),
('changed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('course_run', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='course_run_state', to='publisher.CourseRun')),
],
options={
'ordering': ('-modified', '-created'),
'abstract': False,
'get_latest_by': 'modified',
},
),
migrations.CreateModel(
name='CourseState',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')),
('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')),
('name', django_fsm.FSMField(choices=[('draft', 'Draft'), ('review', 'Review'), ('approved', 'Approved')], default='draft', max_length=50)),
('approved_by_role', models.CharField(blank=True, choices=[('partner_manager', 'Partner Manager'), ('partner_coordinator', 'Partner Coordinator'), ('marketing_reviewer', 'Marketing Reviewer'), ('publisher', 'Publisher'), ('course_team', 'Course Team')], max_length=63, null=True)),
('owner_role', models.CharField(choices=[('partner_manager', 'Partner Manager'), ('partner_coordinator', 'Partner Coordinator'), ('marketing_reviewer', 'Marketing Reviewer'), ('publisher', 'Publisher'), ('course_team', 'Course Team')], max_length=63)),
('changed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('course', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='course_state', to='publisher.Course')),
],
options={
'ordering': ('-modified', '-created'),
'abstract': False,
'get_latest_by': 'modified',
},
),
migrations.CreateModel(
name='HistoricalCourseRunState',
fields=[
('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')),
('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')),
('name', django_fsm.FSMField(choices=[('draft', 'Draft'), ('review', 'Review'), ('approved', 'Approved'), ('published', 'Published')], default='draft', max_length=50)),
('approved_by_role', models.CharField(blank=True, choices=[('partner_manager', 'Partner Manager'), ('partner_coordinator', 'Partner Coordinator'), ('marketing_reviewer', 'Marketing Reviewer'), ('publisher', 'Publisher'), ('course_team', 'Course Team')], max_length=63, null=True)),
('owner_role', models.CharField(choices=[('partner_manager', 'Partner Manager'), ('partner_coordinator', 'Partner Coordinator'), ('marketing_reviewer', 'Marketing Reviewer'), ('publisher', 'Publisher'), ('course_team', 'Course Team')], max_length=63)),
('history_id', models.AutoField(primary_key=True, serialize=False)),
('history_date', models.DateTimeField()),
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
('changed_by', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)),
('course_run', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='publisher.CourseRun')),
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
],
options={
'ordering': ('-history_date', '-history_id'),
'get_latest_by': 'history_date',
'verbose_name': 'historical course run state',
},
),
migrations.CreateModel(
name='HistoricalCourseState',
fields=[
('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')),
('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')),
('name', django_fsm.FSMField(choices=[('draft', 'Draft'), ('review', 'Review'), ('approved', 'Approved')], default='draft', max_length=50)),
('approved_by_role', models.CharField(blank=True, choices=[('partner_manager', 'Partner Manager'), ('partner_coordinator', 'Partner Coordinator'), ('marketing_reviewer', 'Marketing Reviewer'), ('publisher', 'Publisher'), ('course_team', 'Course Team')], max_length=63, null=True)),
('owner_role', models.CharField(choices=[('partner_manager', 'Partner Manager'), ('partner_coordinator', 'Partner Coordinator'), ('marketing_reviewer', 'Marketing Reviewer'), ('publisher', 'Publisher'), ('course_team', 'Course Team')], max_length=63)),
('history_id', models.AutoField(primary_key=True, serialize=False)),
('history_date', models.DateTimeField()),
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
('changed_by', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)),
('course', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='publisher.Course')),
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
],
options={
'ordering': ('-history_date', '-history_id'),
'get_latest_by': 'history_date',
'verbose_name': 'historical course state',
},
),
]
...@@ -21,7 +21,7 @@ from course_discovery.apps.course_metadata.choices import CourseRunPacing ...@@ -21,7 +21,7 @@ from course_discovery.apps.course_metadata.choices import CourseRunPacing
from course_discovery.apps.course_metadata.models import LevelType, Subject, Person, Organization from course_discovery.apps.course_metadata.models import LevelType, Subject, Person, Organization
from course_discovery.apps.course_metadata.utils import UploadToFieldNamePath from course_discovery.apps.course_metadata.utils import UploadToFieldNamePath
from course_discovery.apps.ietf_language_tags.models import LanguageTag from course_discovery.apps.ietf_language_tags.models import LanguageTag
from course_discovery.apps.publisher.choices import PublisherUserRole from course_discovery.apps.publisher.choices import PublisherUserRole, CourseStateChoices, CourseRunStateChoices
from course_discovery.apps.publisher.emails import send_email_for_change_state from course_discovery.apps.publisher.emails import send_email_for_change_state
from course_discovery.apps.publisher.utils import is_email_notification_enabled from course_discovery.apps.publisher.utils import is_email_notification_enabled
...@@ -479,3 +479,66 @@ class OrganizationExtension(TimeStampedModel): ...@@ -479,3 +479,66 @@ class OrganizationExtension(TimeStampedModel):
return '{organization}: {group}'.format( return '{organization}: {group}'.format(
organization=self.organization, group=self.group organization=self.organization, group=self.group
) )
class CourseState(TimeStampedModel, ChangedByMixin):
""" Publisher Workflow Course State Model. """
name = FSMField(default=CourseStateChoices.Draft, choices=CourseStateChoices.choices)
approved_by_role = models.CharField(blank=True, null=True, max_length=63, choices=PublisherUserRole.choices)
owner_role = models.CharField(max_length=63, choices=PublisherUserRole.choices)
course = models.OneToOneField(Course, related_name='course_state')
history = HistoricalRecords()
def __str__(self):
return self.get_name_display()
@transition(field=name, source='*', target=CourseStateChoices.Draft)
def draft(self):
# TODO: send email etc.
pass
@transition(field=name, source=CourseStateChoices.Draft, target=CourseStateChoices.Review)
def review(self):
# TODO: send email etc.
pass
@transition(field=name, source=CourseStateChoices.Review, target=CourseStateChoices.Approved)
def approved(self):
# TODO: send email etc.
pass
class CourseRunState(TimeStampedModel, ChangedByMixin):
""" Publisher Workflow Course Run State Model. """
name = FSMField(default=CourseRunStateChoices.Draft, choices=CourseRunStateChoices.choices)
approved_by_role = models.CharField(blank=True, null=True, max_length=63, choices=PublisherUserRole.choices)
owner_role = models.CharField(max_length=63, choices=PublisherUserRole.choices)
course_run = models.OneToOneField(CourseRun, related_name='course_run_state')
history = HistoricalRecords()
def __str__(self):
return self.get_name_display()
@transition(field=name, source='*', target=CourseRunStateChoices.Draft)
def draft(self):
# TODO: send email etc.
pass
@transition(field=name, source=CourseRunStateChoices.Draft, target=CourseRunStateChoices.Review)
def review(self):
# TODO: send email etc.
pass
@transition(field=name, source=CourseRunStateChoices.Review, target=CourseRunStateChoices.Approved)
def approved(self):
# TODO: send email etc.
pass
@transition(field=name, source=CourseRunStateChoices.Approved, target=CourseRunStateChoices.Published)
def published(self):
# TODO: send email etc.
pass
...@@ -13,7 +13,8 @@ from course_discovery.apps.course_metadata.tests import factories ...@@ -13,7 +13,8 @@ from course_discovery.apps.course_metadata.tests import factories
from course_discovery.apps.ietf_language_tags.models import LanguageTag from course_discovery.apps.ietf_language_tags.models import LanguageTag
from course_discovery.apps.publisher.choices import PublisherUserRole from course_discovery.apps.publisher.choices import PublisherUserRole
from course_discovery.apps.publisher.models import ( from course_discovery.apps.publisher.models import (
Course, CourseRun, CourseUserRole, OrganizationExtension, OrganizationUserRole, Seat, State, UserAttributes Course, CourseRun, CourseUserRole, OrganizationExtension, OrganizationUserRole, Seat, State,
UserAttributes, CourseState, CourseRunState
) )
...@@ -112,3 +113,19 @@ class OrganizationExtensionFactory(factory.DjangoModelFactory): ...@@ -112,3 +113,19 @@ class OrganizationExtensionFactory(factory.DjangoModelFactory):
class Meta: class Meta:
model = OrganizationExtension model = OrganizationExtension
class CourseStateFactory(factory.DjangoModelFactory):
course = factory.SubFactory(CourseFactory)
owner_role = FuzzyChoice(PublisherUserRole.values.keys())
class Meta:
model = CourseState
class CourseRunStateFactory(factory.DjangoModelFactory):
course_run = factory.SubFactory(CourseRunFactory)
owner_role = FuzzyChoice(PublisherUserRole.values.keys())
class Meta:
model = CourseRunState
...@@ -8,7 +8,7 @@ from guardian.shortcuts import assign_perm ...@@ -8,7 +8,7 @@ from guardian.shortcuts import assign_perm
from course_discovery.apps.core.tests.factories import UserFactory from course_discovery.apps.core.tests.factories import UserFactory
from course_discovery.apps.course_metadata.tests.factories import OrganizationFactory from course_discovery.apps.course_metadata.tests.factories import OrganizationFactory
from course_discovery.apps.publisher.choices import PublisherUserRole from course_discovery.apps.publisher.choices import PublisherUserRole, CourseStateChoices, CourseRunStateChoices
from course_discovery.apps.publisher.mixins import check_course_organization_permission from course_discovery.apps.publisher.mixins import check_course_organization_permission
from course_discovery.apps.publisher.models import ( from course_discovery.apps.publisher.models import (
State, CourseUserRole, OrganizationExtension, OrganizationUserRole State, CourseUserRole, OrganizationExtension, OrganizationUserRole
...@@ -406,3 +406,91 @@ class GroupOrganizationTests(TestCase): ...@@ -406,3 +406,91 @@ class GroupOrganizationTests(TestCase):
group=self.group_2, group=self.group_2,
organization=self.organization_extension.organization organization=self.organization_extension.organization
) )
class CourseStateTests(TestCase):
""" Tests for the publisher `CourseState` model. """
def setUp(self):
super(CourseStateTests, self).setUp()
self.course_state = factories.CourseStateFactory(name=CourseStateChoices.Draft)
def test_str(self):
"""
Verify casting an instance to a string returns a string containing the current state display name.
"""
self.assertEqual(str(self.course_state), self.course_state.get_name_display())
def test_draft(self):
self.course_state.review()
self.assertNotEqual(self.course_state.name, CourseStateChoices.Draft)
self.course_state.draft()
self.assertEqual(self.course_state.name, CourseStateChoices.Draft)
def test_review(self):
self.assertNotEqual(self.course_state.name, CourseStateChoices.Review)
self.course_state.review()
self.assertEqual(self.course_state.name, CourseStateChoices.Review)
def test_approved(self):
self.course_state.review()
self.assertNotEqual(self.course_state.name, CourseStateChoices.Approved)
self.course_state.approved()
self.assertEqual(self.course_state.name, CourseStateChoices.Approved)
class CourseRunStateTests(TestCase):
""" Tests for the publisher `CourseRunState` model. """
def setUp(self):
super(CourseRunStateTests, self).setUp()
self.run_state = factories.CourseRunStateFactory(name=CourseRunStateChoices.Draft)
def test_str(self):
"""
Verify casting an instance to a string returns a string containing the current state display name.
"""
self.assertEqual(str(self.run_state), self.run_state.get_name_display())
def test_draft(self):
self.run_state.review()
self.assertNotEqual(self.run_state.name, CourseRunStateChoices.Draft)
self.run_state.draft()
self.assertEqual(self.run_state.name, CourseRunStateChoices.Draft)
def test_review(self):
self.assertNotEqual(self.run_state.name, CourseRunStateChoices.Review)
self.run_state.review()
self.assertEqual(self.run_state.name, CourseRunStateChoices.Review)
def test_approved(self):
self.run_state.review()
self.assertNotEqual(self.run_state.name, CourseRunStateChoices.Approved)
self.run_state.approved()
self.assertEqual(self.run_state.name, CourseRunStateChoices.Approved)
def test_published(self):
self.run_state.name = CourseRunStateChoices.Approved
self.run_state.save()
self.assertNotEqual(self.run_state.name, CourseRunStateChoices.Published)
self.run_state.published()
self.assertEqual(self.run_state.name, CourseRunStateChoices.Published)
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-02 23:31+0500\n" "POT-Creation-Date: 2017-02-03 12:49+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: apps/api/filters.py #: apps/api/filters.py
#, python-brace-format #, python-brace-format
...@@ -210,7 +210,8 @@ msgid "" ...@@ -210,7 +210,8 @@ msgid ""
" try again. If the error persists, please contact the Engineering Team." " try again. If the error persists, please contact the Engineering Team."
msgstr "" msgstr ""
#: apps/course_metadata/choices.py apps/publisher/models.py #: apps/course_metadata/choices.py apps/publisher/choices.py
#: apps/publisher/models.py
msgid "Published" msgid "Published"
msgstr "" msgstr ""
...@@ -456,6 +457,18 @@ msgstr "" ...@@ -456,6 +457,18 @@ msgstr ""
msgid "Course Team" msgid "Course Team"
msgstr "" msgstr ""
#: apps/publisher/choices.py apps/publisher/models.py
msgid "Draft"
msgstr ""
#: apps/publisher/choices.py
msgid "Review"
msgstr ""
#: apps/publisher/choices.py templates/publisher/dashboard/_preview_ready.html
msgid "Approved"
msgstr ""
#: apps/publisher/emails.py #: apps/publisher/emails.py
#, python-brace-format #, python-brace-format
msgid "Course Run {title}-{pacing_type}-{start} state has been changed." msgid "Course Run {title}-{pacing_type}-{start} state has been changed."
...@@ -602,10 +615,6 @@ msgid "Seat Type" ...@@ -602,10 +615,6 @@ msgid "Seat Type"
msgstr "" msgstr ""
#: apps/publisher/models.py #: apps/publisher/models.py
msgid "Draft"
msgstr ""
#: apps/publisher/models.py
msgid "Needs Review" msgid "Needs Review"
msgstr "" msgstr ""
...@@ -2164,10 +2173,6 @@ msgid "" ...@@ -2164,10 +2173,6 @@ msgid ""
msgstr "" msgstr ""
#: templates/publisher/dashboard/_preview_ready.html #: templates/publisher/dashboard/_preview_ready.html
msgid "Approved"
msgstr ""
#: templates/publisher/dashboard/_preview_ready.html
msgid "Preview URL" msgid "Preview URL"
msgstr "" msgstr ""
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-02 23:31+0500\n" "POT-Creation-Date: 2017-02-03 12:49+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: static/js/catalogs-change-form.js #: static/js/catalogs-change-form.js
msgid "Preview" msgid "Preview"
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-02 23:31+0500\n" "POT-Creation-Date: 2017-02-03 12:49+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps/api/filters.py #: apps/api/filters.py
...@@ -259,7 +259,8 @@ msgstr "" ...@@ -259,7 +259,8 @@ msgstr ""
"¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт " "¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт "
"ηση ρяσι∂єηт, ѕυηт ιη ¢υłρα qυι σƒƒι¢ια ∂єѕєяυηт мσłłιт αηιм #" "ηση ρяσι∂єηт, ѕυηт ιη ¢υłρα qυι σƒƒι¢ια ∂єѕєяυηт мσłłιт αηιм #"
#: apps/course_metadata/choices.py apps/publisher/models.py #: apps/course_metadata/choices.py apps/publisher/choices.py
#: apps/publisher/models.py
msgid "Published" msgid "Published"
msgstr "Püßlïshéd Ⱡ'σяєм ιρѕυм ∂σł#" msgstr "Püßlïshéd Ⱡ'σяєм ιρѕυм ∂σł#"
...@@ -568,6 +569,18 @@ msgstr "Püßlïshér Ⱡ'σяєм ιρѕυм ∂σł#" ...@@ -568,6 +569,18 @@ msgstr "Püßlïshér Ⱡ'σяєм ιρѕυм ∂σł#"
msgid "Course Team" msgid "Course Team"
msgstr "Çöürsé Téäm Ⱡ'σяєм ιρѕυм ∂σłσя #" msgstr "Çöürsé Téäm Ⱡ'σяєм ιρѕυм ∂σłσя #"
#: apps/publisher/choices.py apps/publisher/models.py
msgid "Draft"
msgstr "Dräft Ⱡ'σяєм ιρѕ#"
#: apps/publisher/choices.py
msgid "Review"
msgstr "Révïéw Ⱡ'σяєм ιρѕυ#"
#: apps/publisher/choices.py templates/publisher/dashboard/_preview_ready.html
msgid "Approved"
msgstr "Àpprövéd Ⱡ'σяєм ιρѕυм ∂#"
#: apps/publisher/emails.py #: apps/publisher/emails.py
#, python-brace-format #, python-brace-format
msgid "Course Run {title}-{pacing_type}-{start} state has been changed." msgid "Course Run {title}-{pacing_type}-{start} state has been changed."
...@@ -720,10 +733,6 @@ msgid "Seat Type" ...@@ -720,10 +733,6 @@ msgid "Seat Type"
msgstr "Séät Týpé Ⱡ'σяєм ιρѕυм ∂σł#" msgstr "Séät Týpé Ⱡ'σяєм ιρѕυм ∂σł#"
#: apps/publisher/models.py #: apps/publisher/models.py
msgid "Draft"
msgstr "Dräft Ⱡ'σяєм ιρѕ#"
#: apps/publisher/models.py
msgid "Needs Review" msgid "Needs Review"
msgstr "Nééds Révïéw Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#" msgstr "Nééds Révïéw Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
...@@ -2525,10 +2534,6 @@ msgstr "" ...@@ -2525,10 +2534,6 @@ msgstr ""
"υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє#" "υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє#"
#: templates/publisher/dashboard/_preview_ready.html #: templates/publisher/dashboard/_preview_ready.html
msgid "Approved"
msgstr "Àpprövéd Ⱡ'σяєм ιρѕυм ∂#"
#: templates/publisher/dashboard/_preview_ready.html
msgid "Preview URL" msgid "Preview URL"
msgstr "Prévïéw ÛRL Ⱡ'σяєм ιρѕυм ∂σłσя #" msgstr "Prévïéw ÛRL Ⱡ'σяєм ιρѕυм ∂σłσя #"
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-02 23:31+0500\n" "POT-Creation-Date: 2017-02-03 12:49+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/js/catalogs-change-form.js #: static/js/catalogs-change-form.js
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment