Ejemplo n.º 1
0
 def generate_category(self, categories, amount_posts=5):
     name = f'{self.fake.text(20)[:-1]} {str(time.time()).replace(".", "")[-5:]}'
     category = Category(
         name=name,
         enabled=True,
         text1=self.fake.paragraph(20),
         text2=self.fake.paragraph(20),
         h1=self.fake.text(20)[:-1],
         title=self.fake.paragraph(1),
         slug=translite_slug(name),
     )
     if categories:
         category.parent = random.choice(categories)
     category.save()
     category.image_menu.save(
         'filename.jpg',
         open(
             os.path.join(settings.BASE_DIR, 'faker/cat_menu',
                          random.choice(self.cat_menu)), 'rb'))
     category.image.save(
         'filename.jpg',
         open(
             os.path.join(settings.BASE_DIR, 'faker/cat_image',
                          random.choice(self.cat_image)), 'rb'))
     category.image_main.save(
         'filename.jpg',
         open(
             os.path.join(settings.BASE_DIR, 'faker/cat_main_image',
                          random.choice(self.cat_main_image)), 'rb'))
     for i in range(amount_posts):
         self.generate_post(category)
Ejemplo n.º 2
0
def add_category(request):
    if request.method == 'POST':
        category = Category(category_name=request.POST['category_name'],
                            status=request.POST['status'])
        category.save()
        return redirect('/category/manage_category')
    else:
        return render(request, 'category/add_category.html')
Ejemplo n.º 3
0
 def import_categories(self):
     self.stdout.write(self.style.MIGRATE_LABEL("Importing Categories"))
     progress = ProgressBar(widgets=[Percentage(), Bar()],
                            maxval=len(self.categories) * 2).start()
     for i, category in enumerate(self.categories):
         objCategory = Category(id=category.get('id'),
                                name=category.get('name'),
                                slug=category.get('slug'))
         objCategory.save()
         progress.update(i)
     for i, category in enumerate(self.categories):
         objCategory = Category.objects.get(pk=category.get('id'))
         objCategory.parent = Category.objects.get(slug=category.get(
             'parent')) if category.get('parent') else None
         objCategory.save()
         progress.update(i)
     progress.finish()
Ejemplo n.º 4
0
    def setUp(self):
        self.tag_a = Tag(name='a')
        self.tag_b = Tag(name='b')
        self.tag_c = Tag(name='c')
        self.tag_d = Tag(name='d')
        self.tag_e = Tag(name='e')

        self.tag_a.save()
        self.tag_b.save()
        self.tag_c.save()
        self.tag_d.save()
        self.tag_e.save()

        self.category_1 = Category(name='cat 1')
        self.category_2 = Category(name='cat 2')
        self.category_3 = Category(name='cat 3')

        self.category_1.save()
        self.category_2.save()
        self.category_3.save()

        self.post_1 = Post(pk=1, title='Markdown Syntax', slug='markdown-syntax', 
            content="Here's some markdown syntax.", 
            published=True)
        self.post_2 = Post(pk=2, title='First Post', slug='first-post', 
            content='This is my first post.', 
            published=True)
        self.post_3 = Post(pk=3, title='Django Unit Testing', slug='django-unit-testing', 
            content="To test django with unit testing, do this...", 
            published=True)
        self.post_4 = Post(pk=4, title='Depressed', slug='depressed', 
            content="I'm depressed...", 
            published=False)

        # this determines time_cr
        self.post_3.save()
        self.post_1.save()
        self.post_2.save()
        self.post_4.save()

        self.post_1.tags.add(self.tag_a)
        self.post_1.tags.add(self.tag_b)
        self.post_1.tags.add(self.tag_c)
        self.post_1.categories.add(self.category_1)
        self.post_1.categories.add(self.category_2)

        self.post_2.tags.add(self.tag_b)
        self.post_2.tags.add(self.tag_d)
        self.post_2.tags.add(self.tag_e)
        self.post_2.categories.add(self.category_2)
        self.post_2.categories.add(self.category_3)

        self.post_3.tags.add(self.tag_b)
        self.post_3.tags.add(self.tag_d)
        self.post_3.tags.add(self.tag_e)

        self.post_4.categories.add(self.category_3)

        # this determines time_lu
        self.post_4.save()
        self.post_1.save()
        self.post_3.save()
        self.post_2.save()

        self.client = Client()
