Simple app to add configuration options to a Django project.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

travis integration

+149 -99
+2
Pipfile
··· 13 13 [packages] 14 14 six = ">=1.0" 15 15 Django = ">=1.9" 16 + pytest-django = "*" 17 + pytest-cov = "*" 16 18 17 19 [requires] 18 20 python_version = "3.6"
+147 -15
Pipfile.lock
··· 1 1 { 2 2 "_meta": { 3 3 "hash": { 4 - "sha256": "536ddd1e652ce4388b976a93d120103b6e4ae256c2354287a07206683e7673d4" 4 + "sha256": "ed617244375439dc5027b8cffbe1b070f8a4bccc16219155fe873e2c48ce9770" 5 5 }, 6 6 "pipfile-spec": 6, 7 7 "requires": { ··· 16 16 ] 17 17 }, 18 18 "default": { 19 + "atomicwrites": { 20 + "hashes": [ 21 + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", 22 + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" 23 + ], 24 + "version": "==1.3.0" 25 + }, 26 + "attrs": { 27 + "hashes": [ 28 + "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", 29 + "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" 30 + ], 31 + "version": "==19.1.0" 32 + }, 33 + "coverage": { 34 + "hashes": [ 35 + "sha256:08907593569fe59baca0bf152c43f3863201efb6113ecb38ce7e97ce339805a6", 36 + "sha256:0be0f1ed45fc0c185cfd4ecc19a1d6532d72f86a2bac9de7e24541febad72650", 37 + "sha256:141f08ed3c4b1847015e2cd62ec06d35e67a3ac185c26f7635f4406b90afa9c5", 38 + "sha256:19e4df788a0581238e9390c85a7a09af39c7b539b29f25c89209e6c3e371270d", 39 + "sha256:23cc09ed395b03424d1ae30dcc292615c1372bfba7141eb85e11e50efaa6b351", 40 + "sha256:245388cda02af78276b479f299bbf3783ef0a6a6273037d7c60dc73b8d8d7755", 41 + "sha256:331cb5115673a20fb131dadd22f5bcaf7677ef758741312bee4937d71a14b2ef", 42 + "sha256:386e2e4090f0bc5df274e720105c342263423e77ee8826002dcffe0c9533dbca", 43 + "sha256:3a794ce50daee01c74a494919d5ebdc23d58873747fa0e288318728533a3e1ca", 44 + "sha256:60851187677b24c6085248f0a0b9b98d49cba7ecc7ec60ba6b9d2e5574ac1ee9", 45 + "sha256:63a9a5fc43b58735f65ed63d2cf43508f462dc49857da70b8980ad78d41d52fc", 46 + "sha256:6b62544bb68106e3f00b21c8930e83e584fdca005d4fffd29bb39fb3ffa03cb5", 47 + "sha256:6ba744056423ef8d450cf627289166da65903885272055fb4b5e113137cfa14f", 48 + "sha256:7494b0b0274c5072bddbfd5b4a6c6f18fbbe1ab1d22a41e99cd2d00c8f96ecfe", 49 + "sha256:826f32b9547c8091679ff292a82aca9c7b9650f9fda3e2ca6bf2ac905b7ce888", 50 + "sha256:93715dffbcd0678057f947f496484e906bf9509f5c1c38fc9ba3922893cda5f5", 51 + "sha256:9a334d6c83dfeadae576b4d633a71620d40d1c379129d587faa42ee3e2a85cce", 52 + "sha256:af7ed8a8aa6957aac47b4268631fa1df984643f07ef00acd374e456364b373f5", 53 + "sha256:bf0a7aed7f5521c7ca67febd57db473af4762b9622254291fbcbb8cd0ba5e33e", 54 + "sha256:bf1ef9eb901113a9805287e090452c05547578eaab1b62e4ad456fcc049a9b7e", 55 + "sha256:c0afd27bc0e307a1ffc04ca5ec010a290e49e3afbe841c5cafc5c5a80ecd81c9", 56 + "sha256:dd579709a87092c6dbee09d1b7cfa81831040705ffa12a1b248935274aee0437", 57 + "sha256:df6712284b2e44a065097846488f66840445eb987eb81b3cc6e4149e7b6982e1", 58 + "sha256:e07d9f1a23e9e93ab5c62902833bf3e4b1f65502927379148b6622686223125c", 59 + "sha256:e2ede7c1d45e65e209d6093b762e98e8318ddeff95317d07a27a2140b80cfd24", 60 + "sha256:e4ef9c164eb55123c62411f5936b5c2e521b12356037b6e1c2617cef45523d47", 61 + "sha256:eca2b7343524e7ba246cab8ff00cab47a2d6d54ada3b02772e908a45675722e2", 62 + "sha256:eee64c616adeff7db37cc37da4180a3a5b6177f5c46b187894e633f088fb5b28", 63 + "sha256:ef824cad1f980d27f26166f86856efe11eff9912c4fed97d3804820d43fa550c", 64 + "sha256:efc89291bd5a08855829a3c522df16d856455297cf35ae827a37edac45f466a7", 65 + "sha256:fa964bae817babece5aa2e8c1af841bebb6d0b9add8e637548809d040443fee0", 66 + "sha256:ff37757e068ae606659c28c3bd0d923f9d29a85de79bf25b2b34b148473b5025" 67 + ], 68 + "version": "==4.5.4" 69 + }, 19 70 "django": { 20 71 "hashes": [ 21 - "sha256:4d23f61b26892bac785f07401bc38cbf8fa4cec993f400e9cd9ddf28fd51c0ea", 22 - "sha256:6e974d4b57e3b29e4882b244d40171d6a75202ab8d2402b8e8adbd182e25cf0c" 72 + "sha256:16a5d54411599780ac9dfe3b9b38f90f785c51259a584e0b24b6f14a7f69aae8", 73 + "sha256:9a2f98211ab474c710fcdad29c82f30fc14ce9917c7a70c3682162a624de4035" 23 74 ], 24 75 "index": "pypi", 25 - "version": "==2.2.3" 76 + "version": "==2.2.4" 77 + }, 78 + "importlib-metadata": { 79 + "hashes": [ 80 + "sha256:23d3d873e008a513952355379d93cbcab874c58f4f034ff657c7a87422fa64e8", 81 + "sha256:80d2de76188eabfbfcf27e6a37342c2827801e59c4cc14b0371c56fed43820e3" 82 + ], 83 + "version": "==0.19" 84 + }, 85 + "more-itertools": { 86 + "hashes": [ 87 + "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", 88 + "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" 89 + ], 90 + "version": "==7.2.0" 91 + }, 92 + "packaging": { 93 + "hashes": [ 94 + "sha256:a7ac867b97fdc07ee80a8058fe4435ccd274ecc3b0ed61d852d7d53055528cf9", 95 + "sha256:c491ca87294da7cc01902edbe30a5bc6c4c28172b5138ab4e4aa1b9d7bfaeafe" 96 + ], 97 + "version": "==19.1" 98 + }, 99 + "pluggy": { 100 + "hashes": [ 101 + "sha256:0825a152ac059776623854c1543d65a4ad408eb3d33ee114dff91e57ec6ae6fc", 102 + "sha256:b9817417e95936bf75d85d3f8767f7df6cdde751fc40aed3bb3074cbcb77757c" 103 + ], 104 + "version": "==0.12.0" 105 + }, 106 + "py": { 107 + "hashes": [ 108 + "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", 109 + "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" 110 + ], 111 + "version": "==1.8.0" 112 + }, 113 + "pyparsing": { 114 + "hashes": [ 115 + "sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80", 116 + "sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4" 117 + ], 118 + "version": "==2.4.2" 119 + }, 120 + "pytest": { 121 + "hashes": [ 122 + "sha256:6ef6d06de77ce2961156013e9dff62f1b2688aa04d0dc244299fe7d67e09370d", 123 + "sha256:a736fed91c12681a7b34617c8fcefe39ea04599ca72c608751c31d89579a3f77" 124 + ], 125 + "version": "==5.0.1" 126 + }, 127 + "pytest-cov": { 128 + "hashes": [ 129 + "sha256:2b097cde81a302e1047331b48cadacf23577e431b61e9c6f49a1170bbe3d3da6", 130 + "sha256:e00ea4fdde970725482f1f35630d12f074e121a23801aabf2ae154ec6bdd343a" 131 + ], 132 + "index": "pypi", 133 + "version": "==2.7.1" 134 + }, 135 + "pytest-django": { 136 + "hashes": [ 137 + "sha256:264fb4c506db5d48a6364c311a0b00b7b48a52715bad8839b2d8bee9b99ed6bb", 138 + "sha256:4adfe5fb3ed47f0ba55506dd3daf688b1f74d5e69148c10ad2dd2f79f40c0d62" 139 + ], 140 + "index": "pypi", 141 + "version": "==3.5.1" 26 142 }, 27 143 "pytz": { 28 144 "hashes": [ 29 - "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", 30 - "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141" 145 + "sha256:26c0b32e437e54a18161324a2fca3c4b9846b74a8dccddd843113109e1116b32", 146 + "sha256:c894d57500a4cd2d5c71114aaab77dbab5eabd9022308ce5ac9bb93a60a6f0c7" 31 147 ], 32 - "version": "==2019.1" 148 + "version": "==2019.2" 33 149 }, 34 150 "six": { 35 151 "hashes": [ ··· 45 161 "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873" 46 162 ], 47 163 "version": "==0.3.0" 164 + }, 165 + "wcwidth": { 166 + "hashes": [ 167 + "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", 168 + "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" 169 + ], 170 + "version": "==0.1.7" 171 + }, 172 + "zipp": { 173 + "hashes": [ 174 + "sha256:4970c3758f4e89a7857a973b1e2a5d75bcdc47794442f2e2dd4fe8e0466e809a", 175 + "sha256:8a5712cfd3bb4248015eb3b0b3c54a5f6ee3f2425963ef2a0125b8bc40aafaec" 176 + ], 177 + "version": "==0.5.2" 48 178 } 49 179 }, 50 180 "develop": { ··· 78 208 }, 79 209 "djangorestframework": { 80 210 "hashes": [ 81 - "sha256:1ca4a5599a5ec31f3d6238a687fcc1dd4c41b1d90edab9ad398fcbf87872b7ba", 82 - "sha256:c3c5edfdbc5dd33f9121bb84305bfd603d2c791f20cff9782772f44a7684a4e4" 211 + "sha256:42979bd5441bb4d8fd69d0f385024a114c3cae7df0f110600b718751250f6929", 212 + "sha256:aedb48010ebfab9651aaab1df5fd3b4848eb4182afc909852a2110c24f89a359" 83 213 ], 84 - "version": "==3.10.1" 214 + "version": "==3.10.2" 85 215 }, 86 216 "docutils": { 87 217 "hashes": [ 88 - "sha256:f33ddb723332c6d6b6d99731ee1fc0c35eb4044a2df5cca1c64c8aa78eaf22cb" 218 + "sha256:6c4f696463b79f1fb8ba0c594b63840ebd41f059e92b31957c46b74a4599b6d0", 219 + "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827", 220 + "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99" 89 221 ], 90 - "version": "==0.15.1.post1" 222 + "version": "==0.15.2" 91 223 }, 92 224 "factory-boy": { 93 225 "hashes": [ ··· 170 302 }, 171 303 "tqdm": { 172 304 "hashes": [ 173 - "sha256:14a285392c32b6f8222ecfbcd217838f88e11630affe9006cd0e94c7eff3cb61", 174 - "sha256:25d4c0ea02a305a688e7e9c2cdc8f862f989ef2a4701ab28ee963295f5b109ab" 305 + "sha256:1dc82f87a8726602fa7177a091b5e8691d6523138a8f7acd08e58088f51e389f", 306 + "sha256:47220a4f2aeebbc74b0ab317584264ea44c745e1fd5ff316b675cd0aff8afad8" 175 307 ], 176 - "version": "==4.32.2" 308 + "version": "==4.33.0" 177 309 }, 178 310 "twine": { 179 311 "hashes": [
-84
tests/tests.py
··· 1 - from django.test import override_settings, TestCase 2 - from django.contrib.auth.models import User 3 - from rest_framework.test import APITestCase 4 - from rest_framework import status 5 - 6 - from tests.test_settings import TEST_SETTINGS 7 - from tests.factories import UserFactory, UserOptionFactory, OptionFactory 8 - from options import INT, FLOAT, STRING 9 - from options.models import Option, UserOption 10 - 11 - 12 - @override_settings(**TEST_SETTINGS) 13 - class OptionTests(TestCase): 14 - def test_default_options(self): 15 - value = Option.objects.get_value("default_option", default="ohter") 16 - self.assertEqual("default", value) 17 - 18 - def test_int_conversion_options(self): 19 - name = "int_option" 20 - option = OptionFactory(name=name, value="42", type=INT) 21 - value = Option.objects.get_value(name) 22 - self.assertIsInstance(value, int) 23 - self.assertEqual(42, value) 24 - 25 - def test_str_conversion_options(self): 26 - name = "string_option" 27 - option = OptionFactory(name=name, value="42") 28 - value = Option.objects.get_value(name) 29 - self.assertIsInstance(value, str) 30 - self.assertEqual("42", value) 31 - 32 - def test_float_conversion_options(self): 33 - name = "string_option" 34 - option = OptionFactory(name=name, value="42.5", type=FLOAT) 35 - value = Option.objects.get_value(name) 36 - self.assertIsInstance(value, float) 37 - self.assertAlmostEqual(42.5, value) 38 - 39 - 40 - @override_settings(**TEST_SETTINGS) 41 - class UserOptionTests(TestCase): 42 - def test_custom_user_options(self): 43 - user = UserFactory() 44 - name = "default_option" 45 - expected_value = "user default" 46 - UserOption.objects.create( 47 - name=name, public_name=name, value=expected_value, type=STRING, user=user 48 - ) 49 - value = UserOption.objects.get_value(name, user=user, default="ohter") 50 - self.assertEqual(expected_value, value) 51 - 52 - 53 - @override_settings(**TEST_SETTINGS) 54 - class OptionAPITests(APITestCase): 55 - def test_list_options(self): 56 - admin = UserFactory(is_staff=True) 57 - self.client.force_authenticate(admin) 58 - response = self.client.get("/api/options/", format="json") 59 - self.assertEqual(response.status_code, status.HTTP_200_OK) 60 - data = response.json() 61 - self.assertEqual(1, len(data)) 62 - 63 - def test_list_user_options(self): 64 - user = UserFactory() 65 - name = "default_option" 66 - expected_value = "user default" 67 - UserOptionFactory(name=name, value=expected_value, user=user) 68 - self.client.force_authenticate(user) 69 - response = self.client.get("/api/user-options/", format="json") 70 - self.assertEqual(response.status_code, status.HTTP_200_OK) 71 - data = response.json() 72 - self.assertEqual(1, len(data)) 73 - 74 - def test_list_user_options_with_exclude(self): 75 - user = UserFactory() 76 - name = "default_option" 77 - expected_value = "user default" 78 - UserOptionFactory(name="secret_option", value="secret", user=user) 79 - UserOptionFactory(name=name, value=expected_value, user=user) 80 - self.client.force_authenticate(user) 81 - response = self.client.get("/api/user-options/", format="json") 82 - self.assertEqual(response.status_code, status.HTTP_200_OK) 83 - data = response.json() 84 - self.assertEqual(1, len(data))