Commit c29d4f3ae571759f2fa21091b97432942c281a58
Exists in
master
and in
5 other branches
Merge branch 'dev' of https://github.com/amadeusproject/amadeuslms into dev
Showing
12 changed files
with
119 additions
and
73 deletions
Show diff stats
amadeus/urls.py
@@ -23,7 +23,6 @@ urlpatterns = [ | @@ -23,7 +23,6 @@ urlpatterns = [ | ||
23 | url(r'^home/', include('app.urls', namespace = 'app')), | 23 | url(r'^home/', include('app.urls', namespace = 'app')), |
24 | url(r'^course/', include('courses.urls', namespace = 'course')), | 24 | url(r'^course/', include('courses.urls', namespace = 'course')), |
25 | url(r'^users/', include('users.urls', namespace = 'users')), | 25 | url(r'^users/', include('users.urls', namespace = 'users')), |
26 | - url(r'^forum/', include('forum.urls', namespace = 'forum')), | ||
27 | url(r'^admin/', admin.site.urls), | 26 | url(r'^admin/', admin.site.urls), |
28 | url(r'^', include('core.urls', namespace = 'core')), | 27 | url(r'^', include('core.urls', namespace = 'core')), |
29 | 28 |
core/templates/base.html
@@ -45,6 +45,8 @@ | @@ -45,6 +45,8 @@ | ||
45 | <script src="{% static 'js/base/amadeus.js' %}"></script> | 45 | <script src="{% static 'js/base/amadeus.js' %}"></script> |
46 | {% block style %} | 46 | {% block style %} |
47 | {% endblock %} | 47 | {% endblock %} |
48 | + {% block javascript %} | ||
49 | + {% endblock %} | ||
48 | </head> | 50 | </head> |
49 | <body> | 51 | <body> |
50 | <div class="container-fluid"> | 52 | <div class="container-fluid"> |
courses/templates/subject/form_view_teacher.html
@@ -19,7 +19,7 @@ | @@ -19,7 +19,7 @@ | ||
19 | </a> | 19 | </a> |
20 | <div class="panel-body"> | 20 | <div class="panel-body"> |
21 | <p>{{ topic.description|linebreaks }}</p> | 21 | <p>{{ topic.description|linebreaks }}</p> |
22 | - <button class="btn btn-primary btn-raised" onclick="createForum('{% url 'forum:create' %}', '{{ topic.id }}')">{% trans '+ Create Forum' %}</button> | 22 | + <button class="btn btn-primary btn-raised" onclick="createForum('{% url 'course:forum:create' %}', '{{ topic.id }}')">{% trans '+ Create Forum' %}</button> |
23 | <div class="foruns_list"> | 23 | <div class="foruns_list"> |
24 | {% list_topic_foruns request topic %} | 24 | {% list_topic_foruns request topic %} |
25 | </div> | 25 | </div> |
courses/templates/topic/list_topic_foruns.html
1 | {% for forum in foruns %} | 1 | {% for forum in foruns %} |
2 | - <a id="forum_{{ forum.id }}" href="javascript:showForum('{% url 'forum:index' %}', '{{forum.id}}')">{{ forum }}<br /></a> | 2 | + <a id="forum_{{ forum.id }}" href="{% url 'course:forum:view' forum.slug %}">{{ forum }}<br /></a> |
3 | {% endfor %} | 3 | {% endfor %} |
4 | \ No newline at end of file | 4 | \ No newline at end of file |
courses/urls.py
@@ -24,6 +24,7 @@ urlpatterns = [ | @@ -24,6 +24,7 @@ urlpatterns = [ | ||
24 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), | 24 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), |
25 | 25 | ||
26 | 26 | ||
27 | + url(r'^forum/', include('forum.urls', namespace = 'forum')), | ||
27 | url(r'^poll/', include('poll.urls', namespace = 'poll')) | 28 | url(r'^poll/', include('poll.urls', namespace = 'poll')) |
28 | 29 | ||
29 | ] | 30 | ] |
forum/templates/forum/forum_list.html
@@ -29,7 +29,7 @@ | @@ -29,7 +29,7 @@ | ||
29 | {% list_posts request forum %} | 29 | {% list_posts request forum %} |
30 | </div> | 30 | </div> |
31 | 31 | ||
32 | -<form id="form_post" method="post" action="{% url 'forum:create_post' %}" enctype="multipart/form-data"> | 32 | +<form id="form_post" method="post" action="{% url 'course:forum:create_post' %}" enctype="multipart/form-data"> |
33 | {% csrf_token %} | 33 | {% csrf_token %} |
34 | {% for field in form %} | 34 | {% for field in form %} |
35 | {% if field.field.widget.input_type == 'hidden' %} | 35 | {% if field.field.widget.input_type == 'hidden' %} |
@@ -63,26 +63,4 @@ | @@ -63,26 +63,4 @@ | ||
63 | </div> | 63 | </div> |
64 | {% endif %} | 64 | {% endif %} |
65 | {% endfor %} | 65 | {% endfor %} |
66 | -</form> | ||
67 | - | ||
68 | -<!--{% if foruns|length > 0 %} | ||
69 | - {% for forum in foruns %} | ||
70 | - <a class="forum_collapse" role="button" href="javascript: showPosts('{% url 'forum:posts' %}', '{{ forum.slug }}')" aria-expanded="true"> | ||
71 | - <div class="page-header"> | ||
72 | - <h1 id="timeline"> | ||
73 | - {{ forum }} | ||
74 | - </h1> | ||
75 | - <b>{% trans 'Description' %}: </b>{{ forum.description }}<p> | ||
76 | - <b>{% trans 'Created in' %}: </b>{{ forum.create_date }} | ||
77 | - </div> | ||
78 | - </a> | ||
79 | - <div class="collapse" id="collapse{{ forum.slug }}"> | ||
80 | - <div class="well"> | ||
81 | - </div> | ||
82 | - </div> | ||
83 | - {% endfor %} | ||
84 | -{% else %} | ||
85 | - <div class="page-header"> | ||
86 | - <p>{% trans 'No forum created yet.' %}</p> | ||
87 | - </div> | ||
88 | -{% endif %}--> | 66 | +</form> |
89 | \ No newline at end of file | 67 | \ No newline at end of file |
@@ -0,0 +1,79 @@ | @@ -0,0 +1,79 @@ | ||
1 | +{% extends 'base.html' %} | ||
2 | + | ||
3 | +{% load static i18n permission_tags list_post %} | ||
4 | +{% load widget_tweaks %} | ||
5 | + | ||
6 | +{% block javascript %} | ||
7 | + <script type="text/javascript" src="{% static 'js/forum.js' %}"></script> | ||
8 | +{% endblock %} | ||
9 | + | ||
10 | +{% block breadcrumbs %} | ||
11 | + | ||
12 | + <ol class="breadcrumb"> | ||
13 | + <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | ||
14 | + <li><a href="{% url 'course:view' forum.topic.subject.course.slug %}">{{ forum.topic.subject.course }}</a></li> | ||
15 | + {% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
16 | + <li class="active">{% trans 'Forum' %}</li> | ||
17 | + {% else %} | ||
18 | + <li class="active">{{ forum.name }}</li> | ||
19 | + {% endif %} | ||
20 | + | ||
21 | + </ol> | ||
22 | +{% endblock %} | ||
23 | + | ||
24 | +{% block sidebar %} | ||
25 | + <div class="panel panel-primary navigation"> | ||
26 | + <div class="panel-heading"> | ||
27 | + <h5>{% trans 'Menu' %}</h5> | ||
28 | + </div> | ||
29 | + <div class="panel-body"> | ||
30 | + <ul class="nav nav-pills nav-stacked"> | ||
31 | + <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> | ||
32 | + <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li> | ||
33 | + </ul> | ||
34 | + </div> | ||
35 | + </div> | ||
36 | + | ||
37 | + {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == post.user %} | ||
38 | + <div class="panel panel-primary navigation"> | ||
39 | + <div class="panel-heading"> | ||
40 | + <h3 class="panel-title">{% trans 'Actions' %}</h3> | ||
41 | + </div> | ||
42 | + <div class="panel-body"> | ||
43 | + <ul class="nav nav-pills nav-stacked"> | ||
44 | + <li><a href="javascript:edit_forum('{% url 'course:forum:index' %}', '{{ forum.id }}')">{% trans 'Edit' %}</a></li> | ||
45 | + <li><a href="javascript:delete_forum('{% url 'course:forum:delete' forum.id %}', '{{ forum.id }}', '{% trans "Are you sure you want to delete this forum?" %}')">{% trans 'Delete' %}</a></li> | ||
46 | + </ul> | ||
47 | + </div> | ||
48 | + </div> | ||
49 | + {% endif %} | ||
50 | +{% endblock %} | ||
51 | + | ||
52 | +{% block content %} | ||
53 | + <div class="row panel panel-default"> | ||
54 | + <div class="panel-body"> | ||
55 | + <div class="comments-list"> | ||
56 | + <div class="section-heading"> | ||
57 | + <h1>{{ forum }}</h1> | ||
58 | + <h4><b>{% trans 'Description' %}:</b> {{ forum.description }}</h4> | ||
59 | + <h4><b>{% trans 'Opened in' %}:</b> {{ forum.create_date }}</h4> | ||
60 | + </div> | ||
61 | + </div> | ||
62 | + | ||
63 | + <div id="posts_list"> | ||
64 | + {% list_posts request forum %} | ||
65 | + </div> | ||
66 | + </div> | ||
67 | + </div> | ||
68 | +{% endblock %} | ||
69 | + | ||
70 | +{% block rightbar %} | ||
71 | + <div class="panel panel-warning"> | ||
72 | + <div class="panel-heading"> | ||
73 | + <h3 class="panel-title">{% trans "Pending Stuffs" %}</h3> | ||
74 | + </div> | ||
75 | + <div class="panel-body"> | ||
76 | + | ||
77 | + </div> | ||
78 | + </div> | ||
79 | +{% endblock rightbar %} | ||
0 | \ No newline at end of file | 80 | \ No newline at end of file |
forum/templates/post/post_list.html
@@ -7,7 +7,7 @@ | @@ -7,7 +7,7 @@ | ||
7 | <h3 class="user-name"> | 7 | <h3 class="user-name"> |
8 | {{ post.user }} | 8 | {{ post.user }} |
9 | <div class="pull-right"> | 9 | <div class="pull-right"> |
10 | - <a href="javascript:answer('{{ post.id }}', '{% url 'forum:reply_post' %}');"> | 10 | + <a href="javascript:answer('{{ post.id }}', '{% url 'course:forum:reply_post' %}');"> |
11 | <i class="material-icons">reply</i> | 11 | <i class="material-icons">reply</i> |
12 | </a> | 12 | </a> |
13 | {% if request.user|has_role:'system_admin' or request.user == post.user %} | 13 | {% if request.user|has_role:'system_admin' or request.user == post.user %} |
@@ -17,8 +17,8 @@ | @@ -17,8 +17,8 @@ | ||
17 | <i class="material-icons">more_horiz</i> | 17 | <i class="material-icons">more_horiz</i> |
18 | </a> | 18 | </a> |
19 | <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> | 19 | <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> |
20 | - <li><a href="javascript:edit_post('{% url 'forum:update_post' post.id %}', '{{ post.id }}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> | ||
21 | - <li><a href="javascript:javascript:delete_post('{% url 'forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 20 | + <li><a href="javascript:edit_post('{% url 'course:forum:update_post' post.id %}', '{{ post.id }}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> |
21 | + <li><a href="javascript:javascript:delete_post('{% url 'course:forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | ||
22 | </ul> | 22 | </ul> |
23 | </div> | 23 | </div> |
24 | {% endif %} | 24 | {% endif %} |
@@ -40,34 +40,4 @@ | @@ -40,34 +40,4 @@ | ||
40 | </div> | 40 | </div> |
41 | {% list_post_answer request post %} | 41 | {% list_post_answer request post %} |
42 | {% endfor %} | 42 | {% endfor %} |
43 | -{% endif %} | ||
44 | - <!--<li> | ||
45 | - <a class="post_collapse" role="button" href="javascript: showPostsAnswers('{% url 'forum:post_answers' %}', '{{ post.id }}')" aria-expanded="false"> | ||
46 | - <div class="timeline-panel"> | ||
47 | - <div class="row"> | ||
48 | - <div class="col-xs-2 col-sm-2 col-md-2"> | ||
49 | - <img class="img-responsive img-rounded" src="{{ post.user.image_url }}" /> | ||
50 | - </div> | ||
51 | - <div class="col-xs-10 col-sm-10 col-md-10"> | ||
52 | - <div class="timeline-heading"> | ||
53 | - <h3> {{ post.user }}</h3> | ||
54 | - </div> | ||
55 | - <div class="timeline-body"> | ||
56 | - <p><em>{{ post.message|linebreaks }}</em></p> | ||
57 | - </div> | ||
58 | - <hr> | ||
59 | - <small class="text-muted"> | ||
60 | - <span class="pull-right"> | ||
61 | - <i class="glyphicon glyphicon-time"></i> {{ post.post_date|timesince }} | ||
62 | - {% trans ' ago' %} | ||
63 | - </span> | ||
64 | - </small> | ||
65 | - </div> | ||
66 | - </div> | ||
67 | - </div> | ||
68 | - </a> | ||
69 | - <div class="collapse" id="collapse{{ post.id }}" style="margin-top:10px;"> | ||
70 | - <div class="well"> | ||
71 | - </div> | ||
72 | - </div> | ||
73 | - </li>--> | ||
74 | \ No newline at end of file | 43 | \ No newline at end of file |
44 | +{% endif %} | ||
75 | \ No newline at end of file | 45 | \ No newline at end of file |
forum/templates/post/post_render.html
@@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
5 | <h3 class="user-name"> | 5 | <h3 class="user-name"> |
6 | {{ post.user }} | 6 | {{ post.user }} |
7 | <div class="pull-right"> | 7 | <div class="pull-right"> |
8 | - <a href="javascript:answer('{{ post.id }}', '{% url 'forum:reply_post' %}');"> | 8 | + <a href="javascript:answer('{{ post.id }}', '{% url 'course:forum:reply_post' %}');"> |
9 | <i class="material-icons">reply</i> | 9 | <i class="material-icons">reply</i> |
10 | </a> | 10 | </a> |
11 | {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == post.user %} | 11 | {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == post.user %} |
@@ -15,8 +15,8 @@ | @@ -15,8 +15,8 @@ | ||
15 | <i class="material-icons">more_horiz</i> | 15 | <i class="material-icons">more_horiz</i> |
16 | </a> | 16 | </a> |
17 | <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> | 17 | <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> |
18 | - <li><a href="javascript:edit_post('{% url 'forum:update_post' post.id %}', '{{ post.id }}')"></li> | ||
19 | - <li><a href="javascript:delete_post('{% url 'forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 18 | + <li><a href="javascript:edit_post('{% url 'course:forum:update_post' post.id %}', '{{ post.id }}')"></li> |
19 | + <li><a href="javascript:delete_post('{% url 'course:forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | ||
20 | </ul> | 20 | </ul> |
21 | </div> | 21 | </div> |
22 | {% endif %} | 22 | {% endif %} |
forum/urls.py
1 | -from django.conf.urls import url, include | 1 | +from django.conf.urls import url |
2 | 2 | ||
3 | from . import views | 3 | from . import views |
4 | 4 | ||
5 | 5 | ||
6 | urlpatterns = [ | 6 | urlpatterns = [ |
7 | url(r'^$', views.ForumIndex.as_view(), name='index'), | 7 | url(r'^$', views.ForumIndex.as_view(), name='index'), |
8 | + url(r'^(?P<slug>[\w_-]+)/$', views.ForumDetailView.as_view(), name='view'), | ||
8 | url(r'^create/$', views.CreateForumView.as_view(), name='create'), | 9 | url(r'^create/$', views.CreateForumView.as_view(), name='create'), |
9 | url(r'^delete/(?P<pk>[\w_-]+)/$', views.ForumDeleteView.as_view(), name='delete'), | 10 | url(r'^delete/(?P<pk>[\w_-]+)/$', views.ForumDeleteView.as_view(), name='delete'), |
10 | url(r'^render_forum/([\w_-]+)/$', views.render_forum, name='render_forum'), | 11 | url(r'^render_forum/([\w_-]+)/$', views.render_forum, name='render_forum'), |
forum/views.py
@@ -42,14 +42,14 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): | @@ -42,14 +42,14 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): | ||
42 | 42 | ||
43 | def get_success_url(self): | 43 | def get_success_url(self): |
44 | print("Pass") | 44 | print("Pass") |
45 | - self.success_url = reverse('forum:render_forum', args = (self.object.id, )) | 45 | + self.success_url = reverse('course:forum:render_forum', args = (self.object.id, )) |
46 | 46 | ||
47 | return self.success_url | 47 | return self.success_url |
48 | 48 | ||
49 | def render_forum(request, forum): | 49 | def render_forum(request, forum): |
50 | last_forum = get_object_or_404(Forum, id = forum) | 50 | last_forum = get_object_or_404(Forum, id = forum) |
51 | 51 | ||
52 | - return HttpResponse(str(reverse_lazy('forum:index')) + '-' + str(forum) + '-' + str(last_forum.name)) | 52 | + return HttpResponse(str(reverse_lazy('course:forum:index')) + '-' + str(forum) + '-' + str(last_forum.name)) |
53 | 53 | ||
54 | class ForumDeleteView(LoginRequiredMixin, generic.DeleteView): | 54 | class ForumDeleteView(LoginRequiredMixin, generic.DeleteView): |
55 | login_url = reverse_lazy("core:home") | 55 | login_url = reverse_lazy("core:home") |
@@ -57,11 +57,28 @@ class ForumDeleteView(LoginRequiredMixin, generic.DeleteView): | @@ -57,11 +57,28 @@ class ForumDeleteView(LoginRequiredMixin, generic.DeleteView): | ||
57 | 57 | ||
58 | model = Forum | 58 | model = Forum |
59 | pk_url_kwarg = 'pk' | 59 | pk_url_kwarg = 'pk' |
60 | - success_url = reverse_lazy('forum:deleted_forum') | 60 | + success_url = reverse_lazy('course:forum:deleted_forum') |
61 | 61 | ||
62 | def forum_deleted(request): | 62 | def forum_deleted(request): |
63 | return HttpResponse(_("Forum deleted successfully.")) | 63 | return HttpResponse(_("Forum deleted successfully.")) |
64 | 64 | ||
65 | +class ForumDetailView(LoginRequiredMixin, generic.DetailView): | ||
66 | + login_url = reverse_lazy("core:home") | ||
67 | + redirect_field_name = 'next' | ||
68 | + | ||
69 | + model = Forum | ||
70 | + template_name = 'forum/forum_view.html' | ||
71 | + context_object_name = 'forum' | ||
72 | + | ||
73 | + def get_context_data(self, **kwargs): | ||
74 | + context = super(ForumDetailView, self).get_context_data(**kwargs) | ||
75 | + forum = get_object_or_404(Forum, slug = self.kwargs.get('slug')) | ||
76 | + | ||
77 | + context['forum'] = forum | ||
78 | + context['title'] = forum.name | ||
79 | + | ||
80 | + return context | ||
81 | + | ||
65 | class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): | 82 | class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): |
66 | login_url = reverse_lazy("core:home") | 83 | login_url = reverse_lazy("core:home") |
67 | redirect_field_name = 'next' | 84 | redirect_field_name = 'next' |
@@ -77,7 +94,7 @@ class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): | @@ -77,7 +94,7 @@ class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): | ||
77 | return super(CreatePostView, self).form_valid(form) | 94 | return super(CreatePostView, self).form_valid(form) |
78 | 95 | ||
79 | def get_success_url(self): | 96 | def get_success_url(self): |
80 | - self.success_url = reverse('forum:render_post', args = (self.object.id, )) | 97 | + self.success_url = reverse('course:forum:render_post', args = (self.object.id, )) |
81 | 98 | ||
82 | return self.success_url | 99 | return self.success_url |
83 | 100 | ||
@@ -98,7 +115,7 @@ class PostUpdateView(LoginRequiredMixin, generic.UpdateView): | @@ -98,7 +115,7 @@ class PostUpdateView(LoginRequiredMixin, generic.UpdateView): | ||
98 | template_name = "post/post_update_form.html" | 115 | template_name = "post/post_update_form.html" |
99 | 116 | ||
100 | def get_success_url(self): | 117 | def get_success_url(self): |
101 | - self.success_url = reverse('forum:render_post', args = (self.object.id, )) | 118 | + self.success_url = reverse('course:forum:render_post', args = (self.object.id, )) |
102 | 119 | ||
103 | return self.success_url | 120 | return self.success_url |
104 | 121 | ||
@@ -108,7 +125,7 @@ class PostDeleteView(LoginRequiredMixin, generic.DeleteView): | @@ -108,7 +125,7 @@ class PostDeleteView(LoginRequiredMixin, generic.DeleteView): | ||
108 | 125 | ||
109 | model = Post | 126 | model = Post |
110 | pk_url_kwarg = 'pk' | 127 | pk_url_kwarg = 'pk' |
111 | - success_url = reverse_lazy('forum:deleted_post') | 128 | + success_url = reverse_lazy('course:forum:deleted_post') |
112 | 129 | ||
113 | def post_deleted(request): | 130 | def post_deleted(request): |
114 | return HttpResponse(_("Post deleted successfully.")) | 131 | return HttpResponse(_("Post deleted successfully.")) |
@@ -131,4 +148,4 @@ class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView): | @@ -131,4 +148,4 @@ class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView): | ||
131 | 148 | ||
132 | template_name = 'post_answers/post_answer_form.html' | 149 | template_name = 'post_answers/post_answer_form.html' |
133 | form_class = PostAnswerForm | 150 | form_class = PostAnswerForm |
134 | - success_url = reverse_lazy('forum:index') | ||
135 | \ No newline at end of file | 151 | \ No newline at end of file |
152 | + success_url = reverse_lazy('course:forum:index') | ||
136 | \ No newline at end of file | 153 | \ No newline at end of file |
requirements.txt
@@ -14,7 +14,6 @@ itsdangerous==0.24 | @@ -14,7 +14,6 @@ itsdangerous==0.24 | ||
14 | Jinja2==2.8 | 14 | Jinja2==2.8 |
15 | MarkupSafe==0.23 | 15 | MarkupSafe==0.23 |
16 | Pillow==3.3.1 | 16 | Pillow==3.3.1 |
17 | -pkg-resources==0.0.0 | ||
18 | psycopg2==2.6.2 | 17 | psycopg2==2.6.2 |
19 | pycpfcnpj==1.0.2 | 18 | pycpfcnpj==1.0.2 |
20 | six==1.10.0 | 19 | six==1.10.0 |