Ejemplo n.º 5
0
class view_post_tests(TestCase):
    def setUp(self):
        self.tag_a = Tag(name='a')
        self.tag_b = Tag(name='b')
        self.tag_c = Tag(name='c')
        self.tag_d = Tag(name='d')
        self.tag_e = Tag(name='e')

        self.tag_a.save()
        self.tag_b.save()
        self.tag_c.save()
        self.tag_d.save()
        self.tag_e.save()

        self.category_1 = Category(name='cat 1')
        self.category_2 = Category(name='cat 2')
        self.category_3 = Category(name='cat 3')

        self.category_1.save()
        self.category_2.save()
        self.category_3.save()

        self.post_1 = Post(pk=1, title='Markdown Syntax', slug='markdown-syntax', 
            content="Here's some markdown syntax.", 
            published=True)
        self.post_2 = Post(pk=2, title='First Post', slug='first-post', 
            content='This is my first post.', 
            published=True)
        self.post_3 = Post(pk=3, title='Django Unit Testing', slug='django-unit-testing', 
            content="To test django with unit testing, do this...", 
            published=True)
        self.post_4 = Post(pk=4, title='Depressed', slug='depressed', 
            content="I'm depressed...", 
            published=False)

        # this determines time_cr
        self.post_3.save()
        self.post_1.save()
        self.post_2.save()
        self.post_4.save()

        self.post_1.tags.add(self.tag_a)
        self.post_1.tags.add(self.tag_b)
        self.post_1.tags.add(self.tag_c)
        self.post_1.categories.add(self.category_1)
        self.post_1.categories.add(self.category_2)

        self.post_2.tags.add(self.tag_b)
        self.post_2.tags.add(self.tag_d)
        self.post_2.tags.add(self.tag_e)
        self.post_2.categories.add(self.category_2)
        self.post_2.categories.add(self.category_3)

        self.post_3.tags.add(self.tag_b)
        self.post_3.tags.add(self.tag_d)
        self.post_3.tags.add(self.tag_e)

        self.post_4.categories.add(self.category_3)

        # this determines time_lu
        self.post_4.save()
        self.post_1.save()
        self.post_3.save()
        self.post_2.save()

        self.client = Client()


    def test_view_single_posts_by_id(self):
        # public post
        response = self.client.get('/posts/2/')
        self.assertIn('This is my first post', response.content)

        # private post
        response = self.client.get('/posts/4/')
        self.assertIn("The post you're looking for does not exist. ", response.content)

        # non-existent post
        response = self.client.get('/posts/100/')
        self.assertIn("The post you're looking for does not exist. ", response.content)

    def test_view_single_posts_by_slug(self):
        # public post
        response = self.client.get('/posts/first-post/')
        self.assertIn('This is my first post', response.content)

        # private post
        response = self.client.get('/posts/depressed/')
        self.assertIn("The post you're looking for does not exist. ", response.content)

        # non-existent post
        response = self.client.get('/posts/not-exist/')
        self.assertIn("The post you're looking for does not exist. ", response.content)

    def test_view_single_posts_by_date_slug(self):
        pass
        # # public post
        # response = self.client.get('/posts/2014/04/20/first-post/')
        # self.assertIn('This is my first post', response.content)

        # # private post
        # response = self.client.get('/posts/????/')
        # self.assertIn("The post you're looking for does not exist. ", response.content)

        # # non-existent post: slug does not exist
        # response = self.client.get('/posts/????/')
        # self.assertIn("The post you're looking for does not exist. ", response.content)

        # # non-existent post: date/slug mismatch
        # response = self.client.get('/posts/????/')
        # self.assertIn("The post you're looking for does not exist. ", response.content)

    def test_view_all_posts(self):
        '''
        private posts should not show
        public posts are listed in chronolgical order of creation time
        '''

        # redirects properly
        response = self.client.get('/posts/')
        self.assertRedirects(response, '/')

        # posts appear in correct order
        response = self.client.get('/')
        post_1_position = response.content.find("Here's some markdown syntax.")
        post_2_position = response.content.find('This is my first post.')
        post_3_position = response.content.find("To test django with unit testing")

        self.assertGreater(post_1_position, 0)
        self.assertGreater(post_2_position, 0)
        self.assertGreater(post_3_position, 0)

        self.assertLess(post_2_position, post_1_position)
        self.assertLess(post_1_position, post_3_position)

        # private post doesn't appear
        post_4_position = response.content.find("I'm depressed")
        self.assertEqual(post_4_position, -1)

    def test_get_absolute_url(self):
        # time below is already Apr 30 in UTC time (local time is Central Time, UTC-6/5s)
        self.post_2.time_cr = datetime(2014, 4, 29, 20, 13, 19, 0, get_default_timezone())
        the_absolute_url = self.post_2.get_absolute_url()
        # make sure permalink doesn't roll over to Apr 30
        self.assertEqual(the_absolute_url, '/posts/2014/04/29/first-post/')
