Ejemplo n.º 1
0
    def test_image_resize_success(
        self,
        mock_default_category: Category,
        INITIAL_SIZE: Tuple[int, int],
        FILE_EXTENTION: str,
    ):
        """
        Test that the resizeImage function works as expected
        when saving a Category object
        """

        mock_default_category.image = f"dummy_image_base_name.{FILE_EXTENTION}"
        create_dummy_png_image(
            mock_default_category.image.name, IMAGE_SIZE=INITIAL_SIZE
        )

        check_image_attributes(
            mock_default_category.image,
            size_check=INITIAL_SIZE,
            ext_check=f".{FILE_EXTENTION}",
        )

        mock_default_category.save()

        check_image_attributes(
            mock_default_category.image,
            size_check=BaseModelMixin.CROP_SIZE,
            ext_check=".jpg",
        )

        shutil.rmtree(Path(MEDIA_URL))
Ejemplo n.º 2
0
def import_categories():
    res = csv_load_file(
        os.path.dirname(os.path.abspath(__file__)) + "/categories.csv")
    #print res

    parent_categories = dict()

    for r in res:
        if r[1] == '':
            continue
        level = int(r[1])

        cat = Category.objects.filter(pk=r[0])
        if cat.count() == 0:
            print cat
            item = Category()
            item.id = r[0]
            item.name = r[2]

            if level == 1:
                print item

                item = Category.add_root(name=r[2], id=r[0])
                parent_categories[level] = item
            else:
                item = parent_categories[level - 1].add_child(name=r[2],
                                                              id=r[0])
                parent_categories[level] = item
        else:
            parent_categories[level] = cat[0]
Ejemplo n.º 3
0
def import_categories():
    res = csv_load_file(os.path.dirname(os.path.abspath (__file__)) + "/categories.csv")
    #print res

    parent_categories = dict()

    for r in res:
        if r[1] == '':
            continue
        level = int(r[1])

        cat = Category.objects.filter(pk=r[0])
        if cat.count() == 0:
            print cat
            item = Category()
            item.id = r[0]
            item.name = r[2]

            if level == 1:
                print item

                item = Category.add_root(name=r[2], id=r[0])
                parent_categories[level] = item
            else:
                item = parent_categories[level-1].add_child(name=r[2], id=r[0])
                parent_categories[level] = item
        else:
            parent_categories[level] = cat[0]
Ejemplo n.º 4
0
    def setUp(self):
###### create Users #######
        users = ['UserA', 'UserB', 'UserC', 'UserD']
        for i in range(4):
            newUser = AUser(password='', last_login=timezone.now(), is_superuser=True, username=users[i], first_name='Firstname', last_name='Lastname', email='*****@*****.**', is_staff=True, is_active=True, date_joined=timezone.now())
            newUser.save()
            testDBModel.testUsers.append(newUser)
            testDBModel.testUsersID.append(newUser.pk)
######  add Category ######
        category1 = Category(name="hats")
        testDBModel.testCategory.append(category1)
        category1.save()


######   add product ######
        addProducts = ["ProductA", "ProductB", "ProductC", "ProductD"]
        for i in range(4):  # # add products
            newOne = Product(category=category1, name=addProducts[i], brand='brand', url='url', photo='photo', price=1.0, description='')
            newOne.save()
            testDBModel.testProducts.append(newOne)

##### ## add comments   ######
        for i in range(4):
            newOne = Comment(product=testDBModel.testProducts[i], owner=testDBModel.testUsers[i], content="null", time = timezone.now())
            newOne.save()
            testDBModel.testComments.append(newOne)

# add to wishlist first
        for i in range(4):
            newOne = WishList(product=testDBModel.testProducts[i], owner=testDBModel.testUsers[i])
            newOne.save()
Ejemplo n.º 5
0
    def feed_data_to_database(self):

        recipes = self.get_matching_recipes()
        for recipe in recipes:

            recipe_obj = Recipe(title=recipe[10],
                                date_published=recipe[2],
                                rating=recipe[8])
            recipe_obj.save()

            for category_name in recipe[1]:
                category = None
                try:
                    category = Category.objects.get(name=category_name)
                except:
                    category = Category(name=category_name)
                    category.save()
                rc = RecipeCategory(recipe=recipe_obj, category=category)
                rc.save()

            for id, direction_item in enumerate(recipe[4]):
                direction = Direction(content=direction_item,
                                      recipe=recipe_obj,
                                      order=(id + 1))
                direction.save()

            for detailed_ingredient in recipe[6]:
                ingr = Ingredient.objects.get(name=detailed_ingredient[0])
                dg = DetailedIngredient(recipe=recipe_obj,
                                        name=detailed_ingredient[1],
                                        ingredient=ingr)
                dg.save()
