emojis and migrations

This commit is contained in:
vabene1111 2018-05-14 11:31:17 +02:00
parent 8107e46b60
commit 87b7f0d204
20 changed files with 2461 additions and 24 deletions

2
.gitignore vendored
View File

@ -70,5 +70,3 @@ secret_settings\.py
*.sqlite3 *.sqlite3
\.idea/workspace\.xml \.idea/workspace\.xml
cookbook/migrations/

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="JavaScriptLibraryMappings"> <component name="JavaScriptLibraryMappings">
<file url="file://$PROJECT_DIR$" libraries="{bootstrap, jquery-3.2.1, jquery-3.2.1.slim, jquery-3.3.1, popper, select2}" /> <file url="file://$PROJECT_DIR$" libraries="{bootstrap, jquery-3.2.1.slim, jquery-3.3.1, popper, select2}" />
</component> </component>
</project> </project>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6.1 (C:\Users\vabene1111\AppData\Local\Programs\Python\Python36\python.exe)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6 (recipies)" project-jdk-type="Python SDK" />
</project> </project>

View File

@ -16,7 +16,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" /> <excludeFolder url="file://$MODULE_DIR$/venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.6.1 (C:\Users\vabene1111\AppData\Local\Programs\Python\Python36\python.exe)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.6 (recipies)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="bootstrap" level="application" /> <orderEntry type="library" name="bootstrap" level="application" />
<orderEntry type="library" name="jquery-3.2.1.slim" level="application" /> <orderEntry type="library" name="jquery-3.2.1.slim" level="application" />
@ -27,6 +27,8 @@
<orderEntry type="library" name="jquery-3.2.1" level="application" /> <orderEntry type="library" name="jquery-3.2.1" level="application" />
<orderEntry type="library" name="jquery-3.3.1" level="application" /> <orderEntry type="library" name="jquery-3.3.1" level="application" />
<orderEntry type="library" name="select2" level="application" /> <orderEntry type="library" name="select2" level="application" />
<orderEntry type="library" name="jquery-3.3.1" level="application" />
<orderEntry type="library" name="select2" level="application" />
</component> </component>
<component name="TemplatesService"> <component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" /> <option name="TEMPLATE_CONFIGURATION" value="Django" />

View File

@ -0,0 +1,80 @@
# Generated by Django 2.0.5 on 2018-05-14 08:50
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=64, unique=True)),
('description', models.TextField(blank=True, default='')),
('created_by', models.IntegerField(default=0)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name='Keyword',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=64, unique=True)),
('description', models.TextField(blank=True, default='')),
('created_by', models.IntegerField(default=0)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name='Recipe',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
('path', models.CharField(default='', max_length=512)),
('link', models.CharField(default='', max_length=512)),
('created_by', models.IntegerField(default=0)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='cookbook.Category')),
('keywords', models.ManyToManyField(blank=True, to='cookbook.Keyword')),
],
),
migrations.CreateModel(
name='RecipeImport',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
('path', models.CharField(default='', max_length=512)),
('created_at', models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='Sync',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('path', models.CharField(default='', max_length=512)),
('last_checked', models.DateTimeField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name='SyncLog',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('status', models.CharField(max_length=32)),
('msg', models.TextField(default='')),
('created_at', models.DateTimeField(auto_now_add=True)),
('monitor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.Sync')),
],
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.0.5 on 2018-05-14 08:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='category',
name='icon',
field=models.CharField(blank=True, max_length=4, null=True),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 2.0.5 on 2018-05-14 09:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0002_category_icon'),
]
operations = [
migrations.AddField(
model_name='keyword',
name='icon',
field=models.CharField(blank=True, max_length=1, null=True),
),
migrations.AlterField(
model_name='category',
name='icon',
field=models.CharField(blank=True, max_length=1, null=True),
),
]

View File

View File

