def get(self): form = ShareCategoryForm(self.request.arguments) if not form.validate(): raise HTTPError(404) category = form.category.data existed = yield ShareCategoryDocument.find_one({'name': category}) if not existed: raise HTTPError(404) kwargs = yield self.get_sidebar_arguments() share_list = yield ShareDocument.get_share_list( category=category, limit=SHARE_SETTINGS['share_number_per_page']) share_number = yield ShareDocument.get_share_number(category=category) uploader_number = yield ShareDocument.get_uploader_number( category=category) kwargs.update({ 'current_category': category, 'share_list': share_list, 'share_number': share_number, 'uploader_number': uploader_number }) self.render('share/template/share-category.html', **kwargs)
def get(self, share_id): share = yield ShareDocument.get_share( share_id, self.current_user and self.current_user['_id'] ) if not share: raise HTTPError(404) like_list = yield ShareLikeDocument.get_like_list( share_id, limit=10 ) recommend_share_list = yield ShareDocument.get_recommend_share_list( share_id ) comment_list = yield ShareCommentDocument.get_comment_list( share_id, limit=SHARE_SETTINGS['share_comment_number_per_page'] ) kwargs = { 'share': share, 'like_list': like_list, 'recommend_share_list': recommend_share_list, 'comment_list': comment_list, 'SHARE_SETTINGS': SHARE_SETTINGS } self.render('share/template/share-one.html', **kwargs)
def get(self): form = ShareCategoryForm(self.request.arguments) if not form.validate(): raise HTTPError(404) category = form.category.data existed = yield ShareCategoryDocument.find_one({ 'name': category }) if not existed: raise HTTPError(404) kwargs = yield self.get_sidebar_arguments() share_list = yield ShareDocument.get_share_list( category=category, limit=SHARE_SETTINGS['share_number_per_page'] ) share_number = yield ShareDocument.get_share_number( category=category ) uploader_number = yield ShareDocument.get_uploader_number( category=category ) kwargs.update({ 'current_category': category, 'share_list': share_list, 'share_number': share_number, 'uploader_number': uploader_number }) self.render('share/template/share-category.html', **kwargs)
def get(self): kwargs = yield self.get_sidebar_arguments() recommend_func = ShareDownloadDocument.get_hot_download_list recommend_share_list = yield recommend_func() uploader_list = yield ShareDocument.get_uploader_list() newest_share_list = yield ShareDocument.get_share_list(limit=6) kwargs.update({ 'uploader_list': uploader_list, 'recommend_share_list': recommend_share_list, 'newest_share_list': newest_share_list }) self.render('share/template/share.html', **kwargs)
def get(self, share_id): share = yield ShareDocument.get_share(share_id, self.current_user['_id']) if not share: raise HTTPError(404) like_list = yield ShareLikeDocument.get_like_list(share_id, limit=10) recommend_share_list = yield ShareDocument.get_recommend_share_list( share_id) comment_list = yield ShareCommentDocument.get_comment_list( share_id, limit=SHARE_SETTINGS['share_comment_number_per_page']) kwargs = { 'share': share, 'like_list': like_list, 'recommend_share_list': recommend_share_list, 'comment_list': comment_list, 'SHARE_SETTINGS': SHARE_SETTINGS } self.render('share/template/share-one.html', **kwargs)
def post(self): form = ShareLikeForm(self.request.arguments) if not form.validate(): raise HTTPError(404) response_data = {} share_id = form.share_id.data share = yield ShareDocument.find_one({'_id': ObjectId(share_id)}) if not share: raise HTTPError(404) can_afford = yield UserDocument.can_afford(self.current_user['_id'], WEALTH_SETTINGS['like']) if (not can_afford and str(self.current_user['_id']) != str(share['uploader'].id)): response_data.update({'error': '金币不足!'}) share_dbref = DBRef(ShareDocument.meta['collection'], ObjectId(share_id)) liker_dbref = DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])) document = {'share': share_dbref, 'liker': liker_dbref} liked = yield ShareLikeDocument.is_liked(share_id, self.current_user['_id']) if not liked and not response_data: now = datetime.now() document.update({'like_time': now}) like_id = yield ShareLikeDocument.insert_one(document) if str(self.current_user['_id']) != str(share['uploader'].id): activity = { 'user': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'activity_type': UserActivityDocument.LIKE, 'time': now, 'data': DBRef(ShareLikeDocument.meta['collection'], ObjectId(like_id)) } activity_id = yield UserActivityDocument.insert(activity) # 赞者 wealth = { 'user': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'in_out_type': WealthRecordDocument.OUT, 'activity': DBRef(UserActivityDocument.meta['collection'], ObjectId(activity_id)), 'quantity': WEALTH_SETTINGS['like'], 'time': now } yield WealthRecordDocument.insert(wealth) yield UserDocument.update_wealth(self.current_user['_id'], -WEALTH_SETTINGS['like']) # 被赞者 wealth = { 'user': DBRef(UserDocument.meta['collection'], ObjectId(share['uploader'].id)), 'in_out_type': WealthRecordDocument.IN, 'activity': DBRef(UserActivityDocument.meta['collection'], ObjectId(activity_id)), 'quantity': WEALTH_SETTINGS['like'], 'time': now } yield WealthRecordDocument.insert(wealth) yield UserDocument.update_wealth(share['uploader'].id, WEALTH_SETTINGS['like']) message = { 'sender': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'recipient': DBRef(UserDocument.meta['collection'], ObjectId(share['uploader'].id)), 'message_type': 'like:share', 'time': now, 'read': False, 'data': DBRef(ShareLikeDocument.meta['collection'], ObjectId(like_id)) } message_id = yield MessageDocument.insert(message) WriterManager.pub(MessageTopic.LIKE, str(message_id)) like_times = yield ShareLikeDocument.get_like_times(share_id) response_data.update({'like_times': like_times}) self.finish(json.dumps(response_data))
def post(self): form = ShareCommentNewForm(self.request.arguments) if not form.validate(): raise HTTPError(404) response_data = {} content = form.content.data share_id = form.share_id.data anonymous = form.anonymous.data replyeder_id = form.replyeder_id.data replyeder = None if replyeder_id: replyeder = yield UserDocument.find_one( {'_id': ObjectId(replyeder_id)}) if (not replyeder or anonymous or self.current_user['_id'] == replyeder['_id']): raise HTTPError(404) share = yield ShareDocument.find_one({'_id': ObjectId(share_id)}) if not share: raise HTTPError(404) if not response_data: now = datetime.now() document = { 'author': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'share': DBRef(ShareDocument.meta['collection'], ObjectId(share['_id'])), 'comment_time': now, 'content': content, 'anonymous': anonymous } if replyeder: document.update({ 'replyeder': DBRef(UserDocument.meta['collection'], ObjectId(replyeder_id)) }) comment_id = yield ShareCommentDocument.insert_one(document) activity = { 'user': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'activity_type': UserActivityDocument.COMMENT, 'time': now, 'data': DBRef(ShareCommentDocument.meta['collection'], ObjectId(comment_id)) } yield UserActivityDocument.insert(activity) if replyeder: recipient_id = replyeder_id message_type = 'reply:share' message_share = MessageTopic.REPLY else: recipient_id = share['uploader'].id message_type = 'comment:share' message_share = MessageTopic.COMMENT if (str(self.current_user['_id']) != str(recipient_id) and not anonymous): message = { 'sender': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'recipient': DBRef(UserDocument.meta['collection'], ObjectId(recipient_id)), 'message_type': message_type, 'time': now, 'read': False, 'data': DBRef(ShareCommentDocument.meta['collection'], ObjectId(comment_id)) } message_id = yield MessageDocument.insert(message) WriterManager.pub(message_share, message_id) comment_times = yield ShareCommentDocument.get_comment_times( share_id) document.update({ '_id': ObjectId(comment_id), 'author': self.current_user, 'floor': comment_times }) if replyeder: document.update({'replyeder': replyeder}) item = self.render_string( 'share/template/share-comment-list-item.html', comment=document) response_data.update({'item': item}) self.finish(json.dumps(response_data))
def get(self, share_id): share = yield ShareDocument.get_share(share_id) if not share or not share['passed'] or 'origin_file' not in share: raise HTTPError(404) self.set_header('Content-Type', self.get_content_type(share)) self.set_header('Content-Disposition', 'attachment; filename=%s' % self.get_filename(share)) fs = self.get_gridfs() gridout = yield fs.get(ObjectId(share['origin_file'])) if gridout.length <= 0: raise HTTPError(404) if (self.current_user['_id'] != share['uploader']['_id'] and self.current_user['wealth'] < share['cost']): raise HTTPError(404) size = 0 while size < gridout.length: content = yield gridout.read(gridout.chunk_size) size += len(content) self.write(content) yield ShareDocument.update({'_id': ObjectId(share_id)}, {'$inc': { 'download_times': 1 }}) now = datetime.now() document = { 'user': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'activity_type': UserActivityDocument.DOWNLOAD_SHARE, 'time': now, 'data': DBRef(ShareDocument.meta['collection'], ObjectId(share_id)) } activity_id = yield UserActivityDocument.insert(document) document = { 'share': DBRef(ShareDocument.meta['collection'], ObjectId(share_id)), 'downloader': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'download_time': now } yield ShareDownloadDocument.insert(document) if (share['cost'] > 0 and self.current_user['_id'] != share['uploader']['_id']): document = { 'user': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'in_out_type': WealthRecordDocument.OUT, 'activity': DBRef(UserActivityDocument.meta['collection'], ObjectId(activity_id)), 'quantity': share['cost'], 'time': now } yield WealthRecordDocument.insert(document) yield UserDocument.update_wealth(self.current_user['_id'], -share['cost']) document = { 'user': DBRef(UserDocument.meta['collection'], ObjectId(share['uploader']['_id'])), 'in_out_type': WealthRecordDocument.IN, 'activity': DBRef(UserActivityDocument.meta['collection'], ObjectId(activity_id)), 'quantity': share['cost'], 'time': now } yield WealthRecordDocument.insert(document) yield UserDocument.update_wealth(share['uploader']['_id'], share['cost']) self.finish()
def post(self): form = ShareNewForm(self.request.arguments) if not form.validate(): raise HTTPError(404) response_data = {} title = form.title.data description = form.description.data category = form.category.data cost = form.cost.data upload_token = form.upload_token.data if 'file' not in self.request.files: raise HTTPError(404) resumableChunkNumber = form.resumableChunkNumber.data resumableTotalChunks = form.resumableTotalChunks.data resumableFilename = form.resumableFilename.data resumableTotalSize = form.resumableTotalSize.data document = { 'chunk_index': resumableChunkNumber, 'upload_token': upload_token } existed = yield TemporaryFileDocument.find_one(document) if not existed: document.update({ 'body': Binary(self.request.files['file'][0]['body']), 'filename': resumableFilename, 'uploader': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'upload_time': datetime.now(), }) yield TemporaryFileDocument.insert(document) count = yield TemporaryFileDocument.find({ 'upload_token': upload_token }).count() if resumableTotalChunks == count: # 此处又插入最后一个上传的chunk的原因是为了防止,最后一个chunk多次上传后,插入多个分享 yield TemporaryFileDocument.insert(document) _category = yield ShareCategoryDocument.find_one( {'name': category}) if not _category: raise HTTPError(404) cursor = TemporaryFileDocument.find({ 'upload_token': upload_token }).sort([('chunk_index', pymongo.ASCENDING)]) chunk_index_list, total_size, data = set(), 0, [] while (yield cursor.fetch_next): chunk = cursor.next_object() if chunk['chunk_index'] not in chunk_index_list: data.append(chunk['body']) total_size += len(str(chunk['body'])) chunk_index_list.add(chunk['chunk_index']) # remove all temporary files yield TemporaryFileDocument.remove({'upload_token': upload_token}) if total_size != resumableTotalSize: response_data.update({'message': '上传过程中数据受损,请重新上传!'}) else: gridfs = ShareDocument.get_gridfs() try: f = yield gridfs.new_file() yield f.write("".join(data)) except: response_data.update({"message": "保存失败! 请重新上传!"}) else: now = datetime.now() content_type = self.request.files['file'][0][ 'content_type'] document = { 'title': title, 'category': category, 'filename': resumableFilename, 'content_type': content_type, 'description': description, 'uploader': DBRef(UserDocument.meta['collection'], ObjectId(self.current_user['_id'])), 'upload_time': now, 'cost': cost, 'origin_file': ObjectId(f._id) } share_id = yield ShareDocument.insert(document) response_data = { 'share_id': str(share_id), 'upload_token': upload_token } finally: yield f.close() self.finish(json.dumps(response_data))
def post(self): form = ShareLikeForm(self.request.arguments) if not form.validate(): raise HTTPError(404) response_data = {} share_id = form.share_id.data share = yield ShareDocument.find_one({ '_id': ObjectId(share_id) }) if not share: raise HTTPError(404) can_afford = yield UserDocument.can_afford( self.current_user['_id'], WEALTH_SETTINGS['like'] ) if (not can_afford and str(self.current_user['_id']) != str(share['uploader'].id)): response_data.update({'error': '金币不足!'}) share_dbref = DBRef( ShareDocument.meta['collection'], ObjectId(share_id) ) liker_dbref = DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ) document = { 'share': share_dbref, 'liker': liker_dbref } liked = yield ShareLikeDocument.is_liked( share_id, self.current_user['_id'] ) if not liked and not response_data: now = datetime.now() document.update({ 'like_time': now }) like_id = yield ShareLikeDocument.insert_one(document) if str(self.current_user['_id']) != str(share['uploader'].id): activity = { 'user': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'activity_type': UserActivityDocument.LIKE, 'time': now, 'data': DBRef( ShareLikeDocument.meta['collection'], ObjectId(like_id) ) } activity_id = yield UserActivityDocument.insert(activity) # 赞者 wealth = { 'user': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'in_out_type': WealthRecordDocument.OUT, 'activity': DBRef( UserActivityDocument.meta['collection'], ObjectId(activity_id) ), 'quantity': WEALTH_SETTINGS['like'], 'time': now } yield WealthRecordDocument.insert(wealth) yield UserDocument.update_wealth( self.current_user['_id'], -WEALTH_SETTINGS['like'] ) # 被赞者 wealth = { 'user': DBRef( UserDocument.meta['collection'], ObjectId(share['uploader'].id) ), 'in_out_type': WealthRecordDocument.IN, 'activity': DBRef( UserActivityDocument.meta['collection'], ObjectId(activity_id) ), 'quantity': WEALTH_SETTINGS['like'], 'time': now } yield WealthRecordDocument.insert(wealth) yield UserDocument.update_wealth( share['uploader'].id, WEALTH_SETTINGS['like'] ) message = { 'sender': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'recipient': DBRef( UserDocument.meta['collection'], ObjectId(share['uploader'].id) ), 'message_type': 'like:share', 'time': now, 'read': False, 'data': DBRef( ShareLikeDocument.meta['collection'], ObjectId(like_id) ) } message_id = yield MessageDocument.insert(message) WriterManager.pub(MessageTopic.LIKE, str(message_id)) like_times = yield ShareLikeDocument.get_like_times(share_id) response_data.update({'like_times': like_times}) self.write_json(response_data)
def post(self): form = ShareCommentNewForm(self.request.arguments) if not form.validate(): raise HTTPError(404) response_data = {} content = form.content.data share_id = form.share_id.data anonymous = form.anonymous.data replyeder_id = form.replyeder_id.data replyeder = None if replyeder_id: replyeder = yield UserDocument.find_one({ '_id': ObjectId(replyeder_id) }) if (not replyeder or anonymous or self.current_user['_id'] == replyeder['_id']): raise HTTPError(404) share = yield ShareDocument.find_one({'_id': ObjectId(share_id)}) if not share: raise HTTPError(404) if not response_data: now = datetime.now() document = { 'author': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'share': DBRef( ShareDocument.meta['collection'], ObjectId(share['_id']) ), 'comment_time': now, 'content': content, 'anonymous': anonymous } if replyeder: document.update({ 'replyeder': DBRef( UserDocument.meta['collection'], ObjectId(replyeder_id) ) }) comment_id = yield ShareCommentDocument.insert_one(document) activity = { 'user': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'activity_type': UserActivityDocument.COMMENT, 'time': now, 'data': DBRef( ShareCommentDocument.meta['collection'], ObjectId(comment_id) ) } yield UserActivityDocument.insert(activity) if replyeder: recipient_id = replyeder_id message_type = 'reply:share' message_share = MessageTopic.REPLY else: recipient_id = share['uploader'].id message_type = 'comment:share' message_share = MessageTopic.COMMENT if (str(self.current_user['_id']) != str(recipient_id) and not anonymous): message = { 'sender': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'recipient': DBRef( UserDocument.meta['collection'], ObjectId(recipient_id) ), 'message_type': message_type, 'time': now, 'read': False, 'data': DBRef( ShareCommentDocument.meta['collection'], ObjectId(comment_id) ) } message_id = yield MessageDocument.insert(message) WriterManager.pub(message_share, message_id) comment_times = yield ShareCommentDocument.get_comment_times( share_id ) document.update({ '_id': ObjectId(comment_id), 'author': self.current_user, 'floor': comment_times }) if replyeder: document.update({'replyeder': replyeder}) item = self.render_string( 'share/template/share-comment-list-item.html', comment=document ) response_data.update({'item': item}) self.write_json(response_data)
def get(self, share_id): share = yield ShareDocument.get_share(share_id) if not share or not share['passed'] or 'origin_file' not in share: raise HTTPError(404) self.set_header('Content-Type', self.get_content_type(share)) self.set_header( 'Content-Disposition', 'attachment; filename=%s' % self.get_filename(share) ) fs = self.get_gridfs() gridout = yield fs.get(ObjectId(share['origin_file'])) if gridout.length <= 0: raise HTTPError(404) if (self.current_user['_id'] != share['uploader']['_id'] and self.current_user['wealth'] < share['cost']): raise HTTPError(404) size = 0 while size < gridout.length: content = yield gridout.read(gridout.chunk_size) size += len(content) self.write(content) yield ShareDocument.update( {'_id': ObjectId(share_id)}, {'$inc': {'download_times': 1}} ) now = datetime.now() document = { 'user': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'activity_type': UserActivityDocument.DOWNLOAD_SHARE, 'time': now, 'data': DBRef( ShareDocument.meta['collection'], ObjectId(share_id) ) } activity_id = yield UserActivityDocument.insert(document) document = { 'share': DBRef( ShareDocument.meta['collection'], ObjectId(share_id) ), 'downloader': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'download_time': now } yield ShareDownloadDocument.insert(document) if (share['cost'] > 0 and self.current_user['_id'] != share['uploader']['_id']): document = { 'user': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'in_out_type': WealthRecordDocument.OUT, 'activity': DBRef( UserActivityDocument.meta['collection'], ObjectId(activity_id) ), 'quantity': share['cost'], 'time': now } yield WealthRecordDocument.insert(document) yield UserDocument.update_wealth( self.current_user['_id'], -share['cost'] ) document = { 'user': DBRef( UserDocument.meta['collection'], ObjectId(share['uploader']['_id']) ), 'in_out_type': WealthRecordDocument.IN, 'activity': DBRef( UserActivityDocument.meta['collection'], ObjectId(activity_id) ), 'quantity': share['cost'], 'time': now } yield WealthRecordDocument.insert(document) yield UserDocument.update_wealth( share['uploader']['_id'], share['cost'] ) self.finish()
def post(self): form = ShareNewForm(self.request.arguments) if not form.validate(): raise HTTPError(404) response_data = {} title = form.title.data description = form.description.data category = form.category.data cost = form.cost.data upload_token = form.upload_token.data if 'file' not in self.request.files: raise HTTPError(404) resumableChunkNumber = form.resumableChunkNumber.data resumableTotalChunks = form.resumableTotalChunks.data resumableFilename = form.resumableFilename.data resumableTotalSize = form.resumableTotalSize.data document = { 'chunk_index': resumableChunkNumber, 'upload_token': upload_token } existed = yield TemporaryFileDocument.find_one(document) if not existed: document.update({ 'body': Binary(self.request.files['file'][0]['body']), 'filename': resumableFilename, 'uploader': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'upload_time': datetime.now(), }) yield TemporaryFileDocument.insert(document) count = yield TemporaryFileDocument.find({ 'upload_token': upload_token }).count() if resumableTotalChunks == count: # 此处又插入最后一个上传的chunk的原因是为了防止,最后一个chunk多 # 次上传后,插入多个分享 yield TemporaryFileDocument.insert(document) _category = yield ShareCategoryDocument.find_one({ 'name': category }) if not _category: raise HTTPError(404) cursor = TemporaryFileDocument.find({ 'upload_token': upload_token }).sort([('chunk_index', pymongo.ASCENDING)]) chunk_index_list, total_size, data = set(), 0, [] while (yield cursor.fetch_next): chunk = cursor.next_object() if chunk['chunk_index'] not in chunk_index_list: data.append(chunk['body']) total_size += len(str(chunk['body'])) chunk_index_list.add(chunk['chunk_index']) # remove all temporary files yield TemporaryFileDocument.remove({'upload_token': upload_token}) if total_size != resumableTotalSize: response_data.update({ 'message': '上传过程中数据受损,请重新上传!' }) else: gridfs = ShareDocument.get_gridfs() try: f = yield gridfs.new_file() yield f.write("".join(data)) except: response_data.update({"message": "保存失败! 请重新上传!"}) else: now = datetime.now() content_type = self.request.files['file'][0]['content_type'] document = { 'title': title, 'category': category, 'filename': resumableFilename, 'content_type': content_type, 'description': description, 'uploader': DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id']) ), 'upload_time': now, 'cost': cost, 'origin_file': ObjectId(f._id) } share_id = yield ShareDocument.insert(document) response_data = { 'share_id': str(share_id), 'upload_token': upload_token } finally: yield f.close() self.write_json(response_data)