Private
Public Access
1
0

tests and fixes before release

This commit is contained in:
2025-01-01 12:45:06 +01:00
parent e42d3b1957
commit ba9ad2a98e
6 changed files with 222 additions and 192 deletions

View File

@@ -187,7 +187,7 @@ def remove_nulls_pl(data):
data = data.lazy().with_columns( data = data.lazy().with_columns(
pl.when( pl.when(
pl.all().is_infinite() pl.all().is_infinite()
).then(None).otherwise(pl.all()).keep_name() ).then(None).otherwise(pl.all()).name.keep() # keep_name()
) )
data = data.select(pl.all().forward_fill()) data = data.select(pl.all().forward_fill())
data = data.select(pl.all().backward_fill()) data = data.select(pl.all().backward_fill())

View File

@@ -735,6 +735,8 @@ class IntervalsIntegration(SyncIntegration):
result = self.update_workout(id) result = self.update_workout(id)
except Workout.DoesNotExist: except Workout.DoesNotExist:
result = self.get_workout(id, do_async=False) result = self.get_workout(id, do_async=False)
except ValueError:
result = self.get_workout(id, do_async=False)
except KeyError: except KeyError:
pass pass

View File

@@ -4492,7 +4492,10 @@ for name, d in rowingmetrics:
class Meta: class Meta:
db_table = 'strokedata' db_table = 'strokedata'
index_together = ['workoutid'] #index_together = ['workoutid']
indexes = [
models.Index(fields=['workoutid'])
]
app_label = 'rowers' app_label = 'rowers'
@@ -4517,7 +4520,10 @@ class cpdata(models.Model):
class Meta: class Meta:
db_table = 'cpdata' db_table = 'cpdata'
index_together = ['user'] #index_together = ['user']
indexes = [
models.Index(fields=['user'])
]
app_label = 'rowers' app_label = 'rowers'
@@ -4529,7 +4535,10 @@ class cpergdata(models.Model):
class Meta: class Meta:
db_table = 'cpergdata' db_table = 'cpergdata'
index_together = ['user'] #index_together = ['user']
indexes = [
models.Index(fields=['user'])
]
app_label = 'rowers' app_label = 'rowers'
@@ -4542,7 +4551,10 @@ class ergcpdata(models.Model):
class Meta: class Meta:
db_table = 'ergcpdata' db_table = 'ergcpdata'
index_together = ['user'] #index_together = ['user']
indexes = [
models.Index(fields=['user'])
]
app_label = 'rowers' app_label = 'rowers'
# A wrapper around the png files # A wrapper around the png files

View File

@@ -210,7 +210,7 @@ class WorkoutFactory(factory.DjangoModelFactory):
name = factory.LazyAttribute(lambda _: faker.word()) name = factory.LazyAttribute(lambda _: faker.word())
notes = faker.text() notes = faker.text()
startdatetime = FuzzyDateTime(start_dt=one_month_ago, force_year=datetime.date.today().year) startdatetime = FuzzyDateTime(start_dt=one_month_ago) #, force_year=datetime.date.today().year)
starttime = get_random_file(name=faker.word())['starttime'] starttime = get_random_file(name=faker.word())['starttime']
workouttype='water' workouttype='water'
date=startdatetime.evaluate(2,None, False).date() date=startdatetime.evaluate(2,None, False).date()

Binary file not shown.

View File