Ejemplo n.º 6
0
    def handle(self, *args, **options):
        print('Loading category')
        Category.objects.all().delete()
        Journal.objects.all().delete()

        names = [
            'ЖЕНСКИЕ', 'МУЖСКИЕ', 'ДЕТСКИЕ', 'ДОМ И СЕМЬЯ', 'АВТО', 'СПОРТ',
            'РЕЛИГИЯ', 'ОБЩЕСТВО', 'ПОЛИТИКА', 'БИЗНЕС', 'ФИНАНСЫ',
            'НАУЧНО-ПОПУЛЯРНЫЕ'
        ]
        for name in names:
            c = Category()
            c.name = name
            c.save()
            print('Saving %s' % name)

            journal_list = [
                'Наука и техника', 'Здоровье', 'Моделист-конструктор', 'Лиза',
                'Прибой', 'Забой', 'Внуки и правнуки', 'В мире муравья',
                'Крышка стола', 'Восемь'
            ]
            cnt = 0
            for jname in journal_list:
                cnt += 1
                j = Journal()
                j.name = jname
                j.save()
                j.category.add(c)
                path = os.path.join(settings.BASE_DIR, 'init_data', 'journal',
                                    f'{cnt}.jpg')
                with open(path, 'rb') as doc_file:
                    j.default_cover.save(f'{cnt}.jpeg',
                                         File(doc_file),
                                         save=True)

                for ni in range(1, 20):
                    name = f'выпуск {ni}'
                    i = Issue()
                    i.name = name
                    i.journal = j
                    i.save()

                    for pi in range(1, 10):
                        p = IssuePage()
                        p.paper = i
                        p.page = pi
                        p.save()
                        path = os.path.join(settings.BASE_DIR, 'init_data',
                                            'journal', f'{pi}.jpg')
                        with open(path, 'rb') as doc_file:
                            p.file_low.save(f'{pi}.jpeg',
                                            File(doc_file),
                                            save=True)
                            p.file_middle.save(f'{pi}.jpeg',
                                               File(doc_file),
                                               save=True)
                            p.file_high.save(f'{pi}.jpeg',
                                             File(doc_file),
                                             save=True)
Ejemplo n.º 7
0
def save_mock_category(monkeypatch, category: Category) -> None:
    """
    Mock the resizeImage() function to prevent the need of creating and 
    processing dummy images when saving Category objects.
    """
    mock_resize_image = Mock(return_value=category.image)
    monkeypatch.setattr(Category, "resizeImage", mock_resize_image)
    category.save()
    mock_resize_image.assert_called_once_with(category.image)
Ejemplo n.º 8
0
    def test_image_resize_called(
        self, monkeypatch, mock_default_category: Category
    ):
        """
        Ensures the resizeImage function is called when saving a category
        """
        mock_resize_image = Mock(return_value=mock_default_category.image)
        monkeypatch.setattr(Category, "resizeImage", mock_resize_image)

        mock_default_category.save()

        mock_resize_image.assert_called_once_with(mock_default_category.image)
Ejemplo n.º 9
0
    def create_category(self, categoryName):
        #TODO: Occupation?
        parent = Category(name=categoryName, occupation=categoryName)
        parent.save()

        subcategoryList = subcategories[categoryName]
        for subcategoryName in subcategoryList:
            child = Category(name=subcategoryName,
                             occupation=subcategoryName,
                             parent=parent)
            child.save()
            parent.children.add(child)

        parent.save()
Ejemplo n.º 10
0
 def test_metadb_build(self):
     test_cat = Category(name='Test')
     test_cat2 = Category(name='Test Posts')
     db.session.add(test_cat)
     db.session.add(test_cat2)
     db.session.commit()
     test_post = Post(title='One', path='',
                      date=datetime.datetime.now(),
                      categories=[test_cat, test_cat2])
     test_post2 = Post(title='Two', path='',
                       date=datetime.datetime.now(),
                       categories=[test_cat])
     db.session.add(test_post)
     db.session.add(test_post2)
     db.session.commit()
