├── .gitignore ├── static ├── favicon.ico ├── images │ └── python.png ├── pe-icon-set-food │ ├── fonts │ │ ├── pe-icon-set-food.eot │ │ ├── pe-icon-set-food.ttf │ │ └── pe-icon-set-food.woff │ └── css │ │ ├── helper.min.css │ │ ├── helper.css │ │ ├── pe-icon-set-food.min.css │ │ └── pe-icon-set-food.css ├── js │ ├── nav.js │ ├── sortTable.js │ ├── jquery.simplePagination.js │ └── inventory.js └── css │ ├── style_dark.css │ └── style.css ├── templates ├── inc │ ├── tables │ │ ├── tablefooter.html │ │ ├── tableheader.html │ │ ├── all.html │ │ ├── fruit.html │ │ ├── veg.html │ │ ├── cupboard.html │ │ ├── freezer.html │ │ ├── fridge.html │ │ ├── types.html │ │ ├── editcheck.html │ │ └── editcheck2.html │ ├── nav.html │ ├── types.html │ ├── footer.html │ └── header.html ├── remove.html ├── error.html ├── add.html ├── settings.html ├── index.html ├── edititem.html ├── nostock.html └── viewall.html ├── config.ini ├── LICENSE.md ├── sqlSetup.sql ├── README.md └── inventory.py /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | venv/ 3 | .idea/ 4 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzzymannerz/Kitchen-Inventory/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /static/images/python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzzymannerz/Kitchen-Inventory/HEAD/static/images/python.png -------------------------------------------------------------------------------- /templates/inc/tables/tablefooter.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
-------------------------------------------------------------------------------- /static/pe-icon-set-food/fonts/pe-icon-set-food.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzzymannerz/Kitchen-Inventory/HEAD/static/pe-icon-set-food/fonts/pe-icon-set-food.eot -------------------------------------------------------------------------------- /static/pe-icon-set-food/fonts/pe-icon-set-food.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzzymannerz/Kitchen-Inventory/HEAD/static/pe-icon-set-food/fonts/pe-icon-set-food.ttf -------------------------------------------------------------------------------- /static/pe-icon-set-food/fonts/pe-icon-set-food.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzzymannerz/Kitchen-Inventory/HEAD/static/pe-icon-set-food/fonts/pe-icon-set-food.woff -------------------------------------------------------------------------------- /config.ini: -------------------------------------------------------------------------------- 1 | [mySQL] 2 | host = localhost 3 | database = inventory 4 | username = inventory 5 | password = password 6 | 7 | [basicAuth] 8 | username = username 9 | password = password 10 | forceauth = True 11 | 12 | [testMode] 13 | active = True 14 | host = 127.0.0.1 15 | 16 | [siteSettings] 17 | sitetitle = Kitchen Inventory 18 | darkmode = off 19 | enablebarcodes = on 20 | 21 | -------------------------------------------------------------------------------- /static/js/nav.js: -------------------------------------------------------------------------------- 1 | // Enables the mobile navigation bar 2 | document.addEventListener('DOMContentLoaded', function() { 3 | var elems = document.querySelectorAll('.sidenav'); 4 | var instances = M.Sidenav.init(elems); 5 | }); 6 | 7 | // Enables modal triggers 8 | document.addEventListener('DOMContentLoaded', function() { 9 | var elems = document.querySelectorAll('.modal'); 10 | var instances = M.Modal.init(elems, {dismissible:false}); 11 | }); -------------------------------------------------------------------------------- /templates/remove.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/header.html' %} 2 | 3 |
4 |
5 |
6 |
7 |

Remove An Item

8 |
9 |
10 |
11 |
12 | Cancel 13 |
14 |
15 |
16 |
17 | 18 | {% include 'inc/footer.html' %} -------------------------------------------------------------------------------- /templates/inc/tables/tableheader.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% if editMode %} 5 | 6 | {% endif %} 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /templates/inc/tables/all.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/tables/tableheader.html' %} 2 | 3 | {% for item in items %} 4 | {% if item[2] >= 1 %} 5 | 6 | {% include 'inc/tables/editcheck.html' %} 7 | {% include 'inc/tables/types.html' %} 8 | {% include 'inc/tables/editcheck2.html' %} 9 | 10 | {% endif %} 11 | {% endfor %} 12 | 13 |
ITEMAMOUNTTYPE
14 | {% include 'inc/tables/tablefooter.html' %} -------------------------------------------------------------------------------- /templates/inc/nav.html: -------------------------------------------------------------------------------- 1 | 11 | 12 | 16 | {% endif %} -------------------------------------------------------------------------------- /templates/inc/tables/fruit.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/tables/tableheader.html' %} 2 | 3 | {% for item in items %} 4 | 5 | {% if item[4] == 5 %} 6 | 7 | {% if item[2] >= 1 %} 8 | 9 | {% include 'inc/tables/editcheck.html' %} 10 | {% include 'inc/tables/types.html' %} 11 | {% include 'inc/tables/editcheck2.html' %} 12 | 13 | {% endif %} 14 | 15 | {% endif %} 16 | 17 | {% endfor %} 18 | 19 | 20 | {% include 'inc/tables/tablefooter.html' %} -------------------------------------------------------------------------------- /templates/inc/tables/veg.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/tables/tableheader.html' %} 2 | 3 | {% for item in items %} 4 | 5 | {% if item[4] == 4 %} 6 | 7 | {% if item[2] >= 1 %} 8 | 9 | {% include 'inc/tables/editcheck.html' %} 10 | {% include 'inc/tables/types.html' %} 11 | {% include 'inc/tables/editcheck2.html' %} 12 | 13 | {% endif %} 14 | 15 | {% endif %} 16 | 17 | {% endfor %} 18 | 19 | 20 | {% include 'inc/tables/tablefooter.html' %} -------------------------------------------------------------------------------- /templates/inc/tables/cupboard.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/tables/tableheader.html' %} 2 | 3 | {% for item in items %} 4 | 5 | {% if item[4] == 3 %} 6 | 7 | {% if item[2] >= 1 %} 8 | 9 | {% include 'inc/tables/editcheck.html' %} 10 | {% include 'inc/tables/types.html' %} 11 | {% include 'inc/tables/editcheck2.html' %} 12 | 13 | {% endif %} 14 | 15 | {% endif %} 16 | 17 | {% endfor %} 18 | 19 | 20 | {% include 'inc/tables/tablefooter.html' %} -------------------------------------------------------------------------------- /templates/inc/tables/freezer.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/tables/tableheader.html' %} 2 | 3 | {% for item in items %} 4 | 5 | {% if item[4] == 2 %} 6 | 7 | {% if item[2] >= 1 %} 8 | 9 | {% include 'inc/tables/editcheck.html' %} 10 | {% include 'inc/tables/types.html' %} 11 | {% include 'inc/tables/editcheck2.html' %} 12 | 13 | {% endif %} 14 | 15 | {% endif %} 16 | 17 | {% endfor %} 18 | 19 | 20 | {% include 'inc/tables/tablefooter.html' %} -------------------------------------------------------------------------------- /templates/inc/tables/fridge.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/tables/tableheader.html' %} 2 | 3 | {% for item in items %} 4 | 5 | {% if item[4] == 1 %} 6 | 7 | {% if item[2] >= 1 %} 8 | 9 | {% include 'inc/tables/editcheck.html' %} 10 | {% include 'inc/tables/types.html' %} 11 | {% include 'inc/tables/editcheck2.html' %} 12 | 13 | {% endif %} 14 | 15 | {% endif %} 16 | 17 | {% endfor %} 18 | 19 | 20 | {% include 'inc/tables/tablefooter.html' %} -------------------------------------------------------------------------------- /templates/inc/types.html: -------------------------------------------------------------------------------- 1 | {% if item[4] == 1 %} 2 | 3 | {% elif item[4] == 2 %} 4 | ac_unit 5 | {% elif item[4] == 3 %} 6 | 7 | {% elif item[4] == 4 %} 8 | 9 | {% elif item[4] == 5 %} 10 | 11 | {% else %} 12 | help 13 | {% endif %} -------------------------------------------------------------------------------- /templates/inc/tables/types.html: -------------------------------------------------------------------------------- 1 | {% if item[4] == 1 %} 2 | 3 | {% elif item[4] == 2 %} 4 | ac_unit 5 | {% elif item[4] == 3 %} 6 | 7 | {% elif item[4] == 4 %} 8 | 9 | {% elif item[4] == 5 %} 10 | 11 | {% else %} 12 | help 13 | {% endif %} -------------------------------------------------------------------------------- /templates/inc/tables/editcheck.html: -------------------------------------------------------------------------------- 1 | {% if editMode %} 2 | delete_forever 3 | 4 | 5 | {{ item[3] }} 6 | create 7 | 8 | {% else %} 9 | {{ item[3] }} create 10 | {% endif %} 11 | {{ item[2] }} -------------------------------------------------------------------------------- /templates/error.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/header.html' %} 2 | 3 |
4 |
5 |
6 |
7 | mood_bad 8 |

Oh no!

9 |
10 |
11 |
12 |
13 |

The following error occured:

14 |

{{ error }}

15 |
16 |
17 |
18 |
19 | Go Back 20 |
21 |
22 |
23 |
24 | 25 | {% include 'inc/footer.html' %} -------------------------------------------------------------------------------- /templates/inc/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /templates/inc/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ config.siteTitle }} 6 | 7 | 8 | 9 | 10 | 11 | {% if config.darkmode == "on" %} 12 | 13 | {% endif %} 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | {% include 'inc/nav.html' %} -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2018 Fuzzy 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /templates/inc/tables/editcheck2.html: -------------------------------------------------------------------------------- 1 | {% if editMode %} 2 | 3 | 4 |
5 | remove 6 |
7 |
8 | 9 | 10 | 11 | 12 |
13 | add 14 |
15 |
16 | 17 | 18 | 19 | {% else %} 20 | 21 |
22 | remove 23 |
24 | 25 | 26 | 27 |
28 | add 29 |
30 | 31 | {% endif %} -------------------------------------------------------------------------------- /static/css/style_dark.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #212121; 3 | } 4 | 5 | a{ 6 | color: white; 7 | } 8 | 9 | h1 { 10 | color: #bdbdbd; 11 | } 12 | 13 | h1 a{ 14 | color: #bdbdbd; 15 | } 16 | 17 | input{ 18 | color: #bdbdbd; 19 | } 20 | .filtersText{ 21 | color: #bdbdbd; 22 | } 23 | .tablePagination{ 24 | color: #bdbdbd; 25 | } 26 | .brown{ 27 | background-color: #303030 !important; 28 | } 29 | .green{ 30 | background-color: #1b5e20 !important; 31 | } 32 | .red{ 33 | background-color: #b71c1c !important; 34 | } 35 | 36 | [type="checkbox"].filled-in:checked + span:not(.lever):after { 37 | border: 2px solid green; 38 | background-color: green; 39 | } 40 | 41 | tr{ 42 | background-color: #bdbdbd; 43 | } 44 | td{ 45 | background-color: #757575; 46 | color: white; 47 | } 48 | #editName a, #editName i{ 49 | color: #ffffff; 50 | } 51 | #editName a:hover, #editName i:hover{ 52 | color: #212121; 53 | } 54 | #remove, #remove a{ 55 | color: white; 56 | background-color: #b71c1c; 57 | } 58 | #remove:hover, #remove a:hover{ 59 | background-color: #c62828; 60 | } 61 | 62 | #add, #add a{ 63 | color: white; 64 | background-color: #1b5e20; 65 | } 66 | #add:hover, #add a:hover{ 67 | background-color: #2e7d32; 68 | } 69 | 70 | #disabledEdit, #disabledEdit:hover{ 71 | color: #bdbdbd; 72 | background-color: #212121; 73 | } 74 | #editName a{ 75 | color: #039BE5; 76 | } 77 | #editName a:hover{ 78 | color: black; 79 | } 80 | .errortext{ 81 | color: #bdbdbd; 82 | } 83 | footer{ 84 | color: #424242; 85 | } -------------------------------------------------------------------------------- /templates/add.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/header.html' %} 2 | 3 |
4 |
5 |
6 |
7 |

Add An Item