Ejemplo n.º 6
0
def post_view(request):
    cache_key = settings.RANDOM_POSTS_KEY
    cache_count = redis_con.scard(cache_key)

    if request.method == 'GET':
        nickname = request.GET.get("nickname", "").strip()
        category_name = request.GET.get("category", "").strip()

        # save cache
        if cache_count <= 0:
            print 'caching...'
            db_posts = Post.objects.filter(
                deleted=False, created_at__gte=utils.min_created_at()).all()
            for p in db_posts:
                redis_con.sadd(cache_key, p.pk)
            redis_con.expire(cache_key, settings.RANDOM_POSTS_EXPIRE)

        post_id = redis_con.srandmember(cache_key)

        # there is no any data
        if not post_id:
            return JsonResponse(dict(success=True, data=None))

        post = Post.objects.filter(id=post_id).get()
        read_count = post.read_count + 1
        post.read_count = F("read_count") + 1
        post.save()

        return JsonResponse(
            dict(success=True,
                 data={
                     "nickname": post.nickname,
                     "content": post.content,
                     "category": post.category.name,
                     "read_count": read_count,
                     "created_at":
                     post.created_at.strftime('%Y-%m-%d %H:%M:%S'),
                 }))

    elif request.method == 'POST':
        nickname = request.POST.get('nickname',
                                    settings.DEFAULT_NICKNAME).strip()
        category_name = request.POST.get(
            'category', settings.DEFAULT_CATEGORY_NAME).strip()
        content = request.POST.get('content', '').strip()
        img_url = request.POST.get('img_url', '').strip()

        if not nickname or not category_name or not content:
            return JsonResponse(dict(success=False, msg=u'信息不完整'))
        if len(nickname) > settings.NICKNAME_MAX_LENGTH:
            return JsonResponse(
                dict(success=False,
                     msg=u'用户名最长为 %d 个字符' % settings.NICKNAME_MAX_LENGTH))
        if len(category_name) > settings.CATEGORY_MAX_LENGTH:
            return JsonResponse(
                dict(success=False,
                     msg=u'类别名最长为 %d 个字符' % settings.CATEGORY_MAX_LENGTH))
        if len(content) > settings.POST_MAX_LENGTH:
            return JsonResponse(
                dict(success=False,
                     msg=u'post 最多 %d 个字符' % settings.POST_MAX_LENGTH))

        category_exist = Category.objects.filter(name=category_name).exists()
        if category_exist:
            category = Category.objects.filter(name=category_name).get()
            category.post_count = F('post_count') + 1
        else:
            category = Category(name=category_name, post_count=1)
        category.save()

        post = Post(nickname=nickname,
                    content=content,
                    img_url=img_url,
                    category=category)
        post.save()
        # save to cache
        if cache_count > 0:
            redis_con.sadd(cache_key, post.pk)

        return JsonResponse(dict(success=True))