@@ -11,7 +11,7 @@
<head> <head>
<title>{% block title %}Rowsandall Rowing Data Analytics{% endblock %}</title> <title>{% block title %}Rowsandall Rowing Data Analytics{% endblock %}</title>
{% analytical_head_top %} {% analytical_head_top %}
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css"/> <link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css"/>
<link rel="stylesheet" type="text/css" href="/static/admin/css/widgets.css"/> <link rel="stylesheet" type="text/css" href="/static/admin/css/widgets.css"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" > <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" >
@@ -47,62 +47,65 @@
<link rel="stylesheet" href="/static/css/rowsandall2.css" /> <link rel="stylesheet" href="/static/css/rowsandall2.css" />
{% block meta %} {% endblock %} {% block meta %} {% endblock %}
<div id="fb-root"></div> <div id="fb-root"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>(function(d, s, id) { <script>
var js, fjs = d.getElementsByTagName(s)[0]; (function(d, s, id) {
if (d.getElementById(id)) return; var js, fjs = d.getElementsByTagName(s)[0];
js = d.createElement(s); js.id = id; if (d.getElementById(id)) return;
js.async=true; js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.10&appId=694685920739849"; js.async=true;
fjs.parentNode.insertBefore(js, fjs); js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.10&appId=694685920739849";
}(document, 'script', 'facebook-jssdk'));</script> fjs.parentNode.insertBefore(js, fjs);
<script> }(document, 'script', 'facebook-jssdk'));
$(document).ready(function (){ </script>
}) <script>
$(document).ready(function (){
</script> })
</script>
<link rel="stylesheet" href="https://webapiv2.navionics.com/dist/webapi/webapi.min.css" > <link rel="stylesheet" href="https://webapiv2.navionics.com/dist/webapi/webapi.min.css" >
<script type="text/javascript" src="https://webapiv2.navionics.com/dist/webapi/webapi.min.no-dep.js"></script> <script type="text/javascript" src="https://webapiv2.navionics.com/dist/webapi/webapi.min.no-dep.js"></script>
<script src="https://kit.fontawesome.com/8ec1edfba3.js" crossorigin="anonymous"></script> <script src="https://kit.fontawesome.com/8ec1edfba3.js" crossorigin="anonymous"></script>
<script>window.twttr = (function(d, s, id) { <script>
var js, fjs = d.getElementsByTagName(s)[0], window.twttr = (function(d, s, id) {
t = window.twttr || {}; var js, fjs = d.getElementsByTagName(s)[0],
if (d.getElementById(id)) return t; t = window.twttr || {};
js = d.createElement(s); if (d.getElementById(id)) return t;
js.id = id; js = d.createElement(s);
js.async=true; js.id = id;
js.src = "https://platform.twitter.com/widgets.js"; js.async=true;
fjs.parentNode.insertBefore(js, fjs); js.src = "https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
t._e = []; t._e = [];
t.ready = function(f) { t.ready = function(f) {
t._e.push(f); t._e.push(f);
}; };
return t; return t;
}(document, "script", "twitter-wjs"));</script> }(document, "script", "twitter-wjs"));
</script>
<script id="script-batch" type="text/javascript"> <script id="script-batch" type="text/javascript">
(function(d){ (function(d){
var js = d.createElement('script'); js.async = true; js.defer = true; var js = d.createElement('script'); js.async = true; js.defer = true;
js.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"; js.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js";
d.getElementsByTagName('head')[0].appendChild(js); d.getElementsByTagName('head')[0].appendChild(js);
}(document)); }(document));
</script> </script>
<script defer <script defer
type="text/javascript" type="text/javascript"
src="//assets.pinterest.com/js/pinit.js" src="//assets.pinterest.com/js/pinit.js"
> >
</script> </script>
<script> <script>
window.addEventListener('DOMContentLoaded', function() { window.addEventListener('DOMContentLoaded', function() {
$(document).ready(function(){ $(document).ready(function(){
var accordionsMenu = $('.cd-accordion-menu'); var accordionsMenu = $('.cd-accordion-menu');
if( accordionsMenu.length > 0 ) { if( accordionsMenu.length > 0 ) {
accordionsMenu.each(function(){ accordionsMenu.each(function(){
var accordion = $(this); var accordion = $(this);
//detect change in the input[type="checkbox"] value //detect change in the input[type="checkbox"] value
@@ -115,7 +118,7 @@
} }
}); });
}); });
</script> </script>
<script> <script>
window.addEventListener('DOMContentLoaded', function() { window.addEventListener('DOMContentLoaded', function() {
@@ -127,10 +130,10 @@
</script> </script>
{% analytical_head_bottom %} {% analytical_head_bottom %}
</head> </head>
<body data-root="https://webapiv2.navionics.com/dist/webapi/images"> <body data-root="https://webapiv2.navionics.com/dist/webapi/images">
<div class="wrapper"> <div class="wrapper">
<header class="main-head"> <header class="main-head">
<ul> <ul>
<li> <li>
@@ -144,7 +147,7 @@
</li> </li>
</ul> </ul>
</header> </header>
<user class="main-user"> <user class="main-user">
<ul> <ul>
<li> <li>
@@ -164,8 +167,8 @@
{% else %} {% else %}
<a href="/rowers/me/preferences/" title="Profile"> <a href="/rowers/me/preferences/" title="Profile">
<i class="fas fa-user"></i> <i class="fas fa-user"></i>
{% endif %} {% endif %}
</a> </a>
</li> </li>
{% if user.rower|usermessages %} {% if user.rower|usermessages %}
<li> <li>
@@ -191,14 +194,14 @@
<i class="fas fa-sign-in-alt "></i> <i class="fas fa-sign-in-alt "></i>
</a> </a>
</li> </li>
{% endif %} {% endif %}
</ul> </ul>
</user> </user>
<side-nav class="side-nav"> <side-nav class="side-nav">
&nbsp; &nbsp;
</side-nav> </side-nav>
<nav class="main-nav"> <nav class="main-nav">
<ul> <ul>
<li id="nav-workouts"> <li id="nav-workouts">
@@ -231,7 +234,7 @@
</li> </li>
</ul> </ul>
</nav> </nav>
<main class="content"> <main class="content">
<ul class="main-content"> <ul class="main-content">
{% if WARNING_MESSAGE != '' %} {% if WARNING_MESSAGE != '' %}
@@ -242,17 +245,17 @@
</li> </li>
{% endif %} {% endif %}
{% if user.rower.planexpires and user.rower|notfree and user.rower.paymenttype == 'single'%} {% if user.rower.planexpires and user.rower|notfree and user.rower.paymenttype == 'single'%}
{% if user.rower.planexpires|is_future_date %} {% if user.rower.planexpires|is_future_date %}
{% if user.rower.planexpires|date_dif|ddays < 4 %} {% if user.rower.planexpires|date_dif|ddays < 4 %}
<li class="grid_4"> <li class="grid_4">
<p class="successmessage"> <p class="successmessage">
You have {{ user.rower.planexpires|date_dif|ddays }} days left of your one year subscription. Please renew on or before {{ user.rower.planexpires }} or your plan will be reset to Basic. Click <a href="/rowers/paidplans/">here</a> to renew your membership.</p> You have {{ user.rower.planexpires|date_dif|ddays }} days left of your one year subscription. Please renew on or before {{ user.rower.planexpires }} or your plan will be reset to Basic. Click <a href="/rowers/paidplans/">here</a> to renew your membership.</p>
</li> </li>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if user.rower.protrialexpires and user.rower.protrialexpires|is_future_date %} {% if user.rower.protrialexpires and user.rower.protrialexpires|is_future_date %}
{% if user.rower.plantrialexpires and user.rower.plantrialexpires|is_future_date and user.rower.rowerplan != 'plan' %} {% if user.rower.plantrialexpires and user.rower.plantrialexpires|is_future_date and user.rower.rowerplan != 'plan' %}
<li class="grid_4"> <li class="grid_4">
<p class="successmessage"> <p class="successmessage">
{{ user.rower.protrialexpires|date_dif|ddays }} days left of your Self-Coach trial - Would you like to <a href="/rowers/paidplans/">upgrade now?</a> {{ user.rower.protrialexpires|date_dif|ddays }} days left of your Self-Coach trial - Would you like to <a href="/rowers/paidplans/">upgrade now?</a>
@@ -268,7 +271,7 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if user.rower.coachtrialexpires and user.rower.coachtrialexpires|is_future_date and user.rower.rowerplan != 'coach' %} {% if user.rower.coachtrialexpires and user.rower.coachtrialexpires|is_future_date and user.rower.rowerplan != 'coach' %}
<li class="grid_4"> <li class="grid_4">
<p class="successmessage"> <p class="successmessage">
{{ user.rower.coachtrialexpires|date_dif|ddays }} days left of your Coach trial - Would you like to <a href="/rowers/paidplans/">upgrade now?</a> {{ user.rower.coachtrialexpires|date_dif|ddays }} days left of your Coach trial - Would you like to <a href="/rowers/paidplans/">upgrade now?</a>
@@ -285,7 +288,7 @@
{% if messages %} {% if messages %}
{% for message in messages %} {% for message in messages %}
<li class="grid_4"> <li class="grid_4">
{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %} {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}
<p class="message"> <p class="message">
{% else %} {% else %}
<p class="successmessage"> <p class="successmessage">
@@ -311,16 +314,16 @@
</li> </li>
{% endif %} {% endif %}
</ul> </ul>
{% block main %} {% block main %}
{% endblock %} {% endblock %}
</main> </main>
<aside class="side"> <aside class="side">
{% block sidebar %} {% block sidebar %}
{% endblock %} {% endblock %}
</aside> </aside>
<ad class="ad"> <ad class="ad">
{% if request|announcements %} {% if request|announcements %}
<h2>News</h2> <h2>News</h2>
@@ -331,7 +334,7 @@
{{ a.announcement|urlshorten:20 }} {{ a.announcement|urlshorten:20 }}
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% if user.is_authenticated and user|nogoals %} {% if user.is_authenticated and user|nogoals %}
@@ -340,97 +343,110 @@
</p> </p>
{% endif %} {% endif %}
{% block ad %} {% block ad %}
<div class="site-announcement-box"> <div class="site-announcement-box">
<div class="site-announcement-white"> <div class="site-announcement-white">
<a href="https://wp.me/P8g86e-Bs">Please take 2 minutes to fill out the survey!</a> <a href="https://wp.me/P8g86e-Bs">Please take 2 minutes to fill out the survey!</a>
</div> </div>
</div> </div>
<div class="site-announcement-box"> <div class="site-announcement-box">
<div class="site-announcement-white"> <div class="site-announcement-white">
<a href="/rowers/plans/">Need a training plan? Take a look at our NEW training plan section!</a> <a href="/rowers/plans/">Need a training plan? Take a look at our training plan section!</a>
</div> </div>
</div> </div>
<div id="id_blogs"> <div id="id_blogs">
</div> </div>
{% if user.is_authenticated and user.rower.rowerplan == 'basic' %}
<div class="site-announcement-box">
<div class="site-announcement-white">
<a href="/rowers/paidplans/">Support us and get more features!</a>
</div>
</div>
{% elif user.is_authenticated and user.rower.rowerplan == 'pro' %}
<div class="site-announcement-box">
<div class="site-announcement-white">
<i class="fa-solid fa-user-astronaut "></i> Thank you for supporting Rowsandall.com!
</div>
</div>
{% endif %}
{% endblock %} {% endblock %}
</ad> </ad>
<footer class="main-footer"> <footer class="main-footer">
<p>Follow us on <p>Follow us on
<a href="https://www.facebook.com/rowsandall"> <a href="https://www.facebook.com/rowsandall">
<i class="fab fa-facebook"></i> <i class="fab fa-facebook"></i>
</a>&nbsp; </a>&nbsp;
<a href="https://www.instagram.com/roosendaalsander/"> <a href="https://www.instagram.com/roosendaalsander/">
<i class="fab fa-instagram"></i> <i class="fab fa-instagram"></i>
</a>&nbsp; </a>&nbsp;
<a href="https://analytics.rowsandall.com/"> <a href="https://analytics.rowsandall.com/">
<i class="fab fa-wordpress-simple"></i> <i class="fab fa-wordpress-simple"></i>
</a>&nbsp; </a>&nbsp;
<a href="https://rowing-data-analytics.mn.co/feed"> <a href="https://rowing-data-analytics.mn.co/feed">
<i class="fas fa-chart-network"></i> <i class="fas fa-chart-network"></i>
</a>&nbsp; </a>&nbsp;
</p> </p>
<p> <p>
<ul> <ul>
<li> <li>
<h2>Help</h2> <h2>Help</h2>
<ul> <ul>
<li> <li>
<a href="/rowers/help/">Help</a> <a href="/rowers/help/">Help</a>
</li> </li>
<li> <li>
<a href="https://analytics.rowsandall.com/"> <a href="https://analytics.rowsandall.com/">
Rowing Analytics Blog Rowing Analytics Blog
</a> </a>
</li> </li>
<li> <li>
<a href="https://rowing-data-analytics.mn.co/feed"> <a href="https://rowing-data-analytics.mn.co/feed">
Rowing Data Discussion Group</a> Rowing Data Discussion Group</a>
</li> </li>
<li> <li>
<a href="/rowers/physics/">Rowing Physics</a> <a href="/rowers/physics/">Rowing Physics</a>
</li> </li>
</ul> </ul>
</li> </li>
<li> <li>
<h2>About</h2> <h2>About</h2>
<ul> <ul>
<li> <li>
<a href="/rowers/email/">Contact</a> <a href="/rowers/email/">Contact</a>
</li> </li>
<li> <li>
<a href="/rowers/email/">Rowsandall s.r.o.</a> <a href="/rowers/email/">Rowsandall s.r.o.</a>
</li> </li>
<li> <li>
<a href="/rowers/brochure/">Brochure</a> <a href="/rowers/brochure/">Brochure</a>
</li> </li>
<li> <li>
<a href="/rowers/partners/">Partnering?</a> <a href="/rowers/partners/">Partnering?</a>
</li> </li>
<li> <li>
<a href="/rowers/developers/">Developers Info</a> <a href="/rowers/developers/">Developers Info</a>
</li> </li>
</ul> </ul>
</li> </li>
<li> <li>
<h2>Paid Plans</h2> <h2>Support Us</h2>
<ul> <ul>
<li> <li>
<a href="/rowers/paidplans/">Paid Plans</a> <a href="/rowers/paidplans/">Support Us</a>
</li> </li>
</ul> </ul>
</li> </li>
<li> <li>
<h2>Legal</h2> <h2>Legal</h2>
<ul> <ul>
<li> <li>
<a href="/rowers/legal/">Terms and Conditions</a> <a href="/rowers/legal/">Terms and Conditions</a>
</li> </li>
<li> <li>
<a href="/rowers/legal/">Privacy Policy</a> <a href="/rowers/legal/">Privacy Policy</a>
</li> </li>
</ul> </ul>
</ul> </ul>
</p> </p>
</footer> </footer>
{% analytical_body_bottom %} {% analytical_body_bottom %}
@@ -438,52 +454,52 @@
</body> </body>
</html> </html>
{% block scripts %} {% endblock %} {% block scripts %} {% endblock %}
<script defer type="text/javascript" src="/jsi18n/"></script> <script defer type="text/javascript" src="/jsi18n/"></script>
<script defer type="text/javascript" src="/static/admin/js/core.js"></script> <script defer type="text/javascript" src="/static/admin/js/core.js"></script>
<script defer type="text/javascript" src="/static/admin/js/jquery.min.js"></script> <script defer type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
<script defer type="text/javascript" src="/static/admin/js/jquery.init.js"></script> <script defer type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
<script defer type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"> <script defer type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js">
</script> </script>
<script defer type="text/javascript" src="/static/admin/js/calendar.js"></script> <script defer type="text/javascript" src="/static/admin/js/calendar.js"></script>
<script defer type="text/javascript" src="/static/admin/js/urlify.js"></script> <script defer type="text/javascript" src="/static/admin/js/urlify.js"></script>
<script defer type="text/javascript" src="/static/admin/js/prepopulate.js"></script> <script defer type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
<script defer type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.min.js"></script> <script defer type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.min.js"></script>
<script defer type="text/javascript" src="/static/admin/js/SelectBox.js"></script> <script defer type="text/javascript" src="/static/admin/js/SelectBox.js"></script>
<script defer type="text/javascript" src="/static/admin/js/SelectFilter2.js"></script> <script defer type="text/javascript" src="/static/admin/js/SelectFilter2.js"></script>
<script defer type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script> <script defer type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>
<script defer type="text/javascript" src="/static/admin/js/inlines.js"></script> <script defer type="text/javascript" src="/static/admin/js/inlines.js"></script>
<script src="/static/cookielaw/js/cookielaw.js"></script> <script src="/static/cookielaw/js/cookielaw.js"></script>
<script> <script>
window.addEventListener('DOMContentLoaded', function() { window.addEventListener('DOMContentLoaded', function() {
$(function() { $(function() {
$("#id-logout").click( function() { $("#id-logout").click( function() {
localStorage.clear(); localStorage.clear();
console.log('cleared storage'); console.log('cleared storage');
});
}); });
}); });
});
</script> </script>
<script> <script>
$( document ).ready(function() { $( document ).ready(function() {
console.log('loading script'); console.log('loading script');
$.getJSON(window.location.protocol + '//'+window.location.host + '/getblogs/', function(data) { $.getJSON(window.location.protocol + '//'+window.location.host + '/getblogs/', function(data) {
var html = ''; var html = '';
$.each(data, function(key, blog) { $.each(data, function(key, blog) {
console.log(blog.title); console.log(blog.title);
html += '<div class="site-announcement-box"><div class="site-announcement-white">'; html += '<div class="site-announcement-box"><div class="site-announcement-white">';
html += '<a style="text-decoration: none; color: white;" href="'+blog.link+'">'; html += '<a style="text-decoration: none; color: white;" href="'+blog.link+'">';
html += blog.title; html += blog.title;
html += '</a>'; html += '</a>';
html += '</div></div>'; html += '</div></div>';
}); });
$("#id_blogs").html(html); $("#id_blogs").html(html);
}); });
}); });
</script> </script>