Ejemplo n.º 11
0
 def test_category_list_class_property(
     self, load_default_categories: List[Category]
 ):
     """
     Tests __category_list contains a list of saved categories
     """
     assert Category.get_category_list() == load_default_categories
Ejemplo n.º 12
0
 def test_model_return_category(self):
     response = Category.get_category()
     self.assertNotIsInstance(response, str)
     try:
         for res in response:
             pass
     except:
         self.fail('Response should be iterable')
Ejemplo n.º 13
0
    def test_image_resize_failed(
        self,
        mock_default_category: Category,
        FILE_EXTENTION: str,
        EXCEPTION: Exception,
    ):
        """
        Test the expected Exception is raised when an invalid file format is submitted.
        Clean up created test images
        """

        mock_default_category.image = f"dummy_image_base_name.{FILE_EXTENTION}"
        create_dummy_file(mock_default_category.image.name)

        with pytest.raises(EXCEPTION):
            mock_default_category.save()

        shutil.rmtree(Path(MEDIA_URL))
Ejemplo n.º 14
0
 def handle(self, *args, **options):
     fixture = options['fixture']
     if path.exists(fixture):
         root_el = etree.parse(fixture).getroot()
         self.cleanup()
         root_record = Category.add_root(title='Каталог')
         root_record = Category.objects.get(pk=root_record.pk)
         iter_tree(root_el, root_record, add_book)
     else:
         raise CommandError('Fixture file %s does not exist' % fixture)
Ejemplo n.º 15
0
def get_category():
    c1 = {'10': '手机', '11': '手机配件', '12': '数码相机', '13': '相机', '14': '平板'}
    c2 = {'20': '运动服', '21': '运动鞋', '22': '健身用品', '23': '骑行装备'}
    c0 = {'1': c1, '2': c2}
    c_root = {'1': '手机数码', '2': '运动户外', '3': '衣服', '4': '计算机', '5': '零食', '6': '珠宝首饰', '7': '家电办公',
              '8': '护肤彩妆'}
    print c0
    cMerge = dict(c1, **c2)
    cc = Category(category=c0, root_category=c_root)
    return cc, cMerge
Ejemplo n.º 16
0
def userpanel(request):
    if request.user.is_authenticated:
        user = request.user

        if 'addNewCategoryButton' in request.POST:
            newCategory = request.POST.get('addcategory', '')
            if newCategory != "":
                if not Category.objects.filter(
                        nameOfCategory=newCategory).exists():
                    categoryNewModel = Category(nameOfCategory=newCategory)
                    categoryNewModel.save()
        elif 'deleteCategoryButton' in request.POST:
            newCategory = request.POST.get('addcategory', '')
            if newCategory != "":
                Category.objects.filter(nameOfCategory=newCategory).delete()
        elif 'newUserNameButton' in request.POST:
            newUserName = request.POST.get('newUserName', '')
            if newUserName != "":
                saveNewUserName = User.objects.get(id=user.pk)
                saveNewUserName.username = newUserName
                saveNewUserName.save()
        elif 'newNameButton' in request.POST:
            newName = request.POST.get('newName', '')
            if newName != "":
                saveNewUserName = User.objects.get(id=user.pk)
                saveNewUserName.first_name = newName
                saveNewUserName.save()
        elif 'newUserSurnameButton' in request.POST:
            newUserSurname = request.POST.get('newUserSurname', '')
            if newUserSurname != "":
                saveNewUserName = User.objects.get(id=user.pk)
                saveNewUserName.last_name = newUserSurname
                saveNewUserName.save()
        elif 'changePasswordButton' in request.POST:
            changePassword = request.POST.get('changePassword', '')
            if changePassword != "":
                saveNewPassword = User.objects.get(id=user.pk)
                saveNewPassword.set_password(changePassword)
                saveNewPassword.save()
        return render(request, "main/userpanel.html", {'user': user})
    else:
        return redirect('/home/')
Ejemplo n.º 17
0
 def test_category_json_cast(self, mock_default_category: Category):
     """
     Test category .json() method
     """
     expected_dict = {
         "category_name": mock_default_category.category_name,
         "summary": mock_default_category.summary,
         "image": mock_default_category.image,
         "category_slug": mock_default_category.category_slug,
     }
     assert mock_default_category.to_json() == expected_dict
