forked from gergely/calendar-social
		
	Create a basic month view
This commit is contained in:
		@@ -14,6 +14,7 @@
 | 
				
			|||||||
# You should have received a copy of the GNU Affero General Public License
 | 
					# You should have received a copy of the GNU Affero General Public License
 | 
				
			||||||
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
					# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from datetime import datetime
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from flask import Flask, current_app, redirect, render_template, url_for
 | 
					from flask import Flask, current_app, redirect, render_template, url_for
 | 
				
			||||||
@@ -69,10 +70,14 @@ app = CalendarSocialApp(__name__)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@app.route('/')
 | 
					@app.route('/')
 | 
				
			||||||
def hello():
 | 
					def hello():
 | 
				
			||||||
 | 
					    from app.calendar_system.gregorian import GregorianCalendar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if not current_user.is_authenticated:
 | 
					    if not current_user.is_authenticated:
 | 
				
			||||||
        return render_template('welcome.html')
 | 
					        return render_template('welcome.html')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return render_template('index.html')
 | 
					    calendar = GregorianCalendar(datetime.utcnow().timestamp())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return render_template('index.html', calendar=calendar)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@app.route('/register', methods=['POST', 'GET'])
 | 
					@app.route('/register', methods=['POST', 'GET'])
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										15
									
								
								app/calendar_system/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								app/calendar_system/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					class CalendarSystem:
 | 
				
			||||||
 | 
					    __has_months__ = False
 | 
				
			||||||
 | 
					    __has_weeks__ = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def day_names(self):
 | 
				
			||||||
 | 
					        raise NotImplementedError()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def month(self):
 | 
				
			||||||
 | 
					        raise NotImplementedError()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def days(self):
 | 
				
			||||||
 | 
					        raise NotImplementedError()
 | 
				
			||||||
							
								
								
									
										48
									
								
								app/calendar_system/gregorian.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								app/calendar_system/gregorian.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					from datetime import datetime, timedelta
 | 
				
			||||||
 | 
					from flask_babel import lazy_gettext as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from . import CalendarSystem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GregorianCalendar(CalendarSystem):
 | 
				
			||||||
 | 
					    __name__ = _('Gregorian')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    __has_months__ = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    START_DAY = 0
 | 
				
			||||||
 | 
					    END_DAY = 7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    day_names = (
 | 
				
			||||||
 | 
					        _('Monday'),
 | 
				
			||||||
 | 
					        _('Tuesday'),
 | 
				
			||||||
 | 
					        _('Wednesday'),
 | 
				
			||||||
 | 
					        _('Thursday'),
 | 
				
			||||||
 | 
					        _('Friday'),
 | 
				
			||||||
 | 
					        _('Saturday'),
 | 
				
			||||||
 | 
					        _('Sunday'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, timestamp):
 | 
				
			||||||
 | 
					        self.timestamp = datetime.utcfromtimestamp(timestamp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def month(self):
 | 
				
			||||||
 | 
					        return self.timestamp.strftime("%B, %Y")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def days(self):
 | 
				
			||||||
 | 
					        day_list = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        start_day = self.timestamp.replace(day=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while start_day.weekday() > self.START_DAY:
 | 
				
			||||||
 | 
					            start_day -= timedelta(days=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        day_list.append(start_day)
 | 
				
			||||||
 | 
					        current_day = start_day
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while current_day.weekday() < self.END_DAY and current_day.month <= self.timestamp.month:
 | 
				
			||||||
 | 
					            current_day += timedelta(days=1)
 | 
				
			||||||
 | 
					            day_list.append(current_day)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return day_list
 | 
				
			||||||
@@ -2,4 +2,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
{% block content %}
 | 
					{% block content %}
 | 
				
			||||||
{{ _('Welcome to Calendar.social, %(username)s!', username=current_user.username) }}
 | 
					{{ _('Welcome to Calendar.social, %(username)s!', username=current_user.username) }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% include 'month-view.html' %}
 | 
				
			||||||
{% endblock content %}
 | 
					{% endblock content %}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										82
									
								
								app/templates/month-view.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								app/templates/month-view.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					<style>
 | 
				
			||||||
 | 
					 table.calendar > * {
 | 
				
			||||||
 | 
					     font-family: sans;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 table.calendar {
 | 
				
			||||||
 | 
					     width: 100%;
 | 
				
			||||||
 | 
					     border-collapse: collapse;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 tr.month > td {
 | 
				
			||||||
 | 
					     text-align: center;
 | 
				
			||||||
 | 
					     font-weight: bold;
 | 
				
			||||||
 | 
					     border-bottom: 2px solid black;
 | 
				
			||||||
 | 
					     padding-bottom: .5em;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 tr.days > td {
 | 
				
			||||||
 | 
					     text-align: center;
 | 
				
			||||||
 | 
					     border-bottom: 2px solid black;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 tr.week > td {
 | 
				
			||||||
 | 
					     height: 3em;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 tr.week > td > span.day-num {
 | 
				
			||||||
 | 
					     font-weight: bold;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 tr.week > td.other-month > span.day-num {
 | 
				
			||||||
 | 
					     font-weight: normal;
 | 
				
			||||||
 | 
					     color: #909090;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 tr.week > td.today {
 | 
				
			||||||
 | 
					     background-color: #d8d8d8;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 td > div.event {
 | 
				
			||||||
 | 
					     border: 1px solid green;
 | 
				
			||||||
 | 
					     background-color: white;
 | 
				
			||||||
 | 
					     border-radius: 2px;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					<table class="calendar">
 | 
				
			||||||
 | 
					    <thead>
 | 
				
			||||||
 | 
					        <tr class="month">
 | 
				
			||||||
 | 
					            <td colspan="7">{{ calendar.month }}</td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        <tr class="days">
 | 
				
			||||||
 | 
					{% for day in calendar.day_names %}
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                {{ day }}
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					{% endfor %}
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					    </thead>
 | 
				
			||||||
 | 
					    <tbody>
 | 
				
			||||||
 | 
					{% set markers = namespace() -%}
 | 
				
			||||||
 | 
					{% set markers.first = true -%}
 | 
				
			||||||
 | 
					{% for day in calendar.days -%}
 | 
				
			||||||
 | 
					    {% if loop.index0 % (calendar.day_names) | length == 0 -%}
 | 
				
			||||||
 | 
					        {% if not markers.first %}
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					        {%- else %}
 | 
				
			||||||
 | 
					            {%- set markers.first = false %}
 | 
				
			||||||
 | 
					        {%- endif %}
 | 
				
			||||||
 | 
					        <tr class="week">
 | 
				
			||||||
 | 
					    {%- endif %}
 | 
				
			||||||
 | 
					            <td class="{% if day.month != calendar.timestamp.month %} other-month{% endif %}{% if day.date() == calendar.timestamp.date() %} today{% endif %}">
 | 
				
			||||||
 | 
					                <span class="day-num">{{ day.day }}</span>
 | 
				
			||||||
 | 
					    {% if day.date() == calendar.timestamp.date() %}
 | 
				
			||||||
 | 
					                <div class="event">
 | 
				
			||||||
 | 
					                    This is a task
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					{% endfor %}
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					    </tbody>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user