Ejemplo n.º 7
0
    def handle(self, *args, **options):
        self.stdout.write('Importing WordPress posts')
        wp_table_prefix = options['wp-table-prefix']
        utc = pytz.utc

        my_conv = {
            FIELD_TYPE.LONG: int,
            FIELD_TYPE.INT24: int,
            FIELD_TYPE.SHORT: int,
            FIELD_TYPE.TINY: int,
            FIELD_TYPE.LONGLONG: int,
            FIELD_TYPE.DATETIME: str,
        }

        try:
            db = MySQLdb.connect(host=options['host'],
                                 user=options['user'],
                                 passwd=options['passwd'],
                                 db=options['db'],
                                 conv=my_conv,
                                 use_unicode=True,
                                 charset='utf8mb4')
        except Exception as e:
            self.stderr.write('Unable to connect to database')
            self.stderr.write(str(e))
            return

        cur = db.cursor()

        cur.execute('SET NAMES utf8mb4')
        cur.execute("SET CHARACTER SET utf8mb4")
        cur.execute("SET character_set_connection=utf8mb4")

        wpTagMap = dict()
        wpCategoryMap = dict()
        posts = list()

        # GET TAGS
        self.stdout.write('Migrating Tags')

        cur.execute(f"""SELECT COUNT(*) 
            FROM {wp_table_prefix}_terms AS terms 
            INNER JOIN {wp_table_prefix}_term_taxonomy AS taxonomy 
                ON terms.term_id = taxonomy.term_id 
            INNER JOIN {wp_table_prefix}_term_relationships AS relationships
                ON relationships.`term_taxonomy_id` = taxonomy.`term_taxonomy_id`
            INNER JOIN {wp_table_prefix}_posts AS posts
                ON relationships.`object_id` = posts.`ID`
            WHERE taxonomy.taxonomy = 'post_tag'
                AND posts.post_type = 'post'""")
        row = cur.fetchone()
        self.stdout.write(f"{row[0]} tags to migrate")

        cur.execute(f"""SELECT 
                terms.term_id, 
                terms.name, 
                terms.slug, 
                posts.ID
            FROM {wp_table_prefix}_terms AS terms 
            INNER JOIN {wp_table_prefix}_term_taxonomy AS taxonomy 
                ON terms.term_id = taxonomy.term_id 
            INNER JOIN {wp_table_prefix}_term_relationships AS relationships
                ON relationships.`term_taxonomy_id` = taxonomy.`term_taxonomy_id`
            INNER JOIN {wp_table_prefix}_posts AS posts
                ON relationships.`object_id` = posts.`ID`
            WHERE taxonomy.taxonomy = 'post_tag'
                AND posts.post_type = 'post'""")

        rows = cur.fetchall()

        savedTags = dict()

        for row in rows:
            tag = Tag(name=row[1], slug=row[2])

            if row[0] in savedTags:
                tag = savedTags[row[0]]
            else:
                tag.save()
                savedTags[row[0]] = tag

            if row[3] not in wpTagMap:
                wpTagMap[row[3]] = list()

            wpTagMap[row[3]].append(tag)

        self.stdout.write(f"{len(wpTagMap)} tags migrated")

        # GET CATEGORIES
        self.stdout.write('Migrating Categories')
        cur.execute(f"""SELECT COUNT(*) 
            FROM {wp_table_prefix}_terms AS terms 
            INNER JOIN {wp_table_prefix}_term_taxonomy AS taxonomy 
                ON terms.term_id = taxonomy.term_id 
            INNER JOIN {wp_table_prefix}_term_relationships AS relationships
                ON relationships.`term_taxonomy_id` = taxonomy.`term_taxonomy_id`
            INNER JOIN {wp_table_prefix}_posts AS posts
                ON relationships.`object_id` = posts.`ID`
            WHERE taxonomy.taxonomy = 'category'
                AND posts.post_type = 'post'""")
        row = cur.fetchone()
        self.stdout.write(f"{row[0]} categories to migrate")

        cur.execute(f"""SELECT 
                terms.term_id, 
                terms.name, 
                terms.slug, 
                posts.ID 
            FROM {wp_table_prefix}_terms AS terms 
            INNER JOIN {wp_table_prefix}_term_taxonomy AS taxonomy 
                ON terms.term_id = taxonomy.term_id 
            INNER JOIN {wp_table_prefix}_term_relationships AS relationships
                ON relationships.`term_taxonomy_id` = taxonomy.`term_taxonomy_id`
            INNER JOIN {wp_table_prefix}_posts AS posts
                ON relationships.`object_id` = posts.`ID`
            WHERE taxonomy.taxonomy = 'category'
                AND posts.post_type = 'post'""")

        rows = cur.fetchall()

        savedCategories = dict()

        for row in rows:
            category = Category(name=row[1], slug=row[2])

            if row[0] in savedCategories:
                category = savedCategories[row[0]]
            else:
                category.save()
                savedCategories[row[0]] = category

            wpCategoryMap[row[3]] = category

        self.stdout.write(f"{len(wpCategoryMap)} categories migrated")

        # POSTS
        self.stdout.write('Migrating Posts')
        cur.execute(
            f"SELECT COUNT(*) FROM {wp_table_prefix}_posts WHERE post_type = 'post'"
        )
        row = cur.fetchone()
        self.stdout.write(f"{row[0]} posts to migrate")

        # we need a default Author
        author = Profile.objects.all()[:1].get()
        self.stdout.write(f'Default author is {author.name}')

        cur.execute(
            f"SELECT ID, post_date_gmt, post_content, post_title, post_excerpt, post_status, post_name, post_modified_gmt FROM {wp_table_prefix}_posts WHERE post_type = 'post'"
        )

        rows = cur.fetchall()

        for row in rows:
            if not row[6]:
                self.stdout.write(f'{row[3]} has no slug. Skipping.')
                continue

            published = row[1]
            if published == '0000-00-00 00:00:00':
                published = None
            else:
                published = utc.localize(datetime.datetime.strptime(
                    published, "%Y-%m-%d %H:%M:%S"),
                                         is_dst=None)

            updated = row[7]
            if updated == '0000-00-00 00:00:00':
                updated = None
            else:
                updated = utc.localize(datetime.datetime.strptime(
                    updated, "%Y-%m-%d %H:%M:%S"),
                                       is_dst=None)

            post = Post(published=published,
                        content=row[2],
                        title=row[3],
                        summary=row[4],
                        is_published=row[5] == 'publish',
                        slug=row[6],
                        updated=updated,
                        author=author)

            try:
                post.save()
            except Exception as e:
                self.stderr.write(str(e))
                self.stderr.write(post.name)
                raise e
            posts.append({'post': post, 'wpId': row[0]})

        self.stdout.write(f"{len(posts)} posts migrated")

        # Attaching Tags and Categories
        self.stdout.write("Attaching tags and categories")
        for post in posts:
            if post['wpId'] in wpCategoryMap:
                post['post'].category = wpCategoryMap[post['wpId']]
            else:
                self.stdout.write(f"No category for {post['post'].title}")

            if post['wpId'] in wpTagMap:
                post['post'].tags.set(wpTagMap[post['wpId']])
            else:
                self.stdout.write(f"No tags for {post['post'].title}")

            post['post'].save()

        self.stdout.write("Tags and categories attached")

        cur.close()
        db.close()
        self.stdout.write('WordPress posts imported')
        return