Ejemplo n.º 18
0
 def each_article(self, category, url_list):
     main = Category(name=category)
     main.save()
     for link in url_list:
         soup = self.soup(link)
         div = soup.find("div", {"class": "bdaia-post-content"})
         p_list = div.find_all("p")
         description = []
         for p in p_list:
             description.append(p.get_text())
         self.article.append(u''.join(description).encode('utf-8'))
     full = zip(self.title_list, self.href_list, self.description,
                self.article)
     for i in full:
         item = News(item_title=i[0],
                     item_link=i[1],
                     item_short_descr=i[2],
                     article=i[3],
                     category=main)
         item.save()
         i = []
Ejemplo n.º 19
0
    def get(self, request):

        categories = Category.get_all_categories()
        categoryID = request.GET.get('category')

        if categoryID:
            products = Product.get_all_products_by_category_id(categoryID)
        else:
            products = Product.get_all_products()

        data = {'products': products, 'categories': categories}
        return render(request, 'index.html', data)
Ejemplo n.º 20
0
    def test_send_notification_is_called_on_save(
        self,
        monkeypatch,
        mock_default_category: Category,
        mock_email_host_user: str,
    ):
        """
        Ensures the send_email_notification_to_users function is called when saving a category
        """

        mock_resize_image = Mock(return_value=mock_default_category.image)
        monkeypatch.setattr(Category, "resizeImage", mock_resize_image)

        mock_send_email_notification = Mock()
        monkeypatch.setattr(
            Category,
            "send_email_notification_to_users",
            mock_send_email_notification,
        )

        mock_default_category.save()

        mock_send_email_notification.assert_called_once()
Ejemplo n.º 21
0
    def handle(self, *args, **options):
        faker = Faker()
        file = "book genres.txt"
        for _ in range(300):
            Author(name=faker.name(), email=faker.email()).save()

        with open(file, "r") as file:
            for line in file:
                Category(title=line).save()

        for i in range(1000):
            author = Author.objects.order_by("?").last()
            category = Category.objects.order_by("?").last()
            Book(title=f"Title {i}", author=author, category=category).save()
Ejemplo n.º 22
0
    def handle(self, *args, **options):
        fake = Faker()
        for _ in range(10):
            Author(name=fake.name(),
                   email=fake.email(),
                   age=random.randint(1, 100)).save()

        categories = ['Adventure', 'Detective', 'Mystery']
        for category in categories:
            Category(name=category).save()

        for i in range(20):
            author = Author.objects.order_by('?').last()
            category = Category.objects.order_by('?').first()
            Book(title=f'Title {i}', author=author, category=category).save()
Ejemplo n.º 23
0
def add_category(request):
    if not request.user.is_superuser and Category.objects.filter(
            author=request.user).exists():
        return render(request, 'main/category_already_exists.html')
    if request.method == 'POST':
        category = Category(author=request.user)
        form = CategoryForm(request.POST, request.FILES, instance=category)
        if form.is_valid():
            form.save(commit=True)
            return redirect('index')

    else:
        form = CategoryForm()

    return render(request, 'main/add_category.html', {'form': form})
    def setUp(self):
###### create Users #######
        users = ['UserA', 'UserB', 'UserC', 'UserD']
        for i in range(4):
            newUser = AUser(password='', last_login=timezone.now(), is_superuser=True, username=users[i], first_name='Firstname', last_name='Lastname', email='*****@*****.**', is_staff=True, is_active=True, date_joined=timezone.now())
            newUser.save()
            testDBModel.testUsers.append(newUser)
            testDBModel.testUsersID.append(newUser.pk)

######  add Category ######
        category1 = Category(name="hats")
        testDBModel.testCategory.append(category1)
        category1.save()
        category2 = Category(name="glasses")
        testDBModel.testCategory.append(category2)
        category2.save()
        
        user = User(id=testDBModel.testUsersID[0],user_id=testDBModel.testUsersID[0], user_image="profile1.jpg")
        user.save()

######   add product ######
        addProducts = ["ProductA", "ProductB", "ProductC", "ProductD"]
        for i in range(4):  # # add products
            newOne = Product(category=category1, name=addProducts[i], brand='brand', url='url', photo='photo', price=1.0, description='')
            newOne.save()
            testDBModel.testProducts.append(newOne)