8 |
9 |
10 | 11 |
12 |
13 |
14 | 15 | {% if config.enablebarcodes == "on" %} 16 |
17 | 18 | 19 |
20 | {% else %} 21 | 22 | {% endif %} 23 | 24 |
25 | 26 | 27 |
28 |
29 |
30 |
31 | 32 | 33 |
34 |
35 | 36 | 44 | 45 | 46 |
47 |
48 | 49 | Cancel 50 |
51 |
52 |
53 |
54 | 55 | {% include 'inc/footer.html' %} 56 | -------------------------------------------------------------------------------- /static/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | display: flex; 3 | min-height: 100vh; 4 | flex-direction: column; 5 | } 6 | 7 | a{ 8 | color: #613c25; 9 | } 10 | 11 | h1 a{ 12 | color: black; 13 | } 14 | 15 | main { 16 | flex: 1 0 auto; 17 | } 18 | .tablePagination button{ 19 | padding: 10px; 20 | color: white; 21 | border: none; 22 | cursor: pointer; 23 | } 24 | .noselect { 25 | -webkit-touch-callout: none; /* iOS Safari */ 26 | -webkit-user-select: none; /* Safari */ 27 | -khtml-user-select: none; /* Konqueror HTML */ 28 | -moz-user-select: none; /* Firefox */ 29 | -ms-user-select: none; /* Internet Explorer/Edge */ 30 | user-select: none; /* Non-prefixed version, currently 31 | supported by Chrome and Opera */ 32 | } 33 | [type="checkbox"].filled-in:checked + span:not(.lever):after { 34 | border: 2px solid green; 35 | background-color: green; 36 | } 37 | th.tableHeader:hover{ 38 | cursor: pointer; 39 | } 40 | #remove, #remove a{ 41 | color: white; 42 | background-color: #ef9a9a; 43 | } 44 | #remove:hover, #remove a:hover{ 45 | background-color: #e53935; 46 | } 47 | 48 | #add, #add a{ 49 | color: white; 50 | background-color: #81c784; 51 | } 52 | #add:hover, #add a:hover{ 53 | background-color: #4caf50; 54 | } 55 | 56 | #disabledEdit, #disabledEdit:hover{ 57 | color: white; 58 | background-color: #bdbdbd; 59 | cursor: not-allowed; 60 | } 61 | #editName a{ 62 | color: #039BE5; 63 | } 64 | #editName a:hover{ 65 | color: black; 66 | } 67 | .errortext{ 68 | color: black; 69 | } 70 | .tabs .tab a{ 71 | color: #4CAF50; 72 | } 73 | .tabs .tab a:hover { 74 | background-color:#4CAF50; 75 | color:white; 76 | } 77 | .tabs .tab a.active { 78 | background-color:#4CAF50; 79 | color:white; 80 | } 81 | .tab a:focus, .tab a:focus.active { 82 | background-color:#4CAF50; 83 | color:black; 84 | } 85 | .tabs .indicator { 86 | background-color:#4CAF50; 87 | } 88 | td{ 89 | font-size: 18px; 90 | } 91 | footer{ 92 | text-align: center; 93 | padding: 20px; 94 | color: #b0bec5; 95 | } 96 | footer img{ 97 | margin-top: 20px; 98 | } -------------------------------------------------------------------------------- /templates/settings.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/header.html' %} 2 | 3 |
4 |
5 |
6 |
7 |

{{ config.sitetitle }} Settings

8 |
9 |
10 | 11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 |
20 | 21 |
22 |

23 | 31 |

32 |
33 | 34 |
35 |

36 | 44 |

45 |
46 | 47 | 48 |
49 | 50 |
51 |
52 | 53 | Close Settings 54 |
55 |
56 | 57 |
58 | 59 |
60 |
61 | 62 | {% include 'inc/footer.html' %} -------------------------------------------------------------------------------- /static/js/sortTable.js: -------------------------------------------------------------------------------- 1 | function sortTable(n) { 2 | var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; 3 | table = document.getElementById("inventoryTable"); 4 | switching = true; 5 | // Set the sorting direction to ascending: 6 | dir = "asc"; 7 | /* Make a loop that will continue until 8 | no switching has been done: */ 9 | while (switching) { 10 | // Start by saying: no switching is done: 11 | switching = false; 12 | rows = table.getElementsByTagName("TR"); 13 | /* Loop through all table rows (except the 14 | first, which contains table headers): */ 15 | for (i = 1; i < (rows.length - 1); i++) { 16 | // Start by saying there should be no switching: 17 | shouldSwitch = false; 18 | /* Get the two elements you want to compare, 19 | one from current row and one from the next: */ 20 | x = rows[i].getElementsByTagName("TD")[n]; 21 | y = rows[i + 1].getElementsByTagName("TD")[n]; 22 | /* Check if the two rows should switch place, 23 | based on the direction, asc or desc: */ 24 | if (dir == "asc") { 25 | if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) { 26 | // If so, mark as a switch and break the loop: 27 | shouldSwitch = true; 28 | break; 29 | } 30 | } else if (dir == "desc") { 31 | if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) { 32 | // If so, mark as a switch and break the loop: 33 | shouldSwitch = true; 34 | break; 35 | } 36 | } 37 | } 38 | if (shouldSwitch) { 39 | /* If a switch has been marked, make the switch 40 | and mark that a switch has been done: */ 41 | rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); 42 | switching = true; 43 | // Each time a switch is done, increase this count by 1: 44 | switchcount ++; 45 | } else { 46 | /* If no switching has been done AND the direction is "asc", 47 | set the direction to "desc" and run the while loop again. */ 48 | if (switchcount == 0 && dir == "asc") { 49 | dir = "desc"; 50 | switching = true; 51 | } 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /sqlSetup.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.16 Distrib 10.1.23-MariaDB, for debian-linux-gnueabihf (armv7l) 2 | -- 3 | -- Host: localhost Database: inventory 4 | -- ------------------------------------------------------ 5 | -- Server version 10.1.23-MariaDB-9+deb9u1 6 | 7 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 8 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 9 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 10 | /*!40101 SET NAMES utf8mb4 */; 11 | /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 12 | /*!40103 SET TIME_ZONE='+00:00' */; 13 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 14 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 15 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 16 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 17 | 18 | -- 19 | -- Table structure for table `items` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `items`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!40101 SET character_set_client = utf8 */; 25 | CREATE TABLE `items` ( 26 | `id` int(11) NOT NULL AUTO_INCREMENT, 27 | `barcode` varchar(20) NOT NULL, 28 | `amount` int(255) NOT NULL, 29 | `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, 30 | `type` int(11) NOT NULL, 31 | PRIMARY KEY (`id`), 32 | UNIQUE KEY `barcode` (`barcode`) 33 | ) ENGINE=InnoDB AUTO_INCREMENT=171 DEFAULT CHARSET=utf8mb4; 34 | /*!40101 SET character_set_client = @saved_cs_client */; 35 | 36 | -- 37 | -- Dumping data for table `items` 38 | -- 39 | 40 | LOCK TABLES `items` WRITE; 41 | /*!40000 ALTER TABLE `items` DISABLE KEYS */; 42 | INSERT INTO `items` VALUES (1,'123456789',2,'Sample Item',1); 43 | /*!40000 ALTER TABLE `items` ENABLE KEYS */; 44 | UNLOCK TABLES; 45 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 46 | 47 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 48 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 49 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 50 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 51 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 52 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 53 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 54 | 55 | -- Dump completed on 2018-12-21 23:32:09 -------------------------------------------------------------------------------- /static/pe-icon-set-food/css/helper.min.css: -------------------------------------------------------------------------------- 1 | /*! Modified from font-awesome helper CSS classes - PIXEDEN 2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (CSS: MIT License) 4 | */.pe-fw,.pe-fw-h,.pe-li{text-align:center}.pe-fw-h,.pe-stack{display:inline-block}.pe-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.pe-stack,.pe-va{vertical-align:middle}.pe-2x{font-size:2em}.pe-3x{font-size:3em}.pe-4x{font-size:4em}.pe-5x{font-size:5em}.pe-fw{width:1.2857142857142858em}.pe-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.pe-ul>li{position:relative}.pe-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em}.pe-li.pe-lg{left:-1.8571428571428572em}.pe-border{padding:.2em .25em .15em;border-radius:.1em;border:.08em solid #eaeaea}.pull-right{float:right}.pull-left{float:left}.pe.pull-left{margin-right:.3em}.pe.pull-right{margin-left:.3em}.pe-spin{-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.pe-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.pe-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.pe-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.pe-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.pe-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}.pe-stack{position:relative;width:2em;height:2em;line-height:2em}.pe-stack-1x,.pe-stack-2x{position:absolute;left:0;width:100%;text-align:center}.pe-stack-1x{line-height:inherit}.pe-stack-2x{font-size:2em}.pe-inverse{color:#fff}.pe-fw-h{width:1.2857142857142858em} -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/header.html' %} 2 | 3 |
4 |
5 |
6 | 9 |
10 |
11 | 12 |
13 | 14 | {% if editMode %} 15 | addAdd 16 | checkDone 17 | {% else %} 18 | addAdd 19 | editEdit 20 | {% endif %} 21 |
22 | 23 |
24 |
25 |
26 | 27 |
28 |
29 |
30 | 38 |
39 | 40 | 41 | 42 |
43 | {% include '/inc/tables/all.html' %} 44 |
45 | 46 |
47 | {% include '/inc/tables/fridge.html' %} 48 |
49 | 50 |
51 | {% include '/inc/tables/freezer.html' %} 52 |
53 | 54 |
55 | {% include '/inc/tables/cupboard.html' %} 56 |
57 | 58 |
59 | {% include '/inc/tables/veg.html' %} 60 |
61 | 62 |
63 | {% include '/inc/tables/fruit.html' %} 64 |
65 | 66 |
67 |
68 | 69 | {% include 'inc/footer.html' %} 70 | -------------------------------------------------------------------------------- /templates/edititem.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/header.html' %} 2 | 3 |
4 |
5 |
6 |
7 |

Edit Item

8 |
9 |
10 | 11 |
12 |
13 |
14 | {% for item in item %} 15 | 16 | {% if config.enablebarcodes == "on" %} 17 |
18 | 19 | 20 |
21 | {% else %} 22 | 23 | {% endif %} 24 | 25 |
26 | 27 | 28 |
29 |
30 |
31 |
32 | 33 | 34 |
35 |
36 | 37 | 68 | 69 | {% endfor %} 70 |
71 |
72 | 73 | Cancel 74 |
75 |
76 |
77 |
78 | 79 | {% include 'inc/footer.html' %} -------------------------------------------------------------------------------- /static/js/jquery.simplePagination.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jquery.simplePagination.js 3 | * @version: v1.0.0 4 | * @author: Sebastian Marulanda http://marulanda.me 5 | * @see: https://github.com/smarulanda/jquery.simplePagination 6 | */ 7 | 8 | (function($) { 9 | 10 | $.fn.simplePagination = function(options) { 11 | 12 | var defaults = { 13 | perPage: 10, 14 | containerClass: 'tablePagination', 15 | previousButtonClass: 'green', 16 | nextButtonClass: 'green', 17 | previousButtonText: 'Previous', 18 | nextButtonText: 'Next', 19 | currentPage: 1 20 | }; 21 | 22 | var settings = $.extend({}, defaults, options); 23 | 24 | return this.each(function() { 25 | var $rows = $('tbody tr', this); 26 | var pages = Math.ceil($rows.length/settings.perPage); 27 | 28 | var container = document.createElement('div'); 29 | var bPrevious = document.createElement('button'); 30 | var bNext = document.createElement('button'); 31 | var of = document.createElement('span'); 32 | 33 | bPrevious.innerHTML = settings.previousButtonText; 34 | bNext.innerHTML = settings.nextButtonText; 35 | 36 | container.className = settings.containerClass; 37 | bPrevious.className = settings.previousButtonClass; 38 | bNext.className = settings.nextButtonClass; 39 | 40 | bPrevious.style.marginRight = '10px'; 41 | bNext.style.marginLeft = '10px'; 42 | container.style.textAlign = "center"; 43 | container.style.marginTop = '20px'; 44 | container.style.marginBottom = '20px'; 45 | 46 | container.appendChild(bPrevious); 47 | container.appendChild(of); 48 | container.appendChild(bNext); 49 | 50 | $(this).after(container); 51 | 52 | update(); 53 | 54 | $(bNext).click(function() { 55 | if (settings.currentPage + 1 > pages) { 56 | settings.currentPage = pages; 57 | } else { 58 | settings.currentPage++; 59 | } 60 | 61 | update(); 62 | }); 63 | 64 | $(bPrevious).click(function() { 65 | if (settings.currentPage - 1 < 1) { 66 | settings.currentPage = 1; 67 | } else { 68 | settings.currentPage--; 69 | } 70 | 71 | update(); 72 | }); 73 | 74 | function update() { 75 | var from = ((settings.currentPage - 1) * settings.perPage) + 1; 76 | var to = from + settings.perPage - 1; 77 | 78 | if (to > $rows.length) { 79 | to = $rows.length; 80 | } 81 | 82 | $rows.hide(); 83 | $rows.slice((from-1), to).show(); 84 | 85 | of.innerHTML = from + ' to ' + to + ' of ' + $rows.length + ' entries'; 86 | 87 | if ($rows.length <= settings.perPage) { 88 | $(container).hide(); 89 | } else { 90 | $(container).show(); 91 | } 92 | } 93 | }); 94 | 95 | } 96 | 97 | }(jQuery)); 98 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kitchen Inventory 2 | 3 | **A stock system for food and such. Currently a work in progress.** 4 | 5 | 6 | ![](https://i.imgur.com/4YBlx2e.png) 7 | 8 | ## Requirements 9 | - MySQL / MariaDB 10 | - Python 3 with... 11 | - Flask, flask-mysql, flask-basicauth, requests, configparser 12 | - Gunicorn (or similar) 13 | 14 | ## Setup 15 | 1. Create a MySQL database and user and grant it full access to said database. 16 | 2. Import the `sqlSetup.sql` file to get it ready for the inventory. 17 | 3. Fill in the DB details in `config.ini`. 18 | 4. If you wish to password protect the site fill in some login details in `config.ini` also: 19 | 20 | 5. You can test the app by setting `active = True` under the `[testMode]` section of the `config.ini` file and then running `python3 inventory.py`. 21 | You can then access the site at http://localhost:5000. 22 | If you are running it on another machine change `127.0.0.1` to `0.0.0.0`. 23 | _(Depending on your setup, you may also need to forward port 5000 if running it from another machine.)_ 24 | 25 | If you are to leave it running then it is recommended to use something like [Gunicorn](https://gunicorn.org/) to serve the files instead. 26 | For example: `gunicorn -b 0.0.0.0:5000 inventory:app --daemon`. 27 | 28 | ## Removing Basic Auth Login 29 | If you don't wish to have an auth login for the site you can remove it as follows: 30 | 1. Remove or comment out the following lines in `inventory.py`: 31 | ``` 32 | app.config['BASIC_AUTH_USERNAME'] = config['basicAuth']['username'] 33 | app.config['BASIC_AUTH_PASSWORD'] = config['basicAuth']['password'] 34 | app.config['BASIC_AUTH_FORCE'] = config['basicAuth']['forceAuth'] 35 | basic_auth = BasicAuth(app) 36 | ``` 37 | as well as all instances of `@basic_auth.required` in the same file. 38 | 39 | ## Settings 40 | There is a settings page accessible from `/settings` or by clicking the settings menu link. 41 | Here you can change the title of the site as well as activate and deactivate a dark mode and disable manual barcode usage. 42 | 43 | _More options will be here as the project develops._ 44 | 45 | --- 46 | 47 | ## Contributions 48 | If you feel you have something to add or make better or whatever feel free to contribute to the project by forking and submitting pull requests. There is also the [development branch](https://github.com/fuzzymannerz/Kitchen-Inventory/tree/development) which contains the latest ideas being worked on. 49 | Don't use it though in production as it's most likely broken. ;) 50 | 51 | ## Credits 52 | This project utilises the following projects and technologies: 53 | - flask - http://flask.pocoo.org/ 54 | - MaterializeCSS - http://materializecss.com/ 55 | - Pixeden Foood Icons - http://themes-pixeden.com/font-demos/the-icons-set/food/ 56 | - jQuery - https://code.jquery.com 57 | - Some other things that I've probably fogotten to list. :( 58 | -------------------------------------------------------------------------------- /templates/nostock.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/header.html' %} 2 | 3 |
4 |
5 |
6 | 9 |
10 |
11 | 12 |
13 | 14 | chevron_leftGo Back 15 | {% if editMode %} 16 | checkDone 17 | {% else %} 18 | editEdit 19 | {% endif %} 20 |
21 |
22 |
23 |
24 | 25 |
26 |
27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | {% for item in items %} 38 | {% if item[2] <= 0 %} 39 | 40 | {% if editMode %} 41 | 45 | {% else %} 46 | 47 | {% endif %} 48 | 49 | {% include 'inc/types.html' %} 50 | 51 | 52 | {% if editMode %} 53 | 60 | 61 | 68 | 69 | 70 | {% else %} 71 | 76 | 77 | 82 | 83 | {% endif %} 84 | 85 | {% endif %} 86 | {% endfor %} 87 | 88 |
ITEMTYPE
42 | {{ item[3] }} 43 | create 44 | {{ item[3] }} create 54 | 55 |
56 | remove 57 |
58 |
59 |
62 | 63 |
64 | add 65 |
66 |
67 |
72 |
73 | remove 74 |
75 |
78 |
79 | add 80 |
81 |
89 |
90 |
91 |
92 | 93 | {% include 'inc/footer.html' %} -------------------------------------------------------------------------------- /static/js/inventory.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | $('select').formSelect(); 3 | $('.tabs').tabs(); 4 | 5 | $("table").simplePagination({}); 6 | 7 | }); 8 | 9 | 10 | function fillFormError(){ 11 | M.toast({html: "Please fill in all the form fields!", classes: 'red'}); 12 | } 13 | 14 | // Add new item form submission 15 | $(function() { 16 | $('#addNewItem').click(function() { 17 | 18 | if ($.trim($("#barcode").val()) === "" || $.trim($("#item_name").val()) === "" || $.trim($("#amount").val()) === "") { 19 | fillFormError(); 20 | return false; 21 | } 22 | 23 | $.ajax({ 24 | url: '/additem', 25 | data: $('form').serialize(), 26 | type: 'POST', 27 | success: function(response) { 28 | $("body").load("/"); 29 | }, 30 | error: function(error) { 31 | $("body").load("/error/" + error); 32 | } 33 | }); 34 | }); 35 | 36 | // Save Settings form submission 37 | $("#settingsNotice").hide(); 38 | 39 | $('#saveSettings').click(function() { 40 | 41 | if ($.trim($("#siteTitle").val()) === "") { 42 | fillFormError(); 43 | return false; 44 | } 45 | 46 | $.ajax({ 47 | url: '/settings/save', 48 | data: $('form').serialize(), 49 | type: 'POST', 50 | success: function(response) { 51 | M.toast({html: "Settings saved successfully!
Reloading page...
", classes: 'green'}) 52 | setTimeout(function(){window.location.reload()},1500); 53 | }, 54 | error: function(error) { 55 | $("body").load("/error/" + error); 56 | } 57 | }); 58 | }); 59 | 60 | // Edit item page form submission 61 | $('#updateItem').click(function() { 62 | 63 | if ($.trim($("#item_name").val()) === "" || $.trim($("#barcode").val()) === "" || $.trim($("#amount").val()) === "") { 64 | fillFormError(); 65 | return false; 66 | } 67 | 68 | $.ajax({ 69 | url: '/updateitem', 70 | data: $('form').serialize(), 71 | type: 'POST', 72 | success: function(response) { 73 | window.location.href = "/"; 74 | }, 75 | error: function(error) { 76 | $("body").load("/error/" + error); 77 | } 78 | }); 79 | }); 80 | }); 81 | 82 | // Table search function 83 | function tableSearch(inputID, tableID) { 84 | // Declare variables 85 | var input, filter, table, tr, td, i; 86 | input = document.getElementById(inputID); 87 | filter = input.value.toUpperCase(); 88 | table = document.getElementById(tableID); 89 | tr = table.getElementsByTagName("tr"); 90 | 91 | // Loop through all table rows, and hide those that don't match the search query 92 | for (i = 0; i < tr.length; i++) { 93 | td = tr[i].getElementsByTagName("td")[0]; 94 | if (td) { 95 | if (td.innerHTML.toUpperCase().indexOf(filter) > -1) { 96 | $(tr[i]).fadeIn('fast'); 97 | //tr[i].style.display = ""; 98 | } else { 99 | $(tr[i]).fadeOut('fast'); 100 | //tr[i].style.display = "none"; 101 | } 102 | } 103 | } 104 | } 105 | /* 106 | // Tooltips 107 | $(document).ready(function(){ 108 | $('.tooltipped').tooltip(); 109 | }); 110 | */ -------------------------------------------------------------------------------- /templates/viewall.html: -------------------------------------------------------------------------------- 1 | {% include 'inc/header.html' %} 2 | 3 |
4 |
5 |
6 | 9 |
10 |
11 | 12 |
13 | 14 | chevron_leftGo Back 15 | {% if editMode %} 16 | checkDone 17 | {% else %} 18 | editEdit 19 | {% endif %} 20 |
21 |
22 |
23 |
24 | 25 |
26 |
27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | {% for item in items %} 39 | {% if item[2] >= 1 %} 40 | 41 | {% if editMode %} 42 | 43 | 44 | 48 | {% else %} 49 | 50 | {% endif %} 51 | 52 | 53 | {% include 'inc/types.html' %} 54 | 55 | {% if editMode %} 56 | 63 | 64 | 71 | 72 | 73 | {% else %} 74 | 79 | 80 | 85 | 86 | {% endif %} 87 | 88 | {% endif %} 89 | {% endfor %} 90 | 91 |
ITEMAMOUNTTYPE
delete_forever 45 | {{ item[3] }} 46 | create 47 | {{ item[3] }} create{{ item[2] }} 57 | 58 |
59 | remove 60 |
61 |
62 |
65 | 66 |
67 | add 68 |
69 |
70 |
75 |
76 | remove 77 |
78 |
81 |
82 | add 83 |
84 |
92 |
93 |
94 |
95 | 96 | {% include 'inc/footer.html' %} -------------------------------------------------------------------------------- /static/pe-icon-set-food/css/helper.css: -------------------------------------------------------------------------------- 1 | /* HELPER CLASS 2 | * -------------------------- */ 3 | /* FA based classes */ 4 | /*! Modified from font-awesome helper CSS classes - PIXEDEN 5 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome 6 | * License - http://fontawesome.io/license (CSS: MIT License) 7 | */ 8 | /* makes the font 33% larger relative to the icon container */ 9 | .pe-lg { 10 | font-size: 1.3333333333333333em; 11 | line-height: 0.75em; 12 | vertical-align: -15%; 13 | } 14 | 15 | .pe-2x { 16 | font-size: 2em; 17 | } 18 | 19 | .pe-3x { 20 | font-size: 3em; 21 | } 22 | 23 | .pe-4x { 24 | font-size: 4em; 25 | } 26 | 27 | .pe-5x { 28 | font-size: 5em; 29 | } 30 | 31 | .pe-fw { 32 | width: 1.2857142857142858em; 33 | text-align: center; 34 | } 35 | 36 | .pe-ul { 37 | padding-left: 0; 38 | margin-left: 2.142857142857143em; 39 | list-style-type: none; 40 | } 41 | 42 | .pe-ul > li { 43 | position: relative; 44 | } 45 | 46 | .pe-li { 47 | position: absolute; 48 | left: -2.142857142857143em; 49 | width: 2.142857142857143em; 50 | top: 0.14285714285714285em; 51 | text-align: center; 52 | } 53 | 54 | .pe-li.pe-lg { 55 | left: -1.8571428571428572em; 56 | } 57 | 58 | .pe-border { 59 | padding: .2em .25em .15em; 60 | border: solid 0.08em #eeeeee; 61 | border-radius: .1em; 62 | } 63 | 64 | .pull-right { 65 | float: right; 66 | } 67 | 68 | .pull-left { 69 | float: left; 70 | } 71 | 72 | .pe.pull-left { 73 | margin-right: .3em; 74 | } 75 | 76 | .pe.pull-right { 77 | margin-left: .3em; 78 | } 79 | 80 | .pe-spin { 81 | -webkit-animation: spin 2s infinite linear; 82 | animation: spin 2s infinite linear; 83 | } 84 | @-webkit-keyframes spin { 85 | 0% { 86 | -webkit-transform: rotate(0deg); 87 | } 88 | 100% { 89 | -webkit-transform: rotate(359deg); 90 | } 91 | } 92 | @keyframes spin { 93 | 0% { 94 | -webkit-transform: rotate(0deg); 95 | transform: rotate(0deg); 96 | } 97 | 100% { 98 | -webkit-transform: rotate(359deg); 99 | transform: rotate(359deg); 100 | } 101 | } 102 | .pe-rotate-90 { 103 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 104 | -webkit-transform: rotate(90deg); 105 | -ms-transform: rotate(90deg); 106 | transform: rotate(90deg); 107 | } 108 | 109 | .pe-rotate-180 { 110 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 111 | -webkit-transform: rotate(180deg); 112 | -ms-transform: rotate(180deg); 113 | transform: rotate(180deg); 114 | } 115 | 116 | .pe-rotate-270 { 117 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 118 | -webkit-transform: rotate(270deg); 119 | -ms-transform: rotate(270deg); 120 | transform: rotate(270deg); 121 | } 122 | 123 | .pe-flip-horizontal { 124 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); 125 | -webkit-transform: scale(-1, 1); 126 | -ms-transform: scale(-1, 1); 127 | transform: scale(-1, 1); 128 | } 129 | 130 | .pe-flip-vertical { 131 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); 132 | -webkit-transform: scale(1, -1); 133 | -ms-transform: scale(1, -1); 134 | transform: scale(1, -1); 135 | } 136 | 137 | .pe-stack { 138 | position: relative; 139 | display: inline-block; 140 | width: 2em; 141 | height: 2em; 142 | line-height: 2em; 143 | vertical-align: middle; 144 | } 145 | 146 | .pe-stack-1x, 147 | .pe-stack-2x { 148 | position: absolute; 149 | left: 0; 150 | width: 100%; 151 | text-align: center; 152 | } 153 | 154 | .pe-stack-1x { 155 | line-height: inherit; 156 | } 157 | 158 | .pe-stack-2x { 159 | font-size: 2em; 160 | } 161 | 162 | .pe-inverse { 163 | color: #ffffff; 164 | } 165 | 166 | /* Custom classes / mods - PIXEDEN */ 167 | .pe-va { 168 | vertical-align: middle; 169 | } 170 | 171 | .pe-border { 172 | border: solid 0.08em #eaeaea; 173 | } 174 | 175 | .pe-fw-h { 176 | width: 1.2857142857142858em; 177 | text-align: center; 178 | display: inline-block; 179 | } 180 | -------------------------------------------------------------------------------- /inventory.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, redirect, request, url_for 2 | from flaskext.mysql import MySQL 3 | from flask_basicauth import BasicAuth 4 | import requests 5 | import configparser 6 | from random import randint 7 | import sys 8 | 9 | # Configuration 10 | app = Flask(__name__) 11 | config = configparser.ConfigParser() 12 | config.read('config.ini') 13 | 14 | version = "0.1" 15 | 16 | # Setup protection 17 | app.config['BASIC_AUTH_USERNAME'] = config['basicAuth']['username'] 18 | app.config['BASIC_AUTH_PASSWORD'] = config['basicAuth']['password'] 19 | app.config['BASIC_AUTH_FORCE'] = config['basicAuth']['forceAuth'] 20 | basic_auth = BasicAuth(app) 21 | 22 | # Set the MySQL configuration 23 | app.config['MYSQL_DATABASE_USER'] = config['mySQL']['username'] 24 | app.config['MYSQL_DATABASE_PASSWORD'] = config['mySQL']['password'] 25 | app.config['MYSQL_DATABASE_DB'] = config['mySQL']['database'] 26 | app.config['MYSQL_DATABASE_HOST'] = config['mySQL']['host'] 27 | mysql = MySQL(app) 28 | mysql.init_app(app) 29 | 30 | 31 | # Set the index page 32 | @app.route('/') 33 | @app.route('/edit/') 34 | @basic_auth.required 35 | def main(editMode = False): 36 | try: 37 | conn = mysql.connect() 38 | cur = conn.cursor() 39 | cur.execute('SELECT * FROM items') 40 | results = cur.fetchall() 41 | 42 | return render_template('index.html', items=results, editMode=editMode, version=version, config=config['siteSettings']) 43 | 44 | except Exception as e: 45 | return redirect('/error/{}'.format(e)) 46 | 47 | # View all from category page 48 | @app.route('/table/') 49 | def makeTable(type): 50 | try: 51 | conn = mysql.connect() 52 | cur = conn.cursor() 53 | cur.execute('SELECT * FROM items WHERE `type`="{}"'.format(type)) 54 | results = cur.fetchall() 55 | 56 | return render_template('/inc/table.html', items=results, config=config['siteSettings']) 57 | 58 | except Exception as e: 59 | return redirect('/error/{}'.format(e)) 60 | 61 | # View items that are no longer in stock 62 | @app.route('/nostock') 63 | @app.route('/nostock/edit/') 64 | def nostock(editMode = False): 65 | try: 66 | conn = mysql.connect() 67 | cur = conn.cursor() 68 | cur.execute('SELECT * FROM items') 69 | results = cur.fetchall() 70 | 71 | return render_template('nostock.html', items=results, editMode=editMode, config=config['siteSettings']) 72 | 73 | except Exception as e: 74 | return redirect('/error/{}'.format(e)) 75 | 76 | # Error Page 77 | @app.route('/error/') 78 | def error(e): 79 | return render_template('error.html', error=e, version=version, config=config['siteSettings']) 80 | 81 | # Edit name page 82 | @app.route('/edititem/') 83 | def edititem(bc): 84 | 85 | try: 86 | conn = mysql.connect() 87 | cur = conn.cursor() 88 | cur.execute('SELECT * FROM items WHERE `barcode`={}'.format(bc)) 89 | results = cur.fetchall() 90 | 91 | return render_template('edititem.html', item=results, config=config['siteSettings']) 92 | 93 | except Exception as e: 94 | return redirect('/error/{}'.format(e)) 95 | 96 | 97 | # Update the product name to something else 98 | @app.route('/updateitem',methods=['POST']) 99 | def updateitem(): 100 | try: 101 | _name = request.form['item_name'] 102 | _barcode = request.form['item_bc'] 103 | _type = request.form['item_type'] 104 | 105 | if _name and _barcode: 106 | conn = mysql.connect() 107 | cur = conn.cursor() 108 | cur.execute('UPDATE `items` SET `name`="{}", `type`="{}" WHERE `barcode`= {}'.format(_name, _type, _barcode)) 109 | conn.commit() 110 | 111 | else: 112 | raise RuntimeError("There was an error with the form") 113 | 114 | return redirect(url_for('main')) 115 | 116 | except Exception as e: 117 | return redirect('/error/{}'.format(e)) 118 | 119 | # Add new item manually 120 | @app.route('/add') 121 | @app.route('/add/') 122 | def add(bc = None): 123 | 124 | if (bc != None): 125 | try: 126 | if checkAmount(bc) <= 0: 127 | conn = mysql.connect() 128 | cur = conn.cursor() 129 | cur.execute('UPDATE `items` SET `amount`=1 WHERE `barcode`= {}'.format(bc)) 130 | conn.commit() 131 | else: 132 | conn = mysql.connect() 133 | cur = conn.cursor() 134 | cur.execute('UPDATE `items` SET `amount`=`amount`+1 WHERE `barcode`= {}'.format(bc)) 135 | conn.commit() 136 | 137 | return redirect('/edit/true') 138 | 139 | except Exception as e: 140 | return redirect('/error/{}'.format(e)) 141 | 142 | else: 143 | return render_template('add.html', config=config['siteSettings']) 144 | 145 | # Generate a barcode for the DB if barcode is disabled or missing on item 146 | def barcodeGenerator(): 147 | try: 148 | 149 | # Set amount of digits in barcode and generate one 150 | digits = 7 151 | range_start = 10 ** (digits - 1) 152 | range_end = (10 ** digits) - 1 153 | bc = randint(range_start, range_end) 154 | 155 | conn = mysql.connect() 156 | cur = conn.cursor() 157 | cur.execute('SELECT * FROM items WHERE `barcode`={}'.format(bc)) 158 | results = cur.fetchall() 159 | 160 | if len(results) == 0: 161 | return bc 162 | 163 | else: 164 | barcodeGenerator() 165 | 166 | except Exception as e: 167 | return redirect('/error/{}'.format(e)) 168 | 169 | # Add to the DB 170 | @app.route('/additem', methods=['POST']) 171 | def addItem(): 172 | try: 173 | 174 | _barcode = request.form['barcode'] 175 | _name = request.form['item_name'] 176 | _amount = request.form['amount'] 177 | _type = request.form['type'] 178 | 179 | # Deal with the barcode 180 | if _barcode == "off": 181 | # If barcodes are disabled, generate a random 7 digit one to keep DB happy 182 | _barcode = barcodeGenerator() 183 | 184 | if _barcode and _name and _amount and _type: 185 | 186 | try: 187 | if config['siteSettings']['enablebarcodes'] == "on": 188 | if sendToOpenFoods(_barcode) != "Unknown Product": 189 | itemName = sendToOpenFoods(_barcode) 190 | else: 191 | itemName = _name 192 | else: 193 | itemName = _name 194 | 195 | conn = mysql.connect() 196 | cur = conn.cursor() 197 | cur.execute('INSERT INTO `items` (`name`, `barcode`, `amount`, `type`) VALUES ("{}", {}, {}, {})'.format(itemName, _barcode, _amount, _type)) 198 | conn.commit() 199 | return redirect(url_for('main')) 200 | 201 | except Exception as e: 202 | return redirect('/error/{}'.format(e)) 203 | 204 | else: 205 | raise RuntimeError("There was an error with the form") 206 | 207 | 208 | except Exception as e: 209 | return redirect('/error/{}'.format(e)) 210 | 211 | 212 | # Remove items manually 213 | @app.route('/remove/') 214 | def remove(bc): 215 | try: 216 | conn = mysql.connect() 217 | cur = conn.cursor() 218 | cur.execute('UPDATE `items` SET `amount`=`amount`-1 WHERE `barcode`= {}'.format(bc)) 219 | conn.commit() 220 | 221 | return redirect('/edit/true') 222 | 223 | except Exception as e: 224 | return redirect('/error/{}'.format(e)) 225 | 226 | # Check amount of items in the inventory DB 227 | def checkAmount(bc): 228 | try: 229 | conn = mysql.connect() 230 | cur = conn.cursor() 231 | cur.execute('SELECT `amount` FROM `items` WHERE `barcode`= {}'.format(bc)) 232 | results = cur.fetchone() 233 | return results[0] 234 | 235 | except Exception as e: 236 | return redirect('/error/{}'.format(e)) 237 | 238 | # Completely delete an item from the DB 239 | @app.route('/delete/') 240 | def deleteItem(bc): 241 | try: 242 | conn = mysql.connect() 243 | cur = conn.cursor() 244 | cur.execute('DELETE FROM `items` WHERE `barcode`= {}'.format(bc)) 245 | conn.commit() 246 | 247 | return redirect('/') 248 | 249 | except Exception as e: 250 | return redirect('/error/{}'.format(e)) 251 | 252 | # Connect to the openfoodfacts.org API 253 | def sendToOpenFoods(bc): 254 | url = "http://world.openfoodfacts.org/api/v0/product/" + bc + ".json" 255 | 256 | try: 257 | r = requests.get(url) 258 | data = r.json() 259 | 260 | # Deal with response 261 | if data['status_verbose'] == "product found": # If the product is in the DB 262 | return (data['product']['product_name'] + " (" + data['product']['quantity'].replace(" ", "") + ")") 263 | else: 264 | return "Unknown Product" 265 | 266 | except Exception as e: 267 | return redirect('/error/{}'.format(e)) 268 | 269 | 270 | # Settings Page 271 | @app.route('/settings') 272 | @basic_auth.required 273 | def settings(): 274 | return render_template('settings.html', version=version, config=config['siteSettings'], saved="false") 275 | 276 | @app.route('/settings/save', methods=['POST']) 277 | @basic_auth.required 278 | def saveSettings(): 279 | try: 280 | _siteTitle = request.form['siteTitle'] 281 | _darkMode = request.form.get("darkMode") 282 | _enableBarcodes = request.form.get("enableBarcodes") 283 | 284 | if _siteTitle: 285 | 286 | try: 287 | # Update the config file 288 | cfg = open("config.ini", 'w') 289 | config.set('siteSettings', 'sitetitle', _siteTitle) 290 | 291 | if _darkMode == None: 292 | config.set('siteSettings', 'darkmode', 'off') 293 | else: 294 | config.set('siteSettings', 'darkmode', 'on') 295 | 296 | if _enableBarcodes == None: 297 | config.set('siteSettings', 'enablebarcodes', 'off') 298 | else: 299 | config.set('siteSettings', 'enablebarcodes', 'on') 300 | 301 | config.write(cfg) 302 | cfg.close() 303 | return "ok" 304 | 305 | except Exception as e: 306 | return redirect('/error/{}'.format(e)) 307 | 308 | else: 309 | raise RuntimeError("There was an error with the form") 310 | 311 | except Exception as e: 312 | return redirect('/error/{}'.format(e)) 313 | 314 | 315 | # Check if test mode 316 | if config['testMode']['active'] == "True": 317 | if __name__ == "__main__": 318 | app.run(host=config['testMode']['host']) -------------------------------------------------------------------------------- /static/pe-icon-set-food/css/pe-icon-set-food.min.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:pe-icon-set-food;src:url(../fonts/pe-icon-set-food.eot?4p3rw6);src:url(../fonts/pe-icon-set-food.eot?4p3rw6#iefix) format("embedded-opentype"),url(../fonts/pe-icon-set-food.ttf?4p3rw6) format("truetype"),url(../fonts/pe-icon-set-food.woff?4p3rw6) format("woff"),url(../fonts/pe-icon-set-food.svg?4p3rw6#pe-icon-set-food) format("svg");font-weight:400;font-style:normal}[class*=" pe-is-f-"],[class^=pe-is-f-]{display:inline-block;font-family:pe-icon-set-food;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pe-is-f-anana-f:before{content:"\e900"}.pe-is-f-anana:before{content:"\e901"}.pe-is-f-apple-1-f:before{content:"\e902"}.pe-is-f-apple-1:before{content:"\e903"}.pe-is-f-apple-2-f:before{content:"\e904"}.pe-is-f-apple-2:before{content:"\e905"}.pe-is-f-balance-f:before{content:"\e906"}.pe-is-f-balance:before{content:"\e907"}.pe-is-f-banana-f:before{content:"\e908"}.pe-is-f-banana:before{content:"\e909"}.pe-is-f-barbecue-1-f:before{content:"\e90a"}.pe-is-f-barbecue-1:before{content:"\e90b"}.pe-is-f-barbecue-2-f:before{content:"\e90c"}.pe-is-f-barbecue-2:before{content:"\e90d"}.pe-is-f-beater-1-f:before{content:"\e90e"}.pe-is-f-beater-1:before{content:"\e90f"}.pe-is-f-beater-2-f:before{content:"\e910"}.pe-is-f-beater-2:before{content:"\e911"}.pe-is-f-beer-bottle-f:before{content:"\e912"}.pe-is-f-beer-bottle:before{content:"\e913"}.pe-is-f-beer-glass-f:before{content:"\e914"}.pe-is-f-beer-glass:before{content:"\e915"}.pe-is-f-birthday-cake-1-f:before{content:"\e916"}.pe-is-f-birthday-cake-1:before{content:"\e917"}.pe-is-f-birthday-cake-2-f:before{content:"\e918"}.pe-is-f-birthday-cake-2:before{content:"\e919"}.pe-is-f-blender-f:before{content:"\e91a"}.pe-is-f-blender:before{content:"\e91b"}.pe-is-f-bottle-f:before{content:"\e91c"}.pe-is-f-bottle:before{content:"\e91d"}.pe-is-f-bread-1-f:before{content:"\e91e"}.pe-is-f-bread-1:before{content:"\e91f"}.pe-is-f-bread-2-f:before{content:"\e920"}.pe-is-f-bread-2:before{content:"\e921"}.pe-is-f-bread-3-f:before{content:"\e922"}.pe-is-f-bread-3:before{content:"\e923"}.pe-is-f-broccoli-f:before{content:"\e924"}.pe-is-f-broccoli:before{content:"\e925"}.pe-is-f-burger-1-f:before{content:"\e926"}.pe-is-f-burger-1:before{content:"\e927"}.pe-is-f-burger-2-f:before{content:"\e928"}.pe-is-f-burger-2:before{content:"\e929"}.pe-is-f-can-1-f:before{content:"\e92a"}.pe-is-f-can-1:before{content:"\e92b"}.pe-is-f-can-2-f:before{content:"\e92c"}.pe-is-f-can-2:before{content:"\e92d"}.pe-is-f-can-3-f:before{content:"\e92e"}.pe-is-f-can-3:before{content:"\e92f"}.pe-is-f-candy-f:before{content:"\e930"}.pe-is-f-candy:before{content:"\e931"}.pe-is-f-carrot-f:before{content:"\e932"}.pe-is-f-carrot:before{content:"\e933"}.pe-is-f-cereals-f:before{content:"\e934"}.pe-is-f-cereals:before{content:"\e935"}.pe-is-f-champagne-glass-1-f:before{content:"\e936"}.pe-is-f-champagne-glass-1:before{content:"\e937"}.pe-is-f-champagne-glass-2-f:before{content:"\e938"}.pe-is-f-champagne-glass-2:before{content:"\e939"}.pe-is-f-cheese-1-f:before{content:"\e93a"}.pe-is-f-cheese-1:before{content:"\e93b"}.pe-is-f-cheese-2:before{content:"\e93c"}.pe-is-f-chef-hat-f:before{content:"\e93d"}.pe-is-f-chef-hat:before{content:"\e93e"}.pe-is-f-cherries-f:before{content:"\e93f"}.pe-is-f-cherries:before{content:"\e940"}.pe-is-f-chicken-1-f:before{content:"\e941"}.pe-is-f-chicken-1:before{content:"\e942"}.pe-is-f-chicken-2-f:before{content:"\e943"}.pe-is-f-chicken-2:before{content:"\e944"}.pe-is-f-chicken-3-f:before{content:"\e945"}.pe-is-f-chicken-3:before{content:"\e946"}.pe-is-f-chili-pepper-f:before{content:"\e947"}.pe-is-f-chili-pepper:before{content:"\e948"}.pe-is-f-chinese-food-52-f:before{content:"\e949"}.pe-is-f-chinese-food-53-f:before{content:"\e94a"}.pe-is-f-chinese-food-53:before{content:"\e94b"}.pe-is-f-chinese-food-54:before{content:"\e94c"}.pe-is-f-chocolate-f:before{content:"\e94d"}.pe-is-f-chocolate:before{content:"\e94e"}.pe-is-f-chopp-f:before{content:"\e94f"}.pe-is-f-chopp:before{content:"\e950"}.pe-is-f-chopping-board-f:before{content:"\e951"}.pe-is-f-chopping-board:before{content:"\e952"}.pe-is-f-cloche-f:before{content:"\e953"}.pe-is-f-cloche-hand-f:before{content:"\e954"}.pe-is-f-cloche-hand:before{content:"\e955"}.pe-is-f-cloche:before{content:"\e956"}.pe-is-f-cocktail-glass-1-f:before{content:"\e957"}.pe-is-f-cocktail-glass-1:before{content:"\e958"}.pe-is-f-cocktail-glass-2-f:before{content:"\e959"}.pe-is-f-cocktail-glass-2:before{content:"\e95a"}.pe-is-f-cocktail-glass-3-f:before{content:"\e95b"}.pe-is-f-cocktail-glass-3:before{content:"\e95c"}.pe-is-f-cocktail-glass-4-f:before{content:"\e95d"}.pe-is-f-cocktail-glass-4:before{content:"\e95e"}.pe-is-f-coffee-bean-f:before{content:"\e95f"}.pe-is-f-coffee-bean:before{content:"\e960"}.pe-is-f-coffee-beans-f:before{content:"\e961"}.pe-is-f-coffee-beans:before{content:"\e962"}.pe-is-f-coffee-maker-1-f:before{content:"\e963"}.pe-is-f-coffee-maker-1:before{content:"\e964"}.pe-is-f-coffee-maker-2-f:before{content:"\e965"}.pe-is-f-coffee-maker-2:before{content:"\e966"}.pe-is-f-coffee-maker-3-f:before{content:"\e967"}.pe-is-f-coffee-maker-3:before{content:"\e968"}.pe-is-f-colander-f:before{content:"\e969"}.pe-is-f-colander:before{content:"\e96a"}.pe-is-f-cork-skrew-f:before{content:"\e96b"}.pe-is-f-cork-skrew:before{content:"\e96c"}.pe-is-f-corn-f:before{content:"\e96d"}.pe-is-f-corn:before{content:"\e96e"}.pe-is-f-croissant-f:before{content:"\e96f"}.pe-is-f-croissant:before{content:"\e970"}.pe-is-f-cup-1-f:before{content:"\e971"}.pe-is-f-cup-1:before{content:"\e972"}.pe-is-f-cup-2-f:before{content:"\e973"}.pe-is-f-cup-2:before{content:"\e974"}.pe-is-f-cup-coffee-f:before{content:"\e975"}.pe-is-f-cup-coffee-hot-1-f:before{content:"\e976"}.pe-is-f-cup-coffee-hot-1:before{content:"\e977"}.pe-is-f-cup-coffee-hot-2-f:before{content:"\e978"}.pe-is-f-cup-coffee-hot-2:before{content:"\e979"}.pe-is-f-cup-coffee:before{content:"\e97a"}.pe-is-f-cup-tea-f:before{content:"\e97b"}.pe-is-f-cup-tea:before{content:"\e97c"}.pe-is-f-cupcake-f:before{content:"\e97d"}.pe-is-f-cupcake:before{content:"\e97e"}.pe-is-f-donut-1-f:before{content:"\e97f"}.pe-is-f-donut-1:before{content:"\e980"}.pe-is-f-donut-2-f:before{content:"\e981"}.pe-is-f-donut-2:before{content:"\e982"}.pe-is-f-egg-1-f:before{content:"\e983"}.pe-is-f-egg-1:before{content:"\e984"}.pe-is-f-egg-2-f:before{content:"\e985"}.pe-is-f-egg-2:before{content:"\e986"}.pe-is-f-egg-3-f:before{content:"\e987"}.pe-is-f-egg-3:before{content:"\e988"}.pe-is-f-eggplant-f:before{content:"\e989"}.pe-is-f-eggplant:before{content:"\e98a"}.pe-is-f-fish-1-f:before{content:"\e98b"}.pe-is-f-fish-1:before{content:"\e98c"}.pe-is-f-fish-2-f:before{content:"\e98d"}.pe-is-f-fish-2:before{content:"\e98e"}.pe-is-f-flatware-1:before{content:"\e98f"}.pe-is-f-flatware-2:before{content:"\e990"}.pe-is-f-flatware-3:before{content:"\e991"}.pe-is-f-flatware-4-f:before{content:"\e992"}.pe-is-f-flatware-4:before{content:"\e993"}.pe-is-f-french-fries-f:before{content:"\e994"}.pe-is-f-french-fries:before{content:"\e995"}.pe-is-f-grapes-f:before{content:"\e996"}.pe-is-f-grapes:before{content:"\e997"}.pe-is-f-grater-f:before{content:"\e998"}.pe-is-f-grater:before{content:"\e999"}.pe-is-f-highball-glass-1-f:before{content:"\e99a"}.pe-is-f-highball-glass-1:before{content:"\e99b"}.pe-is-f-highball-glass-2-f:before{content:"\e99c"}.pe-is-f-highball-glass-2:before{content:"\e99d"}.pe-is-f-highball-glass-3-f:before{content:"\e99e"}.pe-is-f-highball-glass-3:before{content:"\e99f"}.pe-is-f-highball-glass-4-f:before{content:"\e9a0"}.pe-is-f-highball-glass-4:before{content:"\e9a1"}.pe-is-f-hot-dog-f:before{content:"\e9a2"}.pe-is-f-hot-dog:before{content:"\e9a3"}.pe-is-f-ice-cream-1-f:before{content:"\e9a4"}.pe-is-f-ice-cream-1:before{content:"\e9a5"}.pe-is-f-ice-cream-2-f:before{content:"\e9a6"}.pe-is-f-ice-cream-2:before{content:"\e9a7"}.pe-is-f-ice-cream-3-f:before{content:"\e9a8"}.pe-is-f-ice-cream-3:before{content:"\e9a9"}.pe-is-f-ice-cream-4-f:before{content:"\e9aa"}.pe-is-f-ice-cream-4:before{content:"\e9ab"}.pe-is-f-ice-cream-stick-f:before{content:"\e9ac"}.pe-is-f-ice-cream-stick:before{content:"\e9ad"}.pe-is-f-juice-f:before{content:"\e9ae"}.pe-is-f-juice:before{content:"\e9af"}.pe-is-f-kebab-f:before{content:"\e9b0"}.pe-is-f-kebab:before{content:"\e9b1"}.pe-is-f-kettle-1-f:before{content:"\e9b2"}.pe-is-f-kettle-1:before{content:"\e9b3"}.pe-is-f-kettle-2-f:before{content:"\e9b4"}.pe-is-f-kettle-2:before{content:"\e9b5"}.pe-is-f-kettle-3-f:before{content:"\e9b6"}.pe-is-f-kettle-3:before{content:"\e9b7"}.pe-is-f-ladle-f:before{content:"\e9b8"}.pe-is-f-ladle:before{content:"\e9b9"}.pe-is-f-lemon-1-f:before{content:"\e9ba"}.pe-is-f-lemon-1:before{content:"\e9bb"}.pe-is-f-lemon-2-f:before{content:"\e9bc"}.pe-is-f-lemon-2:before{content:"\e9bd"}.pe-is-f-liquor-bottle-1-f:before{content:"\e9be"}.pe-is-f-liquor-bottle-1:before{content:"\e9bf"}.pe-is-f-liquor-bottle-2-f:before{content:"\e9c0"}.pe-is-f-liquor-bottle-2:before{content:"\e9c1"}.pe-is-f-liquor-bottle-3-f:before{content:"\e9c2"}.pe-is-f-liquor-bottle-3:before{content:"\e9c3"}.pe-is-f-lollipop-1-f:before{content:"\e9c4"}.pe-is-f-lollipop-1:before{content:"\e9c5"}.pe-is-f-lollipop-2-f:before{content:"\e9c6"}.pe-is-f-lollipop-2:before{content:"\e9c7"}.pe-is-f-measuring-cup-f:before{content:"\e9c8"}.pe-is-f-measuring-cup:before{content:"\e9c9"}.pe-is-f-meat-f:before{content:"\e9ca"}.pe-is-f-meat-tenderizer-f:before{content:"\e9cb"}.pe-is-f-meat-tenderizer:before{content:"\e9cc"}.pe-is-f-meat:before{content:"\e9cd"}.pe-is-f-microwave-f:before{content:"\e9ce"}.pe-is-f-microwave:before{content:"\e9cf"}.pe-is-f-milk-1-f:before{content:"\e9d0"}.pe-is-f-milk-1:before{content:"\e9d1"}.pe-is-f-milk-2-f:before{content:"\e9d2"}.pe-is-f-milk-2:before{content:"\e9d3"}.pe-is-f-moka-f:before{content:"\e9d4"}.pe-is-f-moka:before{content:"\e9d5"}.pe-is-f-mushroom-1-f:before{content:"\e9d6"}.pe-is-f-mushroom-1:before{content:"\e9d7"}.pe-is-f-mushroom-2-f:before{content:"\e9d8"}.pe-is-f-mushroom-2:before{content:"\e9d9"}.pe-is-f-onion-f:before{content:"\e9da"}.pe-is-f-onion:before{content:"\e9db"}.pe-is-f-orange-1-f:before{content:"\e9dc"}.pe-is-f-orange-1:before{content:"\e9dd"}.pe-is-f-orange-2-f:before{content:"\e9de"}.pe-is-f-orange-2:before{content:"\e9df"}.pe-is-f-oven-1-f:before{content:"\e9e0"}.pe-is-f-oven-1:before{content:"\e9e1"}.pe-is-f-oven-2-f:before{content:"\e9e2"}.pe-is-f-oven-2:before{content:"\e9e3"}.pe-is-f-oven-glove-f:before{content:"\e9e4"}.pe-is-f-oven-glove:before{content:"\e9e5"}.pe-is-f-pan-f:before{content:"\e9e6"}.pe-is-f-pan:before{content:"\e9e7"}.pe-is-f-pear-f:before{content:"\e9e8"}.pe-is-f-pear:before{content:"\e9e9"}.pe-is-f-pepper-f:before{content:"\e9ea"}.pe-is-f-pepper-shaker-f:before{content:"\e9eb"}.pe-is-f-pepper-shaker:before{content:"\e9ec"}.pe-is-f-pepper:before{content:"\e9ed"}.pe-is-f-piece-of-cake-1-f:before{content:"\e9ee"}.pe-is-f-piece-of-cake-1:before{content:"\e9ef"}.pe-is-f-piece-of-cake-2-f:before{content:"\e9f0"}.pe-is-f-piece-of-cake-2:before{content:"\e9f1"}.pe-is-f-pitcher-1-f:before{content:"\e9f2"}.pe-is-f-pitcher-1:before{content:"\e9f3"}.pe-is-f-pitcher-2-f:before{content:"\e9f4"}.pe-is-f-pitcher-2:before{content:"\e9f5"}.pe-is-f-pizza-1-f:before{content:"\e9f6"}.pe-is-f-pizza-1:before{content:"\e9f7"}.pe-is-f-pizza-2-f:before{content:"\e9f8"}.pe-is-f-pizza-2:before{content:"\e9f9"}.pe-is-f-plate-f:before{content:"\e9fa"}.pe-is-f-plate:before{content:"\e9fb"}.pe-is-f-pot-1-f:before{content:"\e9fc"}.pe-is-f-pot-1:before{content:"\e9fd"}.pe-is-f-pot-2-f:before{content:"\e9fe"}.pe-is-f-pot-2:before{content:"\e9ff"}.pe-is-f-potato-f:before{content:"\ea00"}.pe-is-f-potato:before{content:"\ea01"}.pe-is-f-pumpkin-f:before{content:"\ea02"}.pe-is-f-pumpkin:before{content:"\ea03"}.pe-is-f-refrigerator-f:before{content:"\ea04"}.pe-is-f-refrigerator:before{content:"\ea05"}.pe-is-f-rolling-pin-f:before{content:"\ea06"}.pe-is-f-rolling-pin:before{content:"\ea07"}.pe-is-f-salame-f:before{content:"\ea08"}.pe-is-f-salame:before{content:"\ea09"}.pe-is-f-salt-shaker-f:before{content:"\ea0a"}.pe-is-f-salt-shaker:before{content:"\ea0b"}.pe-is-f-sandwich-f:before{content:"\ea0c"}.pe-is-f-sandwich:before{content:"\ea0d"}.pe-is-f-sauce-1-f:before{content:"\ea0e"}.pe-is-f-sauce-1:before{content:"\ea0f"}.pe-is-f-sauce-2-f:before{content:"\ea10"}.pe-is-f-sauce-2:before{content:"\ea11"}.pe-is-f-sausage-1-f:before{content:"\ea12"}.pe-is-f-sausage-1:before{content:"\ea13"}.pe-is-f-sausage-2-f:before{content:"\ea14"}.pe-is-f-sausage-2:before{content:"\ea15"}.pe-is-f-skewer-f:before{content:"\ea16"}.pe-is-f-skewer:before{content:"\ea17"}.pe-is-f-soda-bottle-f:before{content:"\ea18"}.pe-is-f-soda-bottle:before{content:"\ea19"}.pe-is-f-spatula-1-f:before{content:"\ea1a"}.pe-is-f-spatula-1:before{content:"\ea1b"}.pe-is-f-spatula-2-f:before{content:"\ea1c"}.pe-is-f-spatula-2:before{content:"\ea1d"}.pe-is-f-spatula-3-f:before{content:"\ea1e"}.pe-is-f-spatula-3:before{content:"\ea1f"}.pe-is-f-steak-1-f:before{content:"\ea20"}.pe-is-f-steak-1:before{content:"\ea21"}.pe-is-f-steak-2-f:before{content:"\ea22"}.pe-is-f-steak-2:before{content:"\ea23"}.pe-is-f-strawberry-f:before{content:"\ea24"}.pe-is-f-strawberry:before{content:"\ea25"}.pe-is-f-sushi-1-f:before{content:"\ea26"}.pe-is-f-sushi-1:before{content:"\ea27"}.pe-is-f-sushi-2-f:before{content:"\ea28"}.pe-is-f-sushi-2:before{content:"\ea29"}.pe-is-f-sushi-3-f:before{content:"\ea2a"}.pe-is-f-sushi-3:before{content:"\ea2b"}.pe-is-f-sushi-4-f:before{content:"\ea2c"}.pe-is-f-sushi-4:before{content:"\ea2d"}.pe-is-f-thermal-cup-1-f:before{content:"\ea2e"}.pe-is-f-thermal-cup-1:before{content:"\ea2f"}.pe-is-f-thermal-cup-2-f:before{content:"\ea30"}.pe-is-f-thermal-cup-2:before{content:"\ea31"}.pe-is-f-thermal-cup-3-f:before{content:"\ea32"}.pe-is-f-thermal-cup-3:before{content:"\ea33"}.pe-is-f-tomato-f:before{content:"\ea34"}.pe-is-f-tomato:before{content:"\ea35"}.pe-is-f-waffle-f:before{content:"\ea36"}.pe-is-f-waffle:before{content:"\ea37"}.pe-is-f-water-glass-f:before{content:"\ea38"}.pe-is-f-water-glass:before{content:"\ea39"}.pe-is-f-watermelon-f:before{content:"\ea3a"}.pe-is-f-watermelon:before{content:"\ea3b"}.pe-is-f-wheat-f:before{content:"\ea3c"}.pe-is-f-wheat:before{content:"\ea3d"}.pe-is-f-whisk-f:before{content:"\ea3e"}.pe-is-f-whisk:before{content:"\ea3f"}.pe-is-f-whisky-glass-1-f:before{content:"\ea40"}.pe-is-f-whisky-glass-1:before{content:"\ea41"}.pe-is-f-whisky-glass-2-f:before{content:"\ea42"}.pe-is-f-whisky-glass-2:before{content:"\ea43"}.pe-is-f-wine-bottle-1-f:before{content:"\ea44"}.pe-is-f-wine-bottle-1:before{content:"\ea45"}.pe-is-f-wine-bottle-2-f:before{content:"\ea46"}.pe-is-f-wine-bottle-2:before{content:"\ea47"}.pe-is-f-wine-glass-1-f:before{content:"\ea48"}.pe-is-f-wine-glass-1:before{content:"\ea49"}.pe-is-f-wine-glass-2-f:before{content:"\ea4a"}.pe-is-f-wine-glass-2:before{content:"\ea4b"}.pe-is-f-wine-glass-3-f:before{content:"\ea4c"}.pe-is-f-wine-glass-3:before{content:"\ea4d"}.pe-is-f-wine-glass-4-f:before{content:"\ea4e"}.pe-is-f-wine-glass-4:before{content:"\ea4f"} -------------------------------------------------------------------------------- /static/pe-icon-set-food/css/pe-icon-set-food.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'pe-icon-set-food'; 3 | src: url("../fonts/pe-icon-set-food.eot?4p3rw6"); 4 | src: url("../fonts/pe-icon-set-food.eot?4p3rw6#iefix") format("embedded-opentype"), url("../fonts/pe-icon-set-food.ttf?4p3rw6") format("truetype"), url("../fonts/pe-icon-set-food.woff?4p3rw6") format("woff"), url("../fonts/pe-icon-set-food.svg?4p3rw6#pe-icon-set-food") format("svg"); 5 | font-weight: normal; 6 | font-style: normal; 7 | } 8 | [class^="pe-is-f-"], [class*=" pe-is-f-"] { 9 | display: inline-block; 10 | font-family: 'pe-icon-set-food'; 11 | speak: none; 12 | font-style: normal; 13 | font-weight: normal; 14 | font-variant: normal; 15 | text-transform: none; 16 | line-height: 1; 17 | /* Better Font Rendering =========== */ 18 | -webkit-font-smoothing: antialiased; 19 | -moz-osx-font-smoothing: grayscale; 20 | } 21 | 22 | .pe-is-f-anana-f:before { 23 | content: "\e900"; 24 | } 25 | 26 | .pe-is-f-anana:before { 27 | content: "\e901"; 28 | } 29 | 30 | .pe-is-f-apple-1-f:before { 31 | content: "\e902"; 32 | } 33 | 34 | .pe-is-f-apple-1:before { 35 | content: "\e903"; 36 | } 37 | 38 | .pe-is-f-apple-2-f:before { 39 | content: "\e904"; 40 | } 41 | 42 | .pe-is-f-apple-2:before { 43 | content: "\e905"; 44 | } 45 | 46 | .pe-is-f-balance-f:before { 47 | content: "\e906"; 48 | } 49 | 50 | .pe-is-f-balance:before { 51 | content: "\e907"; 52 | } 53 | 54 | .pe-is-f-banana-f:before { 55 | content: "\e908"; 56 | } 57 | 58 | .pe-is-f-banana:before { 59 | content: "\e909"; 60 | } 61 | 62 | .pe-is-f-barbecue-1-f:before { 63 | content: "\e90a"; 64 | } 65 | 66 | .pe-is-f-barbecue-1:before { 67 | content: "\e90b"; 68 | } 69 | 70 | .pe-is-f-barbecue-2-f:before { 71 | content: "\e90c"; 72 | } 73 | 74 | .pe-is-f-barbecue-2:before { 75 | content: "\e90d"; 76 | } 77 | 78 | .pe-is-f-beater-1-f:before { 79 | content: "\e90e"; 80 | } 81 | 82 | .pe-is-f-beater-1:before { 83 | content: "\e90f"; 84 | } 85 | 86 | .pe-is-f-beater-2-f:before { 87 | content: "\e910"; 88 | } 89 | 90 | .pe-is-f-beater-2:before { 91 | content: "\e911"; 92 | } 93 | 94 | .pe-is-f-beer-bottle-f:before { 95 | content: "\e912"; 96 | } 97 | 98 | .pe-is-f-beer-bottle:before { 99 | content: "\e913"; 100 | } 101 | 102 | .pe-is-f-beer-glass-f:before { 103 | content: "\e914"; 104 | } 105 | 106 | .pe-is-f-beer-glass:before { 107 | content: "\e915"; 108 | } 109 | 110 | .pe-is-f-birthday-cake-1-f:before { 111 | content: "\e916"; 112 | } 113 | 114 | .pe-is-f-birthday-cake-1:before { 115 | content: "\e917"; 116 | } 117 | 118 | .pe-is-f-birthday-cake-2-f:before { 119 | content: "\e918"; 120 | } 121 | 122 | .pe-is-f-birthday-cake-2:before { 123 | content: "\e919"; 124 | } 125 | 126 | .pe-is-f-blender-f:before { 127 | content: "\e91a"; 128 | } 129 | 130 | .pe-is-f-blender:before { 131 | content: "\e91b"; 132 | } 133 | 134 | .pe-is-f-bottle-f:before { 135 | content: "\e91c"; 136 | } 137 | 138 | .pe-is-f-bottle:before { 139 | content: "\e91d"; 140 | } 141 | 142 | .pe-is-f-bread-1-f:before { 143 | content: "\e91e"; 144 | } 145 | 146 | .pe-is-f-bread-1:before { 147 | content: "\e91f"; 148 | } 149 | 150 | .pe-is-f-bread-2-f:before { 151 | content: "\e920"; 152 | } 153 | 154 | .pe-is-f-bread-2:before { 155 | content: "\e921"; 156 | } 157 | 158 | .pe-is-f-bread-3-f:before { 159 | content: "\e922"; 160 | } 161 | 162 | .pe-is-f-bread-3:before { 163 | content: "\e923"; 164 | } 165 | 166 | .pe-is-f-broccoli-f:before { 167 | content: "\e924"; 168 | } 169 | 170 | .pe-is-f-broccoli:before { 171 | content: "\e925"; 172 | } 173 | 174 | .pe-is-f-burger-1-f:before { 175 | content: "\e926"; 176 | } 177 | 178 | .pe-is-f-burger-1:before { 179 | content: "\e927"; 180 | } 181 | 182 | .pe-is-f-burger-2-f:before { 183 | content: "\e928"; 184 | } 185 | 186 | .pe-is-f-burger-2:before { 187 | content: "\e929"; 188 | } 189 | 190 | .pe-is-f-can-1-f:before { 191 | content: "\e92a"; 192 | } 193 | 194 | .pe-is-f-can-1:before { 195 | content: "\e92b"; 196 | } 197 | 198 | .pe-is-f-can-2-f:before { 199 | content: "\e92c"; 200 | } 201 | 202 | .pe-is-f-can-2:before { 203 | content: "\e92d"; 204 | } 205 | 206 | .pe-is-f-can-3-f:before { 207 | content: "\e92e"; 208 | } 209 | 210 | .pe-is-f-can-3:before { 211 | content: "\e92f"; 212 | } 213 | 214 | .pe-is-f-candy-f:before { 215 | content: "\e930"; 216 | } 217 | 218 | .pe-is-f-candy:before { 219 | content: "\e931"; 220 | } 221 | 222 | .pe-is-f-carrot-f:before { 223 | content: "\e932"; 224 | } 225 | 226 | .pe-is-f-carrot:before { 227 | content: "\e933"; 228 | } 229 | 230 | .pe-is-f-cereals-f:before { 231 | content: "\e934"; 232 | } 233 | 234 | .pe-is-f-cereals:before { 235 | content: "\e935"; 236 | } 237 | 238 | .pe-is-f-champagne-glass-1-f:before { 239 | content: "\e936"; 240 | } 241 | 242 | .pe-is-f-champagne-glass-1:before { 243 | content: "\e937"; 244 | } 245 | 246 | .pe-is-f-champagne-glass-2-f:before { 247 | content: "\e938"; 248 | } 249 | 250 | .pe-is-f-champagne-glass-2:before { 251 | content: "\e939"; 252 | } 253 | 254 | .pe-is-f-cheese-1-f:before { 255 | content: "\e93a"; 256 | } 257 | 258 | .pe-is-f-cheese-1:before { 259 | content: "\e93b"; 260 | } 261 | 262 | .pe-is-f-cheese-2:before { 263 | content: "\e93c"; 264 | } 265 | 266 | .pe-is-f-chef-hat-f:before { 267 | content: "\e93d"; 268 | } 269 | 270 | .pe-is-f-chef-hat:before { 271 | content: "\e93e"; 272 | } 273 | 274 | .pe-is-f-cherries-f:before { 275 | content: "\e93f"; 276 | } 277 | 278 | .pe-is-f-cherries:before { 279 | content: "\e940"; 280 | } 281 | 282 | .pe-is-f-chicken-1-f:before { 283 | content: "\e941"; 284 | } 285 | 286 | .pe-is-f-chicken-1:before { 287 | content: "\e942"; 288 | } 289 | 290 | .pe-is-f-chicken-2-f:before { 291 | content: "\e943"; 292 | } 293 | 294 | .pe-is-f-chicken-2:before { 295 | content: "\e944"; 296 | } 297 | 298 | .pe-is-f-chicken-3-f:before { 299 | content: "\e945"; 300 | } 301 | 302 | .pe-is-f-chicken-3:before { 303 | content: "\e946"; 304 | } 305 | 306 | .pe-is-f-chili-pepper-f:before { 307 | content: "\e947"; 308 | } 309 | 310 | .pe-is-f-chili-pepper:before { 311 | content: "\e948"; 312 | } 313 | 314 | .pe-is-f-chinese-food-52-f:before { 315 | content: "\e949"; 316 | } 317 | 318 | .pe-is-f-chinese-food-53-f:before { 319 | content: "\e94a"; 320 | } 321 | 322 | .pe-is-f-chinese-food-53:before { 323 | content: "\e94b"; 324 | } 325 | 326 | .pe-is-f-chinese-food-54:before { 327 | content: "\e94c"; 328 | } 329 | 330 | .pe-is-f-chocolate-f:before { 331 | content: "\e94d"; 332 | } 333 | 334 | .pe-is-f-chocolate:before { 335 | content: "\e94e"; 336 | } 337 | 338 | .pe-is-f-chopp-f:before { 339 | content: "\e94f"; 340 | } 341 | 342 | .pe-is-f-chopp:before { 343 | content: "\e950"; 344 | } 345 | 346 | .pe-is-f-chopping-board-f:before { 347 | content: "\e951"; 348 | } 349 | 350 | .pe-is-f-chopping-board:before { 351 | content: "\e952"; 352 | } 353 | 354 | .pe-is-f-cloche-f:before { 355 | content: "\e953"; 356 | } 357 | 358 | .pe-is-f-cloche-hand-f:before { 359 | content: "\e954"; 360 | } 361 | 362 | .pe-is-f-cloche-hand:before { 363 | content: "\e955"; 364 | } 365 | 366 | .pe-is-f-cloche:before { 367 | content: "\e956"; 368 | } 369 | 370 | .pe-is-f-cocktail-glass-1-f:before { 371 | content: "\e957"; 372 | } 373 | 374 | .pe-is-f-cocktail-glass-1:before { 375 | content: "\e958"; 376 | } 377 | 378 | .pe-is-f-cocktail-glass-2-f:before { 379 | content: "\e959"; 380 | } 381 | 382 | .pe-is-f-cocktail-glass-2:before { 383 | content: "\e95a"; 384 | } 385 | 386 | .pe-is-f-cocktail-glass-3-f:before { 387 | content: "\e95b"; 388 | } 389 | 390 | .pe-is-f-cocktail-glass-3:before { 391 | content: "\e95c"; 392 | } 393 | 394 | .pe-is-f-cocktail-glass-4-f:before { 395 | content: "\e95d"; 396 | } 397 | 398 | .pe-is-f-cocktail-glass-4:before { 399 | content: "\e95e"; 400 | } 401 | 402 | .pe-is-f-coffee-bean-f:before { 403 | content: "\e95f"; 404 | } 405 | 406 | .pe-is-f-coffee-bean:before { 407 | content: "\e960"; 408 | } 409 | 410 | .pe-is-f-coffee-beans-f:before { 411 | content: "\e961"; 412 | } 413 | 414 | .pe-is-f-coffee-beans:before { 415 | content: "\e962"; 416 | } 417 | 418 | .pe-is-f-coffee-maker-1-f:before { 419 | content: "\e963"; 420 | } 421 | 422 | .pe-is-f-coffee-maker-1:before { 423 | content: "\e964"; 424 | } 425 | 426 | .pe-is-f-coffee-maker-2-f:before { 427 | content: "\e965"; 428 | } 429 | 430 | .pe-is-f-coffee-maker-2:before { 431 | content: "\e966"; 432 | } 433 | 434 | .pe-is-f-coffee-maker-3-f:before { 435 | content: "\e967"; 436 | } 437 | 438 | .pe-is-f-coffee-maker-3:before { 439 | content: "\e968"; 440 | } 441 | 442 | .pe-is-f-colander-f:before { 443 | content: "\e969"; 444 | } 445 | 446 | .pe-is-f-colander:before { 447 | content: "\e96a"; 448 | } 449 | 450 | .pe-is-f-cork-skrew-f:before { 451 | content: "\e96b"; 452 | } 453 | 454 | .pe-is-f-cork-skrew:before { 455 | content: "\e96c"; 456 | } 457 | 458 | .pe-is-f-corn-f:before { 459 | content: "\e96d"; 460 | } 461 | 462 | .pe-is-f-corn:before { 463 | content: "\e96e"; 464 | } 465 | 466 | .pe-is-f-croissant-f:before { 467 | content: "\e96f"; 468 | } 469 | 470 | .pe-is-f-croissant:before { 471 | content: "\e970"; 472 | } 473 | 474 | .pe-is-f-cup-1-f:before { 475 | content: "\e971"; 476 | } 477 | 478 | .pe-is-f-cup-1:before { 479 | content: "\e972"; 480 | } 481 | 482 | .pe-is-f-cup-2-f:before { 483 | content: "\e973"; 484 | } 485 | 486 | .pe-is-f-cup-2:before { 487 | content: "\e974"; 488 | } 489 | 490 | .pe-is-f-cup-coffee-f:before { 491 | content: "\e975"; 492 | } 493 | 494 | .pe-is-f-cup-coffee-hot-1-f:before { 495 | content: "\e976"; 496 | } 497 | 498 | .pe-is-f-cup-coffee-hot-1:before { 499 | content: "\e977"; 500 | } 501 | 502 | .pe-is-f-cup-coffee-hot-2-f:before { 503 | content: "\e978"; 504 | } 505 | 506 | .pe-is-f-cup-coffee-hot-2:before { 507 | content: "\e979"; 508 | } 509 | 510 | .pe-is-f-cup-coffee:before { 511 | content: "\e97a"; 512 | } 513 | 514 | .pe-is-f-cup-tea-f:before { 515 | content: "\e97b"; 516 | } 517 | 518 | .pe-is-f-cup-tea:before { 519 | content: "\e97c"; 520 | } 521 | 522 | .pe-is-f-cupcake-f:before { 523 | content: "\e97d"; 524 | } 525 | 526 | .pe-is-f-cupcake:before { 527 | content: "\e97e"; 528 | } 529 | 530 | .pe-is-f-donut-1-f:before { 531 | content: "\e97f"; 532 | } 533 | 534 | .pe-is-f-donut-1:before { 535 | content: "\e980"; 536 | } 537 | 538 | .pe-is-f-donut-2-f:before { 539 | content: "\e981"; 540 | } 541 | 542 | .pe-is-f-donut-2:before { 543 | content: "\e982"; 544 | } 545 | 546 | .pe-is-f-egg-1-f:before { 547 | content: "\e983"; 548 | } 549 | 550 | .pe-is-f-egg-1:before { 551 | content: "\e984"; 552 | } 553 | 554 | .pe-is-f-egg-2-f:before { 555 | content: "\e985"; 556 | } 557 | 558 | .pe-is-f-egg-2:before { 559 | content: "\e986"; 560 | } 561 | 562 | .pe-is-f-egg-3-f:before { 563 | content: "\e987"; 564 | } 565 | 566 | .pe-is-f-egg-3:before { 567 | content: "\e988"; 568 | } 569 | 570 | .pe-is-f-eggplant-f:before { 571 | content: "\e989"; 572 | } 573 | 574 | .pe-is-f-eggplant:before { 575 | content: "\e98a"; 576 | } 577 | 578 | .pe-is-f-fish-1-f:before { 579 | content: "\e98b"; 580 | } 581 | 582 | .pe-is-f-fish-1:before { 583 | content: "\e98c"; 584 | } 585 | 586 | .pe-is-f-fish-2-f:before { 587 | content: "\e98d"; 588 | } 589 | 590 | .pe-is-f-fish-2:before { 591 | content: "\e98e"; 592 | } 593 | 594 | .pe-is-f-flatware-1:before { 595 | content: "\e98f"; 596 | } 597 | 598 | .pe-is-f-flatware-2:before { 599 | content: "\e990"; 600 | } 601 | 602 | .pe-is-f-flatware-3:before { 603 | content: "\e991"; 604 | } 605 | 606 | .pe-is-f-flatware-4-f:before { 607 | content: "\e992"; 608 | } 609 | 610 | .pe-is-f-flatware-4:before { 611 | content: "\e993"; 612 | } 613 | 614 | .pe-is-f-french-fries-f:before { 615 | content: "\e994"; 616 | } 617 | 618 | .pe-is-f-french-fries:before { 619 | content: "\e995"; 620 | } 621 | 622 | .pe-is-f-grapes-f:before { 623 | content: "\e996"; 624 | } 625 | 626 | .pe-is-f-grapes:before { 627 | content: "\e997"; 628 | } 629 | 630 | .pe-is-f-grater-f:before { 631 | content: "\e998"; 632 | } 633 | 634 | .pe-is-f-grater:before { 635 | content: "\e999"; 636 | } 637 | 638 | .pe-is-f-highball-glass-1-f:before { 639 | content: "\e99a"; 640 | } 641 | 642 | .pe-is-f-highball-glass-1:before { 643 | content: "\e99b"; 644 | } 645 | 646 | .pe-is-f-highball-glass-2-f:before { 647 | content: "\e99c"; 648 | } 649 | 650 | .pe-is-f-highball-glass-2:before { 651 | content: "\e99d"; 652 | } 653 | 654 | .pe-is-f-highball-glass-3-f:before { 655 | content: "\e99e"; 656 | } 657 | 658 | .pe-is-f-highball-glass-3:before { 659 | content: "\e99f"; 660 | } 661 | 662 | .pe-is-f-highball-glass-4-f:before { 663 | content: "\e9a0"; 664 | } 665 | 666 | .pe-is-f-highball-glass-4:before { 667 | content: "\e9a1"; 668 | } 669 | 670 | .pe-is-f-hot-dog-f:before { 671 | content: "\e9a2"; 672 | } 673 | 674 | .pe-is-f-hot-dog:before { 675 | content: "\e9a3"; 676 | } 677 | 678 | .pe-is-f-ice-cream-1-f:before { 679 | content: "\e9a4"; 680 | } 681 | 682 | .pe-is-f-ice-cream-1:before { 683 | content: "\e9a5"; 684 | } 685 | 686 | .pe-is-f-ice-cream-2-f:before { 687 | content: "\e9a6"; 688 | } 689 | 690 | .pe-is-f-ice-cream-2:before { 691 | content: "\e9a7"; 692 | } 693 | 694 | .pe-is-f-ice-cream-3-f:before { 695 | content: "\e9a8"; 696 | } 697 | 698 | .pe-is-f-ice-cream-3:before { 699 | content: "\e9a9"; 700 | } 701 | 702 | .pe-is-f-ice-cream-4-f:before { 703 | content: "\e9aa"; 704 | } 705 | 706 | .pe-is-f-ice-cream-4:before { 707 | content: "\e9ab"; 708 | } 709 | 710 | .pe-is-f-ice-cream-stick-f:before { 711 | content: "\e9ac"; 712 | } 713 | 714 | .pe-is-f-ice-cream-stick:before { 715 | content: "\e9ad"; 716 | } 717 | 718 | .pe-is-f-juice-f:before { 719 | content: "\e9ae"; 720 | } 721 | 722 | .pe-is-f-juice:before { 723 | content: "\e9af"; 724 | } 725 | 726 | .pe-is-f-kebab-f:before { 727 | content: "\e9b0"; 728 | } 729 | 730 | .pe-is-f-kebab:before { 731 | content: "\e9b1"; 732 | } 733 | 734 | .pe-is-f-kettle-1-f:before { 735 | content: "\e9b2"; 736 | } 737 | 738 | .pe-is-f-kettle-1:before { 739 | content: "\e9b3"; 740 | } 741 | 742 | .pe-is-f-kettle-2-f:before { 743 | content: "\e9b4"; 744 | } 745 | 746 | .pe-is-f-kettle-2:before { 747 | content: "\e9b5"; 748 | } 749 | 750 | .pe-is-f-kettle-3-f:before { 751 | content: "\e9b6"; 752 | } 753 | 754 | .pe-is-f-kettle-3:before { 755 | content: "\e9b7"; 756 | } 757 | 758 | .pe-is-f-ladle-f:before { 759 | content: "\e9b8"; 760 | } 761 | 762 | .pe-is-f-ladle:before { 763 | content: "\e9b9"; 764 | } 765 | 766 | .pe-is-f-lemon-1-f:before { 767 | content: "\e9ba"; 768 | } 769 | 770 | .pe-is-f-lemon-1:before { 771 | content: "\e9bb"; 772 | } 773 | 774 | .pe-is-f-lemon-2-f:before { 775 | content: "\e9bc"; 776 | } 777 | 778 | .pe-is-f-lemon-2:before { 779 | content: "\e9bd"; 780 | } 781 | 782 | .pe-is-f-liquor-bottle-1-f:before { 783 | content: "\e9be"; 784 | } 785 | 786 | .pe-is-f-liquor-bottle-1:before { 787 | content: "\e9bf"; 788 | } 789 | 790 | .pe-is-f-liquor-bottle-2-f:before { 791 | content: "\e9c0"; 792 | } 793 | 794 | .pe-is-f-liquor-bottle-2:before { 795 | content: "\e9c1"; 796 | } 797 | 798 | .pe-is-f-liquor-bottle-3-f:before { 799 | content: "\e9c2"; 800 | } 801 | 802 | .pe-is-f-liquor-bottle-3:before { 803 | content: "\e9c3"; 804 | } 805 | 806 | .pe-is-f-lollipop-1-f:before { 807 | content: "\e9c4"; 808 | } 809 | 810 | .pe-is-f-lollipop-1:before { 811 | content: "\e9c5"; 812 | } 813 | 814 | .pe-is-f-lollipop-2-f:before { 815 | content: "\e9c6"; 816 | } 817 | 818 | .pe-is-f-lollipop-2:before { 819 | content: "\e9c7"; 820 | } 821 | 822 | .pe-is-f-measuring-cup-f:before { 823 | content: "\e9c8"; 824 | } 825 | 826 | .pe-is-f-measuring-cup:before { 827 | content: "\e9c9"; 828 | } 829 | 830 | .pe-is-f-meat-f:before { 831 | content: "\e9ca"; 832 | } 833 | 834 | .pe-is-f-meat-tenderizer-f:before { 835 | content: "\e9cb"; 836 | } 837 | 838 | .pe-is-f-meat-tenderizer:before { 839 | content: "\e9cc"; 840 | } 841 | 842 | .pe-is-f-meat:before { 843 | content: "\e9cd"; 844 | } 845 | 846 | .pe-is-f-microwave-f:before { 847 | content: "\e9ce"; 848 | } 849 | 850 | .pe-is-f-microwave:before { 851 | content: "\e9cf"; 852 | } 853 | 854 | .pe-is-f-milk-1-f:before { 855 | content: "\e9d0"; 856 | } 857 | 858 | .pe-is-f-milk-1:before { 859 | content: "\e9d1"; 860 | } 861 | 862 | .pe-is-f-milk-2-f:before { 863 | content: "\e9d2"; 864 | } 865 | 866 | .pe-is-f-milk-2:before { 867 | content: "\e9d3"; 868 | } 869 | 870 | .pe-is-f-moka-f:before { 871 | content: "\e9d4"; 872 | } 873 | 874 | .pe-is-f-moka:before { 875 | content: "\e9d5"; 876 | } 877 | 878 | .pe-is-f-mushroom-1-f:before { 879 | content: "\e9d6"; 880 | } 881 | 882 | .pe-is-f-mushroom-1:before { 883 | content: "\e9d7"; 884 | } 885 | 886 | .pe-is-f-mushroom-2-f:before { 887 | content: "\e9d8"; 888 | } 889 | 890 | .pe-is-f-mushroom-2:before { 891 | content: "\e9d9"; 892 | } 893 | 894 | .pe-is-f-onion-f:before { 895 | content: "\e9da"; 896 | } 897 | 898 | .pe-is-f-onion:before { 899 | content: "\e9db"; 900 | } 901 | 902 | .pe-is-f-orange-1-f:before { 903 | content: "\e9dc"; 904 | } 905 | 906 | .pe-is-f-orange-1:before { 907 | content: "\e9dd"; 908 | } 909 | 910 | .pe-is-f-orange-2-f:before { 911 | content: "\e9de"; 912 | } 913 | 914 | .pe-is-f-orange-2:before { 915 | content: "\e9df"; 916 | } 917 | 918 | .pe-is-f-oven-1-f:before { 919 | content: "\e9e0"; 920 | } 921 | 922 | .pe-is-f-oven-1:before { 923 | content: "\e9e1"; 924 | } 925 | 926 | .pe-is-f-oven-2-f:before { 927 | content: "\e9e2"; 928 | } 929 | 930 | .pe-is-f-oven-2:before { 931 | content: "\e9e3"; 932 | } 933 | 934 | .pe-is-f-oven-glove-f:before { 935 | content: "\e9e4"; 936 | } 937 | 938 | .pe-is-f-oven-glove:before { 939 | content: "\e9e5"; 940 | } 941 | 942 | .pe-is-f-pan-f:before { 943 | content: "\e9e6"; 944 | } 945 | 946 | .pe-is-f-pan:before { 947 | content: "\e9e7"; 948 | } 949 | 950 | .pe-is-f-pear-f:before { 951 | content: "\e9e8"; 952 | } 953 | 954 | .pe-is-f-pear:before { 955 | content: "\e9e9"; 956 | } 957 | 958 | .pe-is-f-pepper-f:before { 959 | content: "\e9ea"; 960 | } 961 | 962 | .pe-is-f-pepper-shaker-f:before { 963 | content: "\e9eb"; 964 | } 965 | 966 | .pe-is-f-pepper-shaker:before { 967 | content: "\e9ec"; 968 | } 969 | 970 | .pe-is-f-pepper:before { 971 | content: "\e9ed"; 972 | } 973 | 974 | .pe-is-f-piece-of-cake-1-f:before { 975 | content: "\e9ee"; 976 | } 977 | 978 | .pe-is-f-piece-of-cake-1:before { 979 | content: "\e9ef"; 980 | } 981 | 982 | .pe-is-f-piece-of-cake-2-f:before { 983 | content: "\e9f0"; 984 | } 985 | 986 | .pe-is-f-piece-of-cake-2:before { 987 | content: "\e9f1"; 988 | } 989 | 990 | .pe-is-f-pitcher-1-f:before { 991 | content: "\e9f2"; 992 | } 993 | 994 | .pe-is-f-pitcher-1:before { 995 | content: "\e9f3"; 996 | } 997 | 998 | .pe-is-f-pitcher-2-f:before { 999 | content: "\e9f4"; 1000 | } 1001 | 1002 | .pe-is-f-pitcher-2:before { 1003 | content: "\e9f5"; 1004 | } 1005 | 1006 | .pe-is-f-pizza-1-f:before { 1007 | content: "\e9f6"; 1008 | } 1009 | 1010 | .pe-is-f-pizza-1:before { 1011 | content: "\e9f7"; 1012 | } 1013 | 1014 | .pe-is-f-pizza-2-f:before { 1015 | content: "\e9f8"; 1016 | } 1017 | 1018 | .pe-is-f-pizza-2:before { 1019 | content: "\e9f9"; 1020 | } 1021 | 1022 | .pe-is-f-plate-f:before { 1023 | content: "\e9fa"; 1024 | } 1025 | 1026 | .pe-is-f-plate:before { 1027 | content: "\e9fb"; 1028 | } 1029 | 1030 | .pe-is-f-pot-1-f:before { 1031 | content: "\e9fc"; 1032 | } 1033 | 1034 | .pe-is-f-pot-1:before { 1035 | content: "\e9fd"; 1036 | } 1037 | 1038 | .pe-is-f-pot-2-f:before { 1039 | content: "\e9fe"; 1040 | } 1041 | 1042 | .pe-is-f-pot-2:before { 1043 | content: "\e9ff"; 1044 | } 1045 | 1046 | .pe-is-f-potato-f:before { 1047 | content: "\ea00"; 1048 | } 1049 | 1050 | .pe-is-f-potato:before { 1051 | content: "\ea01"; 1052 | } 1053 | 1054 | .pe-is-f-pumpkin-f:before { 1055 | content: "\ea02"; 1056 | } 1057 | 1058 | .pe-is-f-pumpkin:before { 1059 | content: "\ea03"; 1060 | } 1061 | 1062 | .pe-is-f-refrigerator-f:before { 1063 | content: "\ea04"; 1064 | } 1065 | 1066 | .pe-is-f-refrigerator:before { 1067 | content: "\ea05"; 1068 | } 1069 | 1070 | .pe-is-f-rolling-pin-f:before { 1071 | content: "\ea06"; 1072 | } 1073 | 1074 | .pe-is-f-rolling-pin:before { 1075 | content: "\ea07"; 1076 | } 1077 | 1078 | .pe-is-f-salame-f:before { 1079 | content: "\ea08"; 1080 | } 1081 | 1082 | .pe-is-f-salame:before { 1083 | content: "\ea09"; 1084 | } 1085 | 1086 | .pe-is-f-salt-shaker-f:before { 1087 | content: "\ea0a"; 1088 | } 1089 | 1090 | .pe-is-f-salt-shaker:before { 1091 | content: "\ea0b"; 1092 | } 1093 | 1094 | .pe-is-f-sandwich-f:before { 1095 | content: "\ea0c"; 1096 | } 1097 | 1098 | .pe-is-f-sandwich:before { 1099 | content: "\ea0d"; 1100 | } 1101 | 1102 | .pe-is-f-sauce-1-f:before { 1103 | content: "\ea0e"; 1104 | } 1105 | 1106 | .pe-is-f-sauce-1:before { 1107 | content: "\ea0f"; 1108 | } 1109 | 1110 | .pe-is-f-sauce-2-f:before { 1111 | content: "\ea10"; 1112 | } 1113 | 1114 | .pe-is-f-sauce-2:before { 1115 | content: "\ea11"; 1116 | } 1117 | 1118 | .pe-is-f-sausage-1-f:before { 1119 | content: "\ea12"; 1120 | } 1121 | 1122 | .pe-is-f-sausage-1:before { 1123 | content: "\ea13"; 1124 | } 1125 | 1126 | .pe-is-f-sausage-2-f:before { 1127 | content: "\ea14"; 1128 | } 1129 | 1130 | .pe-is-f-sausage-2:before { 1131 | content: "\ea15"; 1132 | } 1133 | 1134 | .pe-is-f-skewer-f:before { 1135 | content: "\ea16"; 1136 | } 1137 | 1138 | .pe-is-f-skewer:before { 1139 | content: "\ea17"; 1140 | } 1141 | 1142 | .pe-is-f-soda-bottle-f:before { 1143 | content: "\ea18"; 1144 | } 1145 | 1146 | .pe-is-f-soda-bottle:before { 1147 | content: "\ea19"; 1148 | } 1149 | 1150 | .pe-is-f-spatula-1-f:before { 1151 | content: "\ea1a"; 1152 | } 1153 | 1154 | .pe-is-f-spatula-1:before { 1155 | content: "\ea1b"; 1156 | } 1157 | 1158 | .pe-is-f-spatula-2-f:before { 1159 | content: "\ea1c"; 1160 | } 1161 | 1162 | .pe-is-f-spatula-2:before { 1163 | content: "\ea1d"; 1164 | } 1165 | 1166 | .pe-is-f-spatula-3-f:before { 1167 | content: "\ea1e"; 1168 | } 1169 | 1170 | .pe-is-f-spatula-3:before { 1171 | content: "\ea1f"; 1172 | } 1173 | 1174 | .pe-is-f-steak-1-f:before { 1175 | content: "\ea20"; 1176 | } 1177 | 1178 | .pe-is-f-steak-1:before { 1179 | content: "\ea21"; 1180 | } 1181 | 1182 | .pe-is-f-steak-2-f:before { 1183 | content: "\ea22"; 1184 | } 1185 | 1186 | .pe-is-f-steak-2:before { 1187 | content: "\ea23"; 1188 | } 1189 | 1190 | .pe-is-f-strawberry-f:before { 1191 | content: "\ea24"; 1192 | } 1193 | 1194 | .pe-is-f-strawberry:before { 1195 | content: "\ea25"; 1196 | } 1197 | 1198 | .pe-is-f-sushi-1-f:before { 1199 | content: "\ea26"; 1200 | } 1201 | 1202 | .pe-is-f-sushi-1:before { 1203 | content: "\ea27"; 1204 | } 1205 | 1206 | .pe-is-f-sushi-2-f:before { 1207 | content: "\ea28"; 1208 | } 1209 | 1210 | .pe-is-f-sushi-2:before { 1211 | content: "\ea29"; 1212 | } 1213 | 1214 | .pe-is-f-sushi-3-f:before { 1215 | content: "\ea2a"; 1216 | } 1217 | 1218 | .pe-is-f-sushi-3:before { 1219 | content: "\ea2b"; 1220 | } 1221 | 1222 | .pe-is-f-sushi-4-f:before { 1223 | content: "\ea2c"; 1224 | } 1225 | 1226 | .pe-is-f-sushi-4:before { 1227 | content: "\ea2d"; 1228 | } 1229 | 1230 | .pe-is-f-thermal-cup-1-f:before { 1231 | content: "\ea2e"; 1232 | } 1233 | 1234 | .pe-is-f-thermal-cup-1:before { 1235 | content: "\ea2f"; 1236 | } 1237 | 1238 | .pe-is-f-thermal-cup-2-f:before { 1239 | content: "\ea30"; 1240 | } 1241 | 1242 | .pe-is-f-thermal-cup-2:before { 1243 | content: "\ea31"; 1244 | } 1245 | 1246 | .pe-is-f-thermal-cup-3-f:before { 1247 | content: "\ea32"; 1248 | } 1249 | 1250 | .pe-is-f-thermal-cup-3:before { 1251 | content: "\ea33"; 1252 | } 1253 | 1254 | .pe-is-f-tomato-f:before { 1255 | content: "\ea34"; 1256 | } 1257 | 1258 | .pe-is-f-tomato:before { 1259 | content: "\ea35"; 1260 | } 1261 | 1262 | .pe-is-f-waffle-f:before { 1263 | content: "\ea36"; 1264 | } 1265 | 1266 | .pe-is-f-waffle:before { 1267 | content: "\ea37"; 1268 | } 1269 | 1270 | .pe-is-f-water-glass-f:before { 1271 | content: "\ea38"; 1272 | } 1273 | 1274 | .pe-is-f-water-glass:before { 1275 | content: "\ea39"; 1276 | } 1277 | 1278 | .pe-is-f-watermelon-f:before { 1279 | content: "\ea3a"; 1280 | } 1281 | 1282 | .pe-is-f-watermelon:before { 1283 | content: "\ea3b"; 1284 | } 1285 | 1286 | .pe-is-f-wheat-f:before { 1287 | content: "\ea3c"; 1288 | } 1289 | 1290 | .pe-is-f-wheat:before { 1291 | content: "\ea3d"; 1292 | } 1293 | 1294 | .pe-is-f-whisk-f:before { 1295 | content: "\ea3e"; 1296 | } 1297 | 1298 | .pe-is-f-whisk:before { 1299 | content: "\ea3f"; 1300 | } 1301 | 1302 | .pe-is-f-whisky-glass-1-f:before { 1303 | content: "\ea40"; 1304 | } 1305 | 1306 | .pe-is-f-whisky-glass-1:before { 1307 | content: "\ea41"; 1308 | } 1309 | 1310 | .pe-is-f-whisky-glass-2-f:before { 1311 | content: "\ea42"; 1312 | } 1313 | 1314 | .pe-is-f-whisky-glass-2:before { 1315 | content: "\ea43"; 1316 | } 1317 | 1318 | .pe-is-f-wine-bottle-1-f:before { 1319 | content: "\ea44"; 1320 | } 1321 | 1322 | .pe-is-f-wine-bottle-1:before { 1323 | content: "\ea45"; 1324 | } 1325 | 1326 | .pe-is-f-wine-bottle-2-f:before { 1327 | content: "\ea46"; 1328 | } 1329 | 1330 | .pe-is-f-wine-bottle-2:before { 1331 | content: "\ea47"; 1332 | } 1333 | 1334 | .pe-is-f-wine-glass-1-f:before { 1335 | content: "\ea48"; 1336 | } 1337 | 1338 | .pe-is-f-wine-glass-1:before { 1339 | content: "\ea49"; 1340 | } 1341 | 1342 | .pe-is-f-wine-glass-2-f:before { 1343 | content: "\ea4a"; 1344 | } 1345 | 1346 | .pe-is-f-wine-glass-2:before { 1347 | content: "\ea4b"; 1348 | } 1349 | 1350 | .pe-is-f-wine-glass-3-f:before { 1351 | content: "\ea4c"; 1352 | } 1353 | 1354 | .pe-is-f-wine-glass-3:before { 1355 | content: "\ea4d"; 1356 | } 1357 | 1358 | .pe-is-f-wine-glass-4-f:before { 1359 | content: "\ea4e"; 1360 | } 1361 | 1362 | .pe-is-f-wine-glass-4:before { 1363 | content: "\ea4f"; 1364 | } 1365 | --------------------------------------------------------------------------------