def get_images_collaborative(user, key_words, pictograms): def callback(images_used): return images_used.user recommended_images = pictograms images = Image.query(ndb.OR(Image.keyWords.keyWord.IN(key_words), Image.tags.tag.IN(key_words))).fetch(keys_only=True) if len(images) > 0: query = ImageUsed.query(ImageUsed.image.IN(images)) if query.count() > 0: users = query.map(callback) query = RelatedUsers.query(ndb.OR(RelatedUsers.user1 == user, RelatedUsers.user2 == user)).filter( ndb.OR(RelatedUsers.user1.IN(users), RelatedUsers.user2.IN(users))).order(- RelatedUsers.relation) related = query.fetch(LIMIT_OF_RUSERS) for ru in related: if ru.relation > MINIMUM_RELATION: related_user = ru.get_related_user(user) images_used = ImageUsed.query(ImageUsed.user == related_user, ImageUsed.image.IN(images)).order(ImageUsed.count) for image_used in images_used: image = image_used.image if not (image.id() in recommended_images): recommended_images.append({tfg_server.BLOB: image.id(), tfg_server.LINK: image.get().link}) break if len(recommended_images) > IMAGES_COLLABORATIVE: break else: break return recommended_images
def update_images_used(image, user): images_used = ImageUsed.get_by_id(image.id() + user.id()) if images_used is not None: images_used.count += 1 else: images_used = ImageUsed(image=image, user=user, count=1, id=image.id() + user.id()) update_related_users(user, image) images_used.put()
def update_related_users(user1, image): images_used = ImageUsed.query(ImageUsed.image == image) for imgUsed in images_used: user2 = imgUsed.user r_user = RelatedUsers.query(RelatedUsers.user1.IN([user1, user2]), RelatedUsers.user2.IN([user1, user2])).get() if r_user is not None: r_user.relation += 1 else: r_user = RelatedUsers(user1=user1, user2=user2, relation=1) r_user.put()
def get_images_content(user): favorite_sites = [] sites = {} images_used = ImageUsed.query(ImageUsed.user == user) for image_used in images_used: image = image_used.image.get() try: sites[image.siteLink] += math.log(image_used.count) except KeyError: sites[image.siteLink] = math.log(image_used.count) if len(sites) > 0: median = int(numpy.median(sites.values())) sorted_sites = sorted(sites, key=sites.__getitem__, reverse=True) for i in range(IMAGES_CONTENT): if i < len(sorted_sites) and sites[sorted_sites[i]] > 2 * median: favorite_sites.append(sorted_sites[i]) else: break return favorite_sites