######  add custom product #####
        newAdded = Added(owner = testDBModel.testUsers[0], product = testDBModel.testProducts[0])
        newAdded.save()
        newAdded = Added(owner = testDBModel.testUsers[1], product = testDBModel.testProducts[1])
        newAdded.save()
        
######  add temp product ######
        tempP = TempProduct(owner = testDBModel.testUsers[0], overlay = 'overlay1ol.jpg', token = '1', category = testDBModel.testCategory[0])
        tempP.save()
        tempP = TempProduct(owner = testDBModel.testUsers[1], overlay = 'overlay2ol.jpg', token = '2', category = testDBModel.testCategory[0])
        tempP.save()
        testDBModel.testOverlay = ['overlay1ol.jpg', 'overlay2ol.jpg']

##### ## add comments   ######
        for i in range(4):
            newOne = Comment(product=testDBModel.testProducts[i], owner=testDBModel.testUsers[i], content="null", time = timezone.now())
            newOne.save()
            testDBModel.testComments.append(newOne)

# add to wishlist first
        for i in range(4):
            newOne = WishList(product=testDBModel.testProducts[i], owner=testDBModel.testUsers[i])
            newOne.save()

# add to FitList:
        for i in range(4):
            newOne = FitList(product = testDBModel.testProducts[i], owner = testDBModel.testUsers[i])
            newOne.save()
def setUpDb(request):
    User.objects.all().delete()
    Category.objects.all().delete()
    Product.objects.all().delete()
    WishList.objects.all().delete()
    FitList.objects.all().delete()
    Comment.objects.all().delete()
    Added.objects.all().delete()
    TempProduct.objects.all().delete()
    
    glasses = Category(name='glasses')
    hats = Category(name='hats')
    headphones = Category(name='headphones')
    glasses.save()
    hats.save()
    headphones.save()
    
    rayban = Product(category = glasses, name='rayban glasses', brand = 'rayban',url='www.rayban.com', price = 129.9, description='stylish rayban', overlay='raybanol.png', photo='rayban.jpg')
    nike = Product(category = glasses, name='nike glasses', brand = 'nike', url='www.nike.com', photo='nike.jpg',overlay='nikeol.png', price = 99.9, description = 'sporty nike')
    adidas = Product(category = hats, name='adidas cap', brand = 'adidas', url='www.adidas.com', photo='addidas.jpg', overlay='addidasol.png', price = 56.9, description ='adidas cap!', yoffset = -0.58)
    levis = Product(category = hats, name='levis hat', brand = 'levis', url='www.levis.com', photo='levis.jpg', overlay='levisol.png', price = 67.9, description ='levis hat!', yoffset = -0.58)
    beats = Product(category = headphones, name='beats headphones', brand = 'beats', url='www.beats.com', photo='beats.jpg', overlay='beatsol.png', price = 256.9, description='stylish headphones!', yoffset = -0.15)
    sony = Product(category = headphones, name='sony headphones', brand = 'sony', url='www.sony.com', photo='sony.jpg', overlay="sonyol.png", price = 399.9, description='high quality headphones!', yoffset = -0.15)
    rayban.save()
    nike.save()
    adidas.save()
    levis.save()
    beats.save()
    sony.save()
    
    comment = Comment(product = rayban, owner = AUser.objects.get(pk=1), time=timezone.now(), content="Very nice glasses!")
    comment.save()
    
    wish = WishList(owner=AUser.objects.get(pk=1), product=rayban)
    wish.save()
    
    fit = FitList(owner=AUser.objects.get(pk=1), product=adidas)
    fit.save()
    
    return HttpResponse("Success!")