Ejemplo n.º 8
0
 def create_test_category(self):
     """Create a test category."""
     self.category = Category(name='TestCategory', )
     self.category.save()
Ejemplo n.º 9
0
class PostsViewsTestCase(TestCase):
    """Test case for Posts views."""
    def create_admin_user(self):
        """Create a test admin user."""
        self.admin_user = User.objects.create(
            username='******',
            email='admin@localhost',
        )

    def create_test_category(self):
        """Create a test category."""
        self.category = Category(name='TestCategory', )
        self.category.save()

    def create_test_post(self):
        """Create a test post for use with other tests."""
        self.post = Post(
            title='This is my title',
            author=self.admin_user,
            content='Some content',
            published=timezone.now(),
            is_published=True,
            slugged_title='this-is-my-title',
        )
        self.post.save()
        self.post.categories.add(self.category)
        self.post.save()

    def setUp(self):
        """ setup """
        self.create_admin_user()
        self.create_test_category()
        PageElement.objects.create(name='Tag Line', text='some text')
        PageElement.objects.create(name='Footer Text', text='some text')
        self.create_test_post()

    def test_post_get(self):
        """Test GET /post/{}"""
        client = Client()
        response = client.get('/post/{}/'.format(self.post.slugged_title))
        self.assertEqual(response.status_code, 200)
        self.assertTrue(self.post.title in response.content)

    def test_post_filtered(self):
        """Test GET /post/filter/?category_name={}"""
        client = Client()
        for category in self.post.categories.all():
            url = '/post/filter/?category_name={}'.format(category.name)
            response = client.get(url)
            self.assertEqual(response.status_code, 200)
            self.assertTrue(self.post.title in response.content)

    def test_post_is_published(self):
        """Test that is_published is being used as it should."""
        # self.create_test_post()
        post = Post.objects.get(title='This is my title')
        client = Client()
        response = client.get('/', follow=True)
        self.assertTrue('This is my title' in response.content)
        post.is_published = False
        post.save()

        response = client.get('/', follow=True)
        self.assertFalse('This is my title' in response.content)
Ejemplo n.º 10
0
def create_category():
    faker = Faker()
    for _ in range(10):
        name = faker.word()
        category = Category(name=name)
        category.save()