@ -3,6 +3,7 @@ from django.db import models
class Keyword(models.Model): class Keyword(models.Model):
name = models.CharField(max_length=64, unique=True) name = models.CharField(max_length=64, unique=True)
icon = models.CharField(max_length=1, blank=True, null=True)
description = models.TextField(default="", blank=True) description = models.TextField(default="", blank=True)
created_by = models.IntegerField(default=0) created_by = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
@ -14,6 +15,7 @@ class Keyword(models.Model):
class Category(models.Model): class Category(models.Model):
name = models.CharField(max_length=64, unique=True) name = models.CharField(max_length=64, unique=True)
icon = models.CharField(max_length=1, blank=True, null=True)
description = models.TextField(default="", blank=True) description = models.TextField(default="", blank=True)
created_by = models.IntegerField(default=0) created_by = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)

View File

@ -0,0 +1,560 @@
.dropdown-menu.textcomplete-dropdown[data-strategy="emojionearea"] {
position: absolute;
z-index: 1000;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0;
font-size: 14px;
text-align: left;
list-style: none;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.15);
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
-moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); }
.dropdown-menu.textcomplete-dropdown[data-strategy="emojionearea"] li.textcomplete-item {
font-size: 14px;
padding: 1px 3px;
border: 0; }
.dropdown-menu.textcomplete-dropdown[data-strategy="emojionearea"] li.textcomplete-item a {
text-decoration: none;
display: block;
height: 100%;
line-height: 1.8em;
padding: 0 1.54em 0 .615em;
color: #4f4f4f; }
.dropdown-menu.textcomplete-dropdown[data-strategy="emojionearea"] li.textcomplete-item:hover, .dropdown-menu.textcomplete-dropdown[data-strategy="emojionearea"] li.textcomplete-item.active {
background-color: #e4e4e4; }
.dropdown-menu.textcomplete-dropdown[data-strategy="emojionearea"] li.textcomplete-item:hover a, .dropdown-menu.textcomplete-dropdown[data-strategy="emojionearea"] li.textcomplete-item.active a {
color: #333; }
.dropdown-menu.textcomplete-dropdown[data-strategy="emojionearea"] li.textcomplete-item .emojioneemoji {
font-size: inherit;
height: 2ex;
width: 2.1ex;
min-height: 20px;
min-width: 20px;
display: inline-block;
margin: 0 5px .2ex 0;
line-height: normal;
vertical-align: middle;
max-width: 100%;
top: 0; }
.emojionearea-text [class*=emojione-], .emojionearea-text .emojioneemoji {
font-size: inherit;
height: 2ex;
width: 2.1ex;
min-height: 20px;
min-width: 20px;
display: inline-block;
margin: -.2ex .15em .2ex;
line-height: normal;
vertical-align: middle;
max-width: 100%;
top: 0; }
.emojionearea, .emojionearea * {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box; }
.emojionearea.emojionearea-disable {
position: relative;
background-color: #eee;
-moz-user-select: -moz-none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none; }
.emojionearea.emojionearea-disable:before {
content: "";
display: block;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1;
opacity: 0.3;
position: absolute;
background-color: #eee; }
.emojionearea, .emojionearea.form-control {
display: block;
position: relative !important;
width: 100%;
height: auto;
padding: 0;
font-size: 14px;
border: 0;
background-color: #FFFFFF;
border: 1px solid #CCCCCC;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-moz-transition: border-color 0.15s ease-in-out, -moz-box-shadow 0.15s ease-in-out;
-o-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
.emojionearea.focused {
border-color: #66AFE9;
outline: 0;
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }
.emojionearea .emojionearea-editor {
display: block;
height: auto;
min-height: 8em;
max-height: 15em;
overflow: auto;
padding: 6px 24px 6px 12px;
line-height: 1.42857143;
font-size: inherit;
color: #555555;
background-color: transparent;
border: 0;
cursor: text;
margin-right: 1px;
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none; }
.emojionearea .emojionearea-editor:empty:before {
content: attr(placeholder);
display: block;
color: #BBBBBB; }
.emojionearea .emojionearea-editor:focus {
border: 0;
outline: 0;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none; }
.emojionearea .emojionearea-editor [class*=emojione-], .emojionearea .emojionearea-editor .emojioneemoji {
font-size: inherit;
height: 2ex;
width: 2.1ex;
min-height: 20px;
min-width: 20px;
display: inline-block;
margin: -.2ex .15em .2ex;
line-height: normal;
vertical-align: middle;
max-width: 100%;
top: 0; }
.emojionearea.emojionearea-inline {
height: 34px; }
.emojionearea.emojionearea-inline > .emojionearea-editor {
height: 32px;
min-height: 20px;
overflow: hidden;
white-space: nowrap;
position: absolute;
top: 0;
left: 12px;
right: 24px;
padding: 6px 0; }
.emojionearea.emojionearea-inline > .emojionearea-button {
top: 4px; }
.emojionearea .emojionearea-button {
z-index: 5;
position: absolute;
right: 3px;
top: 3px;
width: 24px;
height: 24px;
opacity: 0.6;
cursor: pointer;
-moz-transition: opacity 300ms ease-in-out;
-o-transition: opacity 300ms ease-in-out;
-webkit-transition: opacity 300ms ease-in-out;
transition: opacity 300ms ease-in-out; }
.emojionearea .emojionearea-button:hover {
opacity: 1; }
.emojionearea .emojionearea-button > div {
display: block;
width: 24px;
height: 24px;
position: absolute;
-moz-transition: all 400ms ease-in-out;
-o-transition: all 400ms ease-in-out;
-webkit-transition: all 400ms ease-in-out;
transition: all 400ms ease-in-out; }
.emojionearea .emojionearea-button > div.emojionearea-button-open {
background-position: 0 -24px;
filter: progid:DXImageTransform.Microsoft.Alpha(enabled=false);
opacity: 1; }
.emojionearea .emojionearea-button > div.emojionearea-button-close {
background-position: 0 0;
-webkit-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
opacity: 0; }
.emojionearea .emojionearea-button.active > div.emojionearea-button-open {
-webkit-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
opacity: 0; }
.emojionearea .emojionearea-button.active > div.emojionearea-button-close {
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
filter: progid:DXImageTransform.Microsoft.Alpha(enabled=false);
opacity: 1; }
.emojionearea .emojionearea-picker {
background: #FFFFFF;
position: absolute;
-moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.32);
-webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.32);
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.32);
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
height: 276px;
width: 316px;
top: -15px;
right: -15px;
z-index: 90;
-moz-transition: all 0.25s ease-in-out;
-o-transition: all 0.25s ease-in-out;
-webkit-transition: all 0.25s ease-in-out;
transition: all 0.25s ease-in-out;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
opacity: 0;
-moz-user-select: -moz-none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none; }
.emojionearea .emojionearea-picker.hidden {
display: none; }
.emojionearea .emojionearea-picker .emojionearea-wrapper {
position: relative;
height: 276px;
width: 316px; }
.emojionearea .emojionearea-picker .emojionearea-wrapper:after {
content: "";
display: block;
position: absolute;
background-repeat: no-repeat;
z-index: 91; }
.emojionearea .emojionearea-picker .emojionearea-filters {
width: 100%;
position: absolute;
z-index: 95; }
.emojionearea .emojionearea-picker .emojionearea-filters {
background: #F5F7F9;
padding: 0 0 0 7px;
height: 40px; }
.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter {
display: block;
float: left;
height: 40px;
width: 32px;
filter: inherit;
padding: 7px 1px 0;
cursor: pointer;
-webkit-filter: grayscale(1);
filter: grayscale(1); }
.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter.active {
background: #fff; }
.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter.active, .emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter:hover {
-webkit-filter: grayscale(0);
filter: grayscale(0); }
.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter > i {
width: 24px;
height: 24px;
top: 0; }
.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter > img {
width: 24px;
height: 24px;
margin: 0 3px; }
.emojionearea .emojionearea-picker .emojionearea-search-panel {
height: 30px;
position: absolute;
z-index: 95;
top: 40px;
left: 0;
right: 0;
padding: 5px 0 5px 8px; }
.emojionearea .emojionearea-picker .emojionearea-search-panel .emojionearea-tones {
float: right;
margin-right: 10px;
margin-top: -1px; }
.emojionearea .emojionearea-picker .emojionearea-tones-panel .emojionearea-tones {
position: absolute;
top: 4px;
left: 171px; }
.emojionearea .emojionearea-picker .emojionearea-search {
float: left;
padding: 0;
height: 20px;
width: 160px; }
.emojionearea .emojionearea-picker .emojionearea-search > input {
outline: none;
width: 160px;
min-width: 160px;
height: 20px; }
.emojionearea .emojionearea-picker .emojionearea-tones {
padding: 0;
width: 120px;
height: 20px; }
.emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone {
display: inline-block;
padding: 0;
border: 0;
vertical-align: middle;
outline: none;
background: transparent;
cursor: pointer;
position: relative; }
.emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-0, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-0:after {
background-color: #ffcf3e; }
.emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-1, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-1:after {
background-color: #fae3c5; }
.emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-2, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-2:after {
background-color: #e2cfa5; }
.emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-3, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-3:after {
background-color: #daa478; }
.emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-4, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-4:after {
background-color: #a78058; }
.emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-5, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-5:after {
background-color: #5e4d43; }
.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone {
width: 20px;
height: 20px;
margin: 0;
background-color: transparent; }
.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone:after {
content: "";
position: absolute;
display: block;
top: 4px;
left: 4px;
width: 12px;
height: 12px; }
.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone.active:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone.active:after {
top: 0;
left: 0;
width: 20px;
height: 20px; }
.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox > .btn-tone {
width: 16px;
height: 16px;
margin: 0px 2px; }
.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio > .btn-tone.active:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox > .btn-tone.active:after {
content: "";
position: absolute;
display: block;
background-color: transparent;
border: 2px solid #fff;
width: 8px;
height: 8px;
top: 2px;
left: 2px;
box-sizing: initial; }
.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio > .btn-tone:after {
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%; }
.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox > .btn-tone:after {
-moz-border-radius: 1px;
-webkit-border-radius: 1px;
border-radius: 1px; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area {
height: 236px; }
.emojionearea .emojionearea-picker .emojionearea-search-panel + .emojionearea-scroll-area {
height: 206px; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area {
overflow: auto;
overflow-x: hidden;
width: 100%;
position: absolute;
padding: 0 0 5px; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-emojis-list {
z-index: 1; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title {
display: block;
font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
font-size: 13px;
font-weight: normal;
color: #b2b2b2;
background: #FFFFFF;
line-height: 20px;
margin: 0;
padding: 7px 0 5px 6px; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title:after, .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title:before {
content: " ";
display: block;
clear: both; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block {
padding: 0 0 0 7px; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block > .emojionearea-category {
padding: 0 !important; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block > .emojionearea-category:after, .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block > .emojionearea-category:before {
content: " ";
display: block;
clear: both; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block:after, .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block:before {
content: " ";
display: block;
clear: both; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area [class*=emojione-] {
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
margin: 0;
width: 24px;
height: 24px;
top: 0; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn {
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
width: 24px;
height: 24px;
float: left;
display: block;
margin: 1px;
padding: 3px; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn:hover {
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
background-color: #e4e4e4;
cursor: pointer; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn i, .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn img {
float: left;
display: block;
width: 24px;
height: 24px; }
.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn img.lazy-emoji {
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
opacity: 0; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-top .emojionearea-filters {
top: 0;
-moz-border-radius-topleft: 5px;
-webkit-border-top-left-radius: 5px;
border-top-left-radius: 5px;
-moz-border-radius-topright: 5px;
-webkit-border-top-right-radius: 5px;
border-top-right-radius: 5px; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-top .emojionearea-scroll-area {
bottom: 0; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-bottom .emojionearea-scroll-area {
top: 40px; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-bottom .emojionearea-search-panel {
top: initial;
bottom: 0; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom .emojionearea-filters {
bottom: 0;
-moz-border-radius-bottomleft: 5px;
-webkit-border-bottom-left-radius: 5px;
border-bottom-left-radius: 5px;
-moz-border-radius-bottomright: 5px;
-webkit-border-bottom-right-radius: 5px;
border-bottom-right-radius: 5px; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-bottom .emojionearea-scroll-area {
top: 0; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-bottom .emojionearea-search-panel {
top: initial;
bottom: 40px; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-top .emojionearea-scroll-area {
top: initial;
bottom: 40px; }
.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-top .emojionearea-search-panel {
top: 0; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-top {
margin-top: -286px;
right: -14px; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-top .emojionearea-wrapper:after {
width: 19px;
height: 10px;
background-position: -2px -49px;
bottom: -10px;
right: 20px; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-top.emojionearea-filters-position-bottom .emojionearea-wrapper:after {
background-position: -2px -80px; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-left, .emojionearea .emojionearea-picker.emojionearea-picker-position-right {
margin-right: -326px;
top: -8px; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-left .emojionearea-wrapper:after, .emojionearea .emojionearea-picker.emojionearea-picker-position-right .emojionearea-wrapper:after {
width: 10px;
height: 19px;
background-position: 0px -60px;
top: 13px;
left: -10px; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-left.emojionearea-filters-position-bottom .emojionearea-wrapper:after, .emojionearea .emojionearea-picker.emojionearea-picker-position-right.emojionearea-filters-position-bottom .emojionearea-wrapper:after {
background-position: right -60px; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-bottom {
margin-top: 10px;
right: -14px;
top: 47px; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-bottom .emojionearea-wrapper:after {
width: 19px;
height: 10px;
background-position: -2px -100px;
top: -10px;
right: 20px; }
.emojionearea .emojionearea-picker.emojionearea-picker-position-bottom.emojionearea-filters-position-bottom .emojionearea-wrapper:after {
background-position: -2px -90px; }
.emojionearea .emojionearea-button.active + .emojionearea-picker {
filter: progid:DXImageTransform.Microsoft.Alpha(enabled=false);
opacity: 1; }
.emojionearea .emojionearea-button.active + .emojionearea-picker-position-top {
margin-top: -269px; }
.emojionearea .emojionearea-button.active + .emojionearea-picker-position-left,
.emojionearea .emojionearea-button.active + .emojionearea-picker-position-right {
margin-right: -309px; }
.emojionearea .emojionearea-button.active + .emojionearea-picker-position-bottom {
margin-top: -7px; }
.emojionearea.emojionearea-standalone {
display: inline-block;
width: auto;
box-shadow: none; }
.emojionearea.emojionearea-standalone .emojionearea-editor {
min-height: 33px;
position: relative;
padding: 6px 42px 6px 6px; }
.emojionearea.emojionearea-standalone .emojionearea-editor::before {
content: "";
position: absolute;
top: 4px;
left: 50%;
bottom: 4px;
border-left: 1px solid #e6e6e6; }
.emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder {
background-repeat: no-repeat;
background-position: 20px 4px; }
.emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder .emojioneemoji {
opacity: 0.4; }
.emojionearea.emojionearea-standalone .emojionearea-button {
top: 0;
right: 0;
bottom: 0;
left: 0;
width: auto;
height: auto; }
.emojionearea.emojionearea-standalone .emojionearea-button > div {
right: 6px;
top: 5px; }
.emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-bottom .emojionearea-wrapper:after, .emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-top .emojionearea-wrapper:after {
right: 23px; }
.emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-left .emojionearea-wrapper:after, .emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-right .emojionearea-wrapper:after {
top: 15px; }
.emojionearea .emojionearea-button > div, .emojionearea .emojionearea-picker .emojionearea-wrapper:after {
background-image: url('data:image/png;base64,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') !important; }
.emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAC/v79T5hyIAAAAAXRSTlMAQObYZgAAABNJREFUCNdjYGNgQEb/P4AQqiAASiUEG6Vit44AAAAASUVORK5CYII=') !important; }
/*# sourceMappingURL=emojionearea.css.map */

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
import django_tables2 as tables import django_tables2 as tables
from django_tables2.utils import A # alias for Accessor
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django_tables2.utils import A # alias for Accessor
from .models import * from .models import *
@ -13,7 +13,8 @@ class RecipeTable(tables.Table):
attrs={'td': {'class': 'd-none d-lg-table-cell'}, 'th': {'class': 'd-none d-lg-table-cell'}}) attrs={'td': {'class': 'd-none d-lg-table-cell'}, 'th': {'class': 'd-none d-lg-table-cell'}})
all_tags = tables.Column( all_tags = tables.Column(
attrs={'td': {'class': 'd-none d-lg-table-cell'}, 'th': {'class': 'd-none d-lg-table-cell'}}) attrs={'td': {'class': 'd-none d-lg-table-cell'}, 'th': {'class': 'd-none d-lg-table-cell'}})
delete = tables.TemplateColumn("<a href='{% url 'delete_recipe' record.id %}' >" + _('Delete') + "</a>") # TODO remove and put into edit page delete = tables.TemplateColumn(
"<a href='{% url 'delete_recipe' record.id %}' >" + _('Delete') + "</a>") # TODO remove and put into edit page
class Meta: class Meta:
model = Recipe model = Recipe
@ -28,7 +29,7 @@ class CategoryTable(tables.Table):
class Meta: class Meta:
model = Category model = Category
template_name = 'generic/table_template.html' template_name = 'generic/table_template.html'
fields = ('id', 'name') fields = ('id', 'icon', 'name')
class KeywordTable(tables.Table): class KeywordTable(tables.Table):
@ -38,7 +39,7 @@ class KeywordTable(tables.Table):
class Meta: class Meta:
model = Keyword model = Keyword
template_name = 'generic/table_template.html' template_name = 'generic/table_template.html'
fields = ('id', 'name') fields = ('id', 'icon', 'name')
class ImportLogTable(tables.Table): class ImportLogTable(tables.Table):

View File

@ -23,6 +23,9 @@
<link rel="stylesheet" href="{% static "fontawesome/fontawesome-all.css" %}"> <link rel="stylesheet" href="{% static "fontawesome/fontawesome-all.css" %}">
<link rel="stylesheet" href="{% static "emojionearea/emojionearea.min.css" %}">
<script type="text/javascript" src="{% static "emojionearea/emojionearea.min.js" %}"></script>
<style> <style>
@media (max-width: 1025px) { @media (max-width: 1025px) {
.container { .container {

View File

@ -20,6 +20,7 @@
//shitty solution that needs to be redone at some point //shitty solution that needs to be redone at some point
$(document).ready(function () { $(document).ready(function () {
$('#id_keywords').select2(); $('#id_keywords').select2();
$('#id_icon').emojioneArea();
}); });
</script> </script>
{% endblock %} {% endblock %}

View File

@ -20,6 +20,8 @@
//shitty solution that needs to be redone at some point //shitty solution that needs to be redone at some point
$(document).ready(function () { $(document).ready(function () {
$('#id_keywords').select2(); $('#id_keywords').select2();
$('#id_icon').emojioneArea();
}); });
</script> </script>
{% endblock %} {% endblock %}

View File

@ -30,12 +30,11 @@ def batch_monitor(request):
@login_required @login_required
def batch_import_all(request): def batch_import_all(request):
if request.method == "POST": imports = RecipeImport.objects.all()
imports = RecipeImport.objects.all() for new_recipe in imports:
for new_recipe in imports: recipe = Recipe(name=new_recipe.name, path=new_recipe.path)
recipe = Recipe(name=new_recipe.name, path=new_recipe.path) recipe.save()
recipe.save() new_recipe.delete()
new_recipe.delete()
return redirect('list_import') return redirect('list_import')

View File

@ -14,7 +14,7 @@ class MonitorUpdate(LoginRequiredMixin, UpdateView):
fields = ['path'] fields = ['path']
def get_success_url(self): def get_success_url(self):
return reverse('edit_recipe', kwargs={'pk': self.object.pk}) return reverse('edit_recipe', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(MonitorUpdate, self).get_context_data(**kwargs) context = super(MonitorUpdate, self).get_context_data(**kwargs)
@ -25,10 +25,10 @@ class MonitorUpdate(LoginRequiredMixin, UpdateView):
class CategoryUpdate(LoginRequiredMixin, UpdateView): class CategoryUpdate(LoginRequiredMixin, UpdateView):
template_name = "generic\edit_template.html" template_name = "generic\edit_template.html"
model = Category model = Category
fields = ['name', 'description'] fields = ['name', 'icon', 'description']
def get_success_url(self): def get_success_url(self):
return reverse('edit_recipe', kwargs={'pk': self.object.pk}) return reverse('edit_recipe', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(CategoryUpdate, self).get_context_data(**kwargs) context = super(CategoryUpdate, self).get_context_data(**kwargs)
@ -39,10 +39,10 @@ class CategoryUpdate(LoginRequiredMixin, UpdateView):
class KeywordUpdate(LoginRequiredMixin, UpdateView): class KeywordUpdate(LoginRequiredMixin, UpdateView):
template_name = "generic\edit_template.html" template_name = "generic\edit_template.html"
model = Keyword model = Keyword
fields = ['name', 'description'] fields = ['name', 'icon', 'description']
def get_success_url(self): def get_success_url(self):
return reverse('edit_recipe', kwargs={'pk': self.object.pk}) return reverse('edit_recipe', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(KeywordUpdate, self).get_context_data(**kwargs) context = super(KeywordUpdate, self).get_context_data(**kwargs)
@ -56,7 +56,7 @@ class ImportUpdate(LoginRequiredMixin, UpdateView):
fields = ['name', 'path'] fields = ['name', 'path']
def get_success_url(self): def get_success_url(self):
return reverse('edit_import', kwargs={'pk': self.object.pk}) return reverse('edit_import', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(ImportUpdate, self).get_context_data(**kwargs) context = super(ImportUpdate, self).get_context_data(**kwargs)
@ -78,7 +78,7 @@ class RecipeUpdate(LoginRequiredMixin, UpdateView):
return super(RecipeUpdate, self).form_valid(form) return super(RecipeUpdate, self).form_valid(form)
def get_success_url(self): def get_success_url(self):
return reverse('edit_recipe', kwargs={'pk': self.object.pk}) return reverse('edit_recipe', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(RecipeUpdate, self).get_context_data(**kwargs) context = super(RecipeUpdate, self).get_context_data(**kwargs)

View File

@ -25,7 +25,7 @@ class RecipeCreate(LoginRequiredMixin, CreateView): # this exists for completen
class CategoryCreate(LoginRequiredMixin, CreateView): class CategoryCreate(LoginRequiredMixin, CreateView):
template_name = "generic\\new_template.html" template_name = "generic\\new_template.html"
model = Category model = Category
fields = ['name', 'description'] fields = ['name', 'icon', 'description']
success_url = reverse_lazy('list_category') success_url = reverse_lazy('list_category')
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@ -37,7 +37,7 @@ class CategoryCreate(LoginRequiredMixin, CreateView):
class KeywordCreate(LoginRequiredMixin, CreateView): class KeywordCreate(LoginRequiredMixin, CreateView):
template_name = "generic\\new_template.html" template_name = "generic\\new_template.html"
model = Keyword model = Keyword
fields = ['name', 'description'] fields = ['name', 'icon', 'description']
success_url = reverse_lazy('list_keyword') success_url = reverse_lazy('list_keyword')
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):