Ejemplo n.º 26
0
    def default_category(_id: int = DEFAULT_ID, **kwargs) -> Category:
        """
        Generates a default mock Category object when
        calling MockCategory.default_category().
        
        Distincts Category objects can be created:
        - By providing unique `_id` values.
        - And/or by providing a number of custom kwargs.
        
        Eg.
        custom_category=MockCategory.default_category(
            _id=235,
            category_name="Super Category "
            category_slug="supercat-"
        )
        will generates a Category object with the following
        attributes:
            * id = 235
            * category_name = "Super Category 235"
            * summary = "summary for category 235"
            * image = "img-url-235.png"
            * category_slug = "cat-slug-235"
        """

        category_data = {
            "id":
            _id,
            "category_name":
            kwargs.get("category_name",
                       f"{MockCategory.DEFAULT_CATEGORY_NAME}{_id}"),
            "summary":
            kwargs.get("summary", f"{MockCategory.DEFAULT_SUMMARY}{_id}"),
            "image":
            kwargs.get(
                "image",
                f"{MockCategory.DEFAULT_IMAGE_NAME}{_id}.{MockCategory.DEFAULT_IMAGE_EXTENSION}",
            ),
            "category_slug":
            kwargs.get("category_slug",
                       f"{MockCategory.DEFAULT_CATEGORY_SLUG}{_id}"),
        }

        dummy_category = Category.create(category_data)

        return dummy_category
Ejemplo n.º 27
0
    def tree(self, request):
        categories = Category.get_tree()

        result = dict()

        cid = request.GET.get('cid') #Get's the category ID from the incoming GET request.
        cat = Category.objects.filter(pk=cid) #Filter the DB and return records matching cid
        if cat.count() == 1:
            cat = cat[0]
            path = [c.id for c in cat.get_ancestors()]
            result['path'] = path

        category_tree = self.makeTree(categories)

        serializer = self.get_serializer(category_tree, many=True)

        result['tree'] = serializer.data
                
        return Response(result)
Ejemplo n.º 28
0
    def handle(self, *args, **kwargs):
        """Procedure which generate books."""
        fake = Faker()

        for _ in range(100):
            Author(name=fake.name(), surname=fake.name(),
                   email=fake.email()).save()

        for cat in open('main/management/commands/categories.txt', 'r'):
            Category(name=cat.rstrip()).save()

        authors = list(Author.objects.all())
        categories = list(Category.objects.all())

        for _ in range(500):
            author, category = random.choice(authors), random.choice(
                categories)
            Book(title=fake.text(max_nb_chars=25).replace('.', ''),
                 author=author,
                 category=category).save()
Ejemplo n.º 29
0
    def tree(self, request):
        categories = Category.get_tree()

        result = dict()

        cid = request.GET.get(
            'cid')  #Get's the category ID from the incoming GET request.
        cat = Category.objects.filter(
            pk=cid)  #Filter the DB and return records matching cid
        if cat.count() == 1:
            cat = cat[0]
            path = [c.id for c in cat.get_ancestors()]
            result['path'] = path

        category_tree = self.makeTree(categories)

        serializer = self.get_serializer(category_tree, many=True)

        result['tree'] = serializer.data

        return Response(result)
Ejemplo n.º 30
0
def renderEditResourceList(request, username, listId):
    if request.user.username == username:
        if request.method == "POST":
            updateResourceList(request)
            jsonResult = {"message": "OK"}
            return JsonResponse(jsonResult)
        else:
            returns = {}
            resourceList = get_object_or_404(ResourceList, id=listId)
            returns["resourceList"] = resourceList

            # jsonResourceList, jsonResources, jsonCategories
            returns["jsonResourceList"] = serialize(
                'json', [resourceList], use_natural_foreign_keys=True)
            returns["jsonResources"] = serialize(
                'json',
                Resource.objects.filter(
                    resourceList=resourceList).order_by('position'),
                use_natural_foreign_keys=True)
            returns["jsonCategories"] = Category.getCategoryTreeJSON(Category)

            return render(request, 'user/editList.html', returns)
    else:
        return redirect('renderIndex')
 def create(self, validated_data):
     category = Category(**validated_data)
     category.save()
     return category
Ejemplo n.º 32
0
def home_page(request):
    if not request.session.get(CART_ID_SESSION_KEY, None):
        shopping_cart = ShoppingCart.objects.create()
        request.session[CART_ID_SESSION_KEY] = shopping_cart.id
    categories = Category.get_category()
    return render(request, "home.html", {'categories': categories})
 def create_test_category(self, name):
     category = Category(id=1, name=name)
     category.save()
     return category
Ejemplo n.º 34
0
 def create(self, validated_data):
     category = Category(name=validated_data['name'])
     category.save()
     return category
Ejemplo n.º 35
0
    def test_ensure_views_are_positive(self):

        cat = Category(name='test',views=-1, likes=0, slug='Random Category String')
        cat.save()
        self.assertEqual((cat.views >= 0), True)
        self.assertEqual(cat.slug, 'random-category-string')