Guest User

Untitled

a guest
Mar 2nd, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.23 KB | None | 0 0
  1. from django.db import models
  2.  
  3. from django.contrib.auth.models import User
  4. from techblog.markup.fields import PickledObjectField
  5. from django.utils.safestring import mark_safe
  6. from django.core.urlresolvers import reverse
  7. from django.template.defaultfilters import slugify
  8.  
  9. from django.contrib.auth.models import User
  10.  
  11. from techblog.markup.render import render
  12. from techblog.markup.fields import MarkupField
  13. from techblog import broadcast
  14.  
  15. import markup
  16. import operator
  17. import datetime
  18. import os
  19. import os.path
  20. from itertools import groupby
  21.  
  22. from django.contrib.sitemaps import ping_google
  23.  
  24. @broadcast.recieve
  25. def new_content_on_site():
  26. ping_google('/sitemap.xml')
  27.  
  28.  
  29.  
  30.  
  31. #
  32. #from django.db.models.signals import post_save
  33. #
  34. #
  35. #def _process_tags_signal(sender, **kwargs):
  36. # sender.
  37. #
  38. #post_save.connect(process_tags, sender=Post)
  39.  
  40. class Author(models.Model):
  41.  
  42. user = models.ForeignKey(User)
  43.  
  44. bio = MarkupField(default="", blank=True, renderer=render)
  45.  
  46. ''' Modificacion del titulo Canales Autor '''
  47. class Meta:
  48. verbose_name_plural = "Canales Autor"
  49.  
  50.  
  51.  
  52. class Tag(models.Model):
  53.  
  54. blog = models.ForeignKey("Blog")
  55. name = models.CharField("Tag name", max_length=100)
  56. slug = models.SlugField(max_length=100, db_index=True)
  57.  
  58. template = models.CharField("Template", max_length=100, blank=True)
  59.  
  60. count = models.IntegerField(default=0, editable=False)
  61.  
  62. description = MarkupField(default="", blank=True, renderer=render)
  63.  
  64. def get_summary(self):
  65. if self.description_summary_html:
  66. return self.description_summary_html
  67. else:
  68. return self.description_html
  69.  
  70.  
  71. def decrement(self):
  72. count = self.count
  73. if count:
  74. count -= 1
  75. self.count = count
  76. return count
  77.  
  78. def increment(self):
  79. self.count += 1
  80. return self.count
  81.  
  82. def __unicode__(self):
  83. return "%s (in %s)" % (self.name, self.blog)
  84.  
  85. def posts(self):
  86.  
  87. now = datetime.datetime.now()
  88. posts = self.post_set.filter( published=True,
  89. display_time__lte=now,
  90. version="live",
  91. ).order_by('-display_time')
  92. return posts
  93.  
  94. @models.permalink
  95. def get_absolute_url(self):
  96. return ("blog_tag", (),
  97. dict(blog_slug=self.blog.slug, tag_slug=self.slug))
  98.  
  99. def get_blog_relative_url(self):
  100.  
  101. return "tag/%s/" % self.slug
  102.  
  103.  
  104. def get_feed(self):
  105. import feeds
  106. title = "RSS Feed for %s posts in %s" % (self.name, self.blog.title)
  107. url = feeds.BlogTagFeed.get_url(self)
  108. return dict(title=title, url=url)
  109.  
  110.  
  111. class ChannelTag(object):
  112.  
  113. def __init__(self, channel_slug, tag_slug):
  114. self.tag_slug = tag_slug
  115. self.tags = Tag.objects.filter(slug=self.tag_slug)
  116. self.channel = Channel.objects.get(slug=channel_slug)
  117. self.description_data = {}
  118. if not self.tags.count():
  119. raise Tag.DoesNotExist
  120.  
  121. def posts(self):
  122.  
  123. query = models.Q()
  124. for tag in self.tags:
  125. query = query | models.Q(id__in = tag.post_set.values('pk').query)
  126. posts = Post.published_posts.filter(query).order_by('-display_time')
  127.  
  128. return posts
  129.  
  130. def get_feed(self):
  131. import feeds
  132. name = Tag.objects.filter(slug=self.tag_slug)[0].name
  133. title = "RSS Feed for %s posts in %s" % (name, self.channel.title)
  134. url = feeds.ChannelTagFeed.get_url(self)
  135. return dict(title=title, url=url)
  136.  
  137. def get_absolute_url(self):
  138. try:
  139. return reverse("apps.blog.views.tag", kwargs=dict(blog_slug=self.channel.slug, tag_slug=self.tag_slug))
  140. except Exception, e:
  141. pass
  142.  
  143. def __getattr__(self, attr):
  144. return getattr(self.tags[0], attr)
  145.  
  146. ''' Modificacion del titulo Canales Tag '''
  147. class Meta:
  148. verbose_name_plural = "Canales Tag"
  149.  
  150.  
  151. class Channel(models.Model):
  152.  
  153. template = models.CharField("Template", max_length=100, blank=True)
  154.  
  155. title = models.CharField("Channel Title", max_length=100)
  156. tagline = models.CharField("Tag line", max_length=200)
  157. slug = models.SlugField(max_length=100, db_index=True)
  158. posts_per_page = models.IntegerField(default=10)
  159.  
  160. template = models.CharField("Template prefix", max_length=100, blank=True)
  161.  
  162. description = MarkupField(default="", renderer=render, blank=True)
  163.  
  164. blogs = models.ManyToManyField("Blog")
  165.  
  166. def is_channel(self):
  167. """ Returns True if this is a channel (for the benefit of tempalates) """
  168. return True
  169.  
  170. def child_blogs(self):
  171. return list(self.blogs.order_by('title'))
  172.  
  173. def get_full_template_name(self, template_name):
  174. return self.template.rstrip('/') + '/' + self.template
  175.  
  176. def get_template_names(self, template_name):
  177. template_prefix = self.template.rstrip('/')
  178. return [template_prefix + '/' + template_name, 'theme/'+template_name, template_name]
  179.  
  180.  
  181. def __unicode__(self):
  182. return self.title
  183.  
  184. def posts(self):
  185. now = datetime.datetime.now()
  186.  
  187. posts = Post.objects.filter( blog__in = self.blogs.all(),
  188. published=True,
  189. version="live",
  190. display_time__lte=now).order_by("-display_time")
  191. return posts
  192.  
  193.  
  194. def get_tag(self, tag_slug):
  195.  
  196. channel_tag = ChannelTag(self.slug, tag_slug)
  197. return channel_tag
  198.  
  199.  
  200. def tags(self):
  201.  
  202. tags = []
  203. for blog in self.blogs.all():
  204. tags += list(blog.tags())
  205. tags.sort(key=lambda t:t.slug)
  206.  
  207. collated_tags = []
  208. for tag_slug, similar_tags in groupby(tags, lambda t:t.slug):
  209. similar_tags = list(similar_tags)
  210. channel_tag = ChannelTag(self.slug, tag_slug)
  211.  
  212. channel_tag.slug = tag_slug
  213. channel_tag.name = similar_tags[0].name
  214. channel_tag.description = similar_tags[0].description
  215. channel_tag.count = sum(tag.count for tag in similar_tags)
  216.  
  217. collated_tags.append(channel_tag)
  218.  
  219. collated_tags.sort(key=lambda t:-t.count)
  220.  
  221. return collated_tags
  222.  
  223.  
  224. def get_tag_cloud(self, tag_count=30):
  225.  
  226. return TagCloud(self, max_tags=tag_count)
  227.  
  228.  
  229. @models.permalink
  230. def get_absolute_url(self):
  231.  
  232. channel_slug = self.slug
  233.  
  234. return ("blog_front", (),
  235. dict(blog_slug=channel_slug))
  236.  
  237. def get_feed(self):
  238. import feeds
  239. title = "%s RSS Feed"%self.title
  240. url = feeds.ChannelFeed.get_url(self)
  241. return dict(title=title, url=url)
  242.  
  243. def get_template_names(self, template_name, alternates=None):
  244.  
  245. alternates = alternates or []
  246.  
  247. alternates = [os.path.join(p, template_name) for p in alternates]
  248.  
  249. templates = []
  250. templates += alternates
  251. templates.append(os.path.join('blog', template_name))
  252.  
  253. return templates
  254.  
  255. ''' Modificacion del titulo Canales Tag '''
  256. class Meta:
  257. verbose_name_plural = "Canales Tag"
  258.  
  259.  
  260. class TagCloud(object):
  261.  
  262. def __init__(self, blog, max_tags = 30):
  263.  
  264. self.blog = blog
  265.  
  266. #self.tags = list( Tag.objects.filter(blog=blog).order_by("-count") )
  267. self.tags = list(blog.tags())
  268. if max_tags is not None:
  269. self.tags = self.tags[:max_tags]
  270.  
  271. self.min_font = 12.0
  272. self.max_font = 20.0
  273.  
  274. def set_scale(min_font, max_font):
  275.  
  276. self.min_font = min_font
  277. self.max_font = max_font
  278.  
  279. def __iter__(self):
  280.  
  281. tag_counts = [tag.count for tag in self.tags]
  282.  
  283. sorted_counts = sorted(list(set(tag_counts)))
  284. # tag_counts = [sorted_counts.index(count) for count in tag_counts]
  285.  
  286. places = [sorted_counts.index(tag.count) for tag in self.tags]
  287.  
  288. if not places:
  289. return
  290.  
  291. max_count = max(places)
  292. min_count = min(places)
  293. count_range = float(max_count - min_count)
  294.  
  295. font_size_range = self.max_font - self.min_font
  296.  
  297. tag_cloud = []
  298. for place, tag in zip(places, self.tags):
  299.  
  300. tag_scale = (place - min_count) / (count_range or 1.0)
  301. tag_scale = int(round(tag_scale * 10))
  302.  
  303. tag_cloud.append( (tag_scale, tag) )
  304.  
  305. #tag_cloud = tag_cloud[::2][::-1] + tag_cloud[1::2]
  306. #tag_cloud = tag_cloud[::-1]
  307.  
  308. for size_tag in tag_cloud:
  309. yield size_tag
  310.  
  311.  
  312. class Blog(models.Model):
  313.  
  314. owner = models.ForeignKey(User)
  315. created_time = models.DateTimeField(auto_now_add=True)
  316. title = models.CharField("Title of the Blog", max_length=100)
  317. tagline = models.CharField("Tag line", max_length=200, blank=True)
  318. slug = models.SlugField(max_length=100, unique=True, db_index=True)
  319. posts_per_page = models.IntegerField(default=10)
  320.  
  321. template = models.CharField("Template path", max_length=100)
  322.  
  323. description = MarkupField(default="", renderer=render, blank=True)
  324.  
  325. def get_full_template_name(self, template_name):
  326. return self.template.rstrip('/') + '/' + self.template
  327.  
  328. def get_template_names(self, template_name, alternates=None):
  329.  
  330. alternates = alternates or []
  331.  
  332. alternates = [os.path.join(p, template_name) for p in alternates]
  333.  
  334. templates = []
  335. templates += alternates
  336. templates.append(os.path.join('blog', template_name))
  337.  
  338. return templates
  339.  
  340.  
  341. def __unicode__(self):
  342. return self.title
  343.  
  344. def posts(self):
  345. now = datetime.datetime.now()
  346. posts = self.post_set.filter(published=True,
  347. version="live",
  348. display_time__lte=now).order_by("-display_time")
  349. return posts
  350.  
  351. def get_tag(self, tag_slug):
  352. return Tag.objects.get(blog=self, slug=tag_slug)
  353.  
  354. def tags(self):
  355. return self.tag_set.all().order_by("-count")
  356.  
  357. @models.permalink
  358. def get_absolute_url(self):
  359.  
  360. blog_slug = self.slug
  361.  
  362. return ("blog_front", (),
  363. dict(blog_slug=blog_slug))
  364.  
  365. def get_tag_cloud(self, tag_count=30):
  366.  
  367. return TagCloud(self, max_tags=tag_count)
  368.  
  369.  
  370. def get_feed(self):
  371. import feeds
  372. title = "%s RSS Feed"%self.title
  373. url = feeds.BlogFeed.get_url(self)
  374. return dict(title=title, url=url)
  375.  
  376. class PublisedPostManager(models.Manager):
  377.  
  378. def get_query_set(self):
  379. posts = super(PublisedPostManager, self).get_query_set()
  380. now = datetime.datetime.now()
  381. posts = posts.filter(published=True, display_time__lt=now, version="live")
  382.  
  383. return posts
  384.  
  385. class Post(models.Model):
  386.  
  387. blog = models.ForeignKey(Blog)
  388.  
  389. title = models.CharField("Post Title", max_length=100)
  390. slug = models.SlugField("Post Slug", max_length=100, db_index=True)
  391. published = models.BooleanField("Published?", default=False)
  392. guid = models.CharField(max_length=255, blank=True)
  393.  
  394. allow_comments = models.BooleanField("Allow Comments?", default=True)
  395. show_comments = models.BooleanField("Show Comments?", default=True)
  396.  
  397. series = models.CharField("Series name", max_length=100, blank=True, default="")
  398. source = models.CharField("Post source", max_length=100, blank=True, default="")
  399.  
  400. created_time = models.DateTimeField(auto_now_add=True)
  401. edit_time = models.DateTimeField(auto_now=True)
  402. display_time = models.DateTimeField("Display Time", default=datetime.datetime.now)
  403.  
  404. tags = models.ManyToManyField("Tag", blank=True)
  405.  
  406. tags_text = models.TextField("Comma separated tags", default="", blank=True)
  407.  
  408. content = MarkupField(default="", renderer=render, blank=True)
  409.  
  410. version = models.CharField("Version", max_length=100, default="live")
  411. version_id = models.IntegerField("Parent Post ID", blank=True, null=True)
  412.  
  413. template_path = models.CharField("Template path (blank for default)", max_length=100, default="", blank=True)
  414.  
  415. #created_time = models.DateTimeField(auto_now_add=True)
  416.  
  417. objects = models.Manager()
  418. published_posts = PublisedPostManager()
  419.  
  420. def get_tags(self):
  421. return self.tags.filter(count__gt=0)
  422.  
  423. def get_template_names(self, name="default"):
  424.  
  425. templates = []
  426. if self.template_path:
  427. templates.append( os.path.join(self.template_path, name) )
  428.  
  429. templates.append( os.path.join("blog/posts/", name) )
  430. return templates
  431.  
  432. def is_series(self):
  433. return bool(self.series)
  434.  
  435. def get_series(self):
  436. posts = Post.objects.filter(series=self.series).order_by('display_time')
  437. index_posts = [(i+1, post) for i, post in enumerate(posts)]
  438.  
  439. current_part = None
  440. for i, post in index_posts:
  441. if post is self:
  442. current_part = i
  443. break
  444.  
  445. return index_posts, current_part
  446.  
  447. def get_summary(self):
  448. if self.content_summary_html:
  449. return self.content_summary_html
  450. else:
  451. return self.content_html
  452.  
  453. def get_admin_abbrev(self):
  454. if len(self.content_text) < 100:
  455. return self.content_text
  456. return self.content_text[:100]+" [...]"
  457. get_admin_abbrev.short_description = "Content (abbreviated)"
  458.  
  459. def get_admin_html(self):
  460. return self.html
  461. get_admin_html.allow_tags = True
  462.  
  463. def __unicode__(self):
  464. if self.version == 'live':
  465. return self.title
  466. return "%s [%s]" % (self.title, self.version.upper())
  467.  
  468. def date_url(self):
  469. year = self.display_time.year
  470. month = self.display_time.month
  471. day = self.display_time.day
  472. return "%d/%d/%d/%s" % (year, month, day, self.slug)
  473.  
  474. @models.permalink
  475. def get_absolute_url(self):
  476.  
  477. blog_slug = self.blog.slug
  478.  
  479. slug = self.slug
  480. if '|' in slug:
  481. slug = slug.split('|', 1)[-1]
  482.  
  483. year = self.display_time.year
  484. month = self.display_time.month
  485. day = self.display_time.day
  486.  
  487. return ("blog_post", (),
  488. dict(blog_slug=blog_slug, year=year, month=month, day=day, slug=slug))
  489.  
  490. def get_blog_relative_url(self):
  491.  
  492. year = self.display_time.year
  493. month = self.display_time.month
  494. day = self.display_time.day
  495.  
  496. return "%i/%i/%i/%s/" % (year, month, day, self.slug)
  497.  
  498.  
  499. def _remove_tags(self):
  500.  
  501. if self.pk is not None:
  502.  
  503. if self.version != 'live':
  504. return
  505. tags = Tag.objects.filter(blog=self.blog, post=self)
  506. for tag in self.tags.all():
  507. tag.decrement()
  508. tag.save()
  509. self.tags.remove(tag)
  510.  
  511.  
  512. def _add_tags(self):
  513.  
  514. """Creates tags or increments tag counts as neccesary.
  515.  
  516. """
  517.  
  518. if self.version != 'live':
  519. return
  520.  
  521. tags = [t.strip() for t in self.tags_text.split(',')]
  522. tags = list(set(tags))
  523.  
  524. for tag_name in tags:
  525. tag_slug = slugify(tag_name)
  526. if tag_slug:
  527. try:
  528. tag = Tag.objects.get(blog=self.blog, slug=tag_slug)
  529. except Tag.DoesNotExist:
  530. tag = Tag( blog = self.blog,
  531. name = tag_name,
  532. slug = tag_slug)
  533.  
  534. tag.increment()
  535. tag.save()
  536.  
  537. self.tags.add(tag)
  538.  
  539. def delete(self, *args, **kwargs):
  540. self._remove_tags()
  541. super(Post, self).delete(*args, **kwargs)
  542.  
  543. def save(self, *args, **kwargs):
  544.  
  545. self._remove_tags()
  546. super(Post, self).save(*args, **kwargs)
  547. self._add_tags()
  548. if self.version == 'live' and self.published:
  549. broadcast.safe_first.new_content_on_site()
  550.  
  551. def get_tags(self):
  552.  
  553. tags = list(self.tags.all())
  554. tags.sort(key=lambda t:t.name.lower())
  555. return tags
  556.  
  557. def is_new(self):
  558.  
  559. age = datetime.datetime.now() - self.display_time
  560. return age.days < 7
  561.  
  562.  
  563. def get_parent_version(self):
  564.  
  565. if self.version_id is None:
  566. return self
  567. parent_post = Post.objects.get(self.version_id)
  568. return parent_post
  569.  
  570.  
  571. def get_version(self, version):
  572.  
  573. """Creates a draft post that can be used for previews."""
  574.  
  575. if self.version == version:
  576. return self
  577.  
  578. #version_slug = self.get_version_slug(version)
  579.  
  580. parent_version_id = self.get_parent_version().id
  581.  
  582. try:
  583. versioned_post = Post.objects.get(blog=self.blog, version_id=parent_version_id, version=version)
  584. return versioned_post
  585. except Post.DoesNotExist:
  586. versioned_post = Post(version_id=parent_version_id, published=False, blog=self.blog, version=version)
  587. versioned_post.save()
  588.  
  589. copy_attribs = ['title',
  590. 'tags_text',
  591. 'content',
  592. 'content_markup_type',
  593. 'allow_comments',
  594. 'published',
  595. 'display_time',
  596. 'slug']
  597.  
  598. for attrib in copy_attribs:
  599. setattr(versioned_post, attrib, getattr(self, attrib))
  600. versioned_post.save()
  601.  
  602. return versioned_post
  603.  
  604. def delete_version(self, version):
  605.  
  606. """Removes the draft object associated with a post."""
  607.  
  608. parent_version_id = self.get_parent_version().id
  609.  
  610. try:
  611. versioned_post = Post.objects.get(blog=self.blog,
  612. version_id=parent_version_id,
  613. version=version)
  614. versioned_post.delete()
  615. except Post.DoesNotExist:
  616. pass
  617.  
  618. def version_exists(self, version):
  619.  
  620. parent_version_id = self.get_parent_version().id
  621.  
  622. try:
  623. versioned_post = Post.objects.get(blog=self.blog, version_id=parent_version_id, version=version)
  624. return True
  625. except Post.DoesNotExist:
  626. return False
  627.  
  628.  
  629.  
  630. def get_related_posts(self, count=10):
  631.  
  632. post = self
  633. if post.version != "live":
  634. slug = self.slug.split('|', 1)[-1]
  635. try:
  636. post = Post.objects.get(slug=slug, version="live")
  637. except Post.DoesNotExist:
  638. pass
  639. blog = post.blog
  640.  
  641. tags = list(post.tags.all())
  642.  
  643. posts = Post.objects.filter(blog=blog, tags__in=tags).exclude(pk=post.id).order_by('-display_time')[:1000]
  644.  
  645. def count_iter(i):
  646. return sum(1 for _ in i)
  647.  
  648. counts_and_posts = [(post, count_iter(similar_posts)) for post, similar_posts in groupby(posts)]
  649.  
  650. if counts_and_posts:
  651. max_count = max(counts_and_posts, key=lambda c:c[1])[1]
  652. min_count = min(counts_and_posts, key=lambda c:c[1])[1]
  653.  
  654. if min_count != max_count:
  655. counts_and_posts = [cap for cap in counts_and_posts if cap[1] != min_count]
  656.  
  657. counts_and_posts.sort(key=lambda i:(i[1], i[0].display_time))
  658. return [cp[0] for cp in reversed(counts_and_posts[-count:])]
  659.  
  660.  
  661.  
  662.  
  663. # nueva tabla
  664. class MediaPost(models.models):
  665. name = models.CharField(max_length=50)
  666. types = models.CharField(max_length=10)
  667. foto = models.ImageField(upload_to='/tmp')
  668.  
  669.  
  670. class Microblog(models.Model):
  671.  
  672. enabled = models.BooleanField("Enabled?", default=True)
  673.  
  674. blog = models.ForeignKey(Blog)
  675. service = models.CharField("Service", max_length=100, default="twitter", blank=True)
  676. tags = models.CharField("Tags", max_length=200)
  677. url = models.CharField("Url", max_length=255, default="", blank=True)
  678. username = models.CharField(max_length=100, blank=True)
  679. password = models.CharField(max_length=100, blank=True)
  680. poll_minutes = models.IntegerField(default=10)
  681. template_path = models.CharField(max_length=255)
  682.  
  683. next_poll_time = models.DateTimeField("Time to next poll", auto_now_add=True)
Add Comment
Please, Sign In to add comment