def login(self, request): if self.is_valid(): login(request, self.user) messages.add_message( request, messages.SUCCESS, _( u"Hello %(first_name)s %(last_name)s, you've successfully logged in." % { 'first_name': self.user.first_name or self.user.username, 'last_name': self.user.last_name })) if settings.SHOW_UPDATE_ALERT and request.user.is_superuser: latest_version = get_latest_version() if version != latest_version: messages.add_message( request, messages.WARNING, _("URGENT - your Tendenci version is out of date. Please upgrade immediately. For instructions, please check the docs at https://tendenci.readthedocs.io/en/latest/index.html" )) remember = (self.remember_default if self.hide_remember_me else self.cleaned_data['remember']) if remember: request.session.set_expiry(settings.SESSION_COOKIE_AGE) else: request.session.set_expiry(0) return True return False
def update_tendenci(request, template_name="base/update.html"): from tendenci.apps.base.utils import get_latest_version if request.method == "POST": tos = request.POST.get('tos') if tos: subprocess.Popen([python_executable(), "manage.py", "auto_update", "--user_id=%s" % request.user.id]) return redirect('update_tendenci.confirmation') return render_to_resp(request=request, template_name=template_name, context={ 'latest_version': get_latest_version(), 'version': version, })
def update_tendenci(request, template_name="base/update.html"): from tendenci.apps.base.utils import get_latest_version if request.method == "POST": tos = request.POST.get('tos') if tos: SubProcessManager.set_process([python_executable(), "manage.py", "auto_update", "--user_id=%s" % request.user.id]) return redirect('update_tendenci.confirmation') return render_to_response(template_name, { 'latest_version': get_latest_version(), 'version': version, }, context_instance=RequestContext(request))
def update_tendenci(request, template_name="base/update.html"): from tendenci.apps.base.utils import get_latest_version if request.method == "POST": tos = request.POST.get('tos') if tos: SubProcessManager.set_process(["python", "manage.py", "auto_update", "--user_id=%s" % request.user.id]) return redirect('update_tendenci.confirmation') return render_to_response(template_name, { 'latest_version': get_latest_version(), 'version': version, }, context_instance=RequestContext(request))
def handle(self, *args, **options): from tendenci.apps.site_settings.utils import get_setting from tendenci import __version__ as version from tendenci.apps.base.utils import get_latest_version verbosity = int(options['verbosity']) user_id = options['user_id'] if user_id: [request_user] = User.objects.filter(pk=user_id)[:1] or [None] else: request_user = None site_url = get_setting('site', 'global', 'siteurl') # check what tendenci version we're on major_bit = int(version.split('.')[0]) if major_bit < 7: if verbosity > 1: print("No update for this version {}.".format(version)) print( "Please consider to upgrade https://tendenci.readthedocs.org/en/latest/" ) return project_root = settings.PROJECT_ROOT err_list = [] # check the latest version latest_version = get_latest_version() if int(latest_version.split('.')[0]) < 7 or version == latest_version: # STOP - NO UPDATE return if verbosity > 1: print("Latest version: {}".format(latest_version)) print("Your version: {}".format(version)) print("Start updating...") # update some files - deploy.py, requirements/tendenci.txt files_to_update = { 'deploy.py': 'https://raw.githubusercontent.com/tendenci/tendenci-project-template/master/deploy.py', 'requirements/tendenci.txt': 'https://raw.githubusercontent.com/tendenci/tendenci-project-template/master/requirements/tendenci.txt' } for key, value in files_to_update.items(): try: subprocess.check_output('curl {0} > {1}/{2}'.format( value, project_root, key), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) # update tendenci if not err_list: try: if verbosity > 1: print("Updating tendenci...") update_cmd = '{0} -m pip install -r {1}/{2} --upgrade'.format( python_executable(), project_root, 'requirements/tendenci.txt') subprocess.check_output('cd {}; {}'.format( project_root, update_cmd), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: # run migrate, collectstatic, etc via deploy.py try: subprocess.check_output("cd {0}; {1} manage.py migrate".format( latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: known_error = "BadMigrationError: Migrated app 'djcelery' contains South migrations" known_error2 = 'relation "djcelery_crontabschedule" already exists' if known_error in e.output or known_error2 in e.output: try: subprocess.check_output( "cd {0}; {1} manage.py migrate djcelery 0001 --fake" .format(latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) subprocess.check_output( "cd {0}; {1} manage.py migrate".format( latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: # run deploy.py try: subprocess.check_output("cd {0}; {1} deploy.py".format( latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: if verbosity > 1: print('Reloading the site...') # reload the site. # it's a guessing game here - because we don't know what wsgi server the site is behind # and how exactly the site was set up try: subprocess.check_output( "sudo reload %s" % os.path.basename(settings.PROJECT_ROOT), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: try: subprocess.check_output( "sudo sv kill tendenci_site && sv start tendenci_site", stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if verbosity > 1: if err_list: print( 'Sorry, updating tendenci is not complete due to the following error(s):\n\n' ) print('\n\n'.join(err_list)) else: print("Update is done.") if request_user and request_user.email: # notify update is done if err_list: subject = 'Error on updating tendenci %s' % site_url body = 'Error(s) encountered on updating tendenci:\n\n' body += '\n\n'.join(err_list) else: subject = 'Update tendenci is done %s' % site_url body = 'Successfully updated tendenci for %s.\n\n' % site_url body += 'Tendenci version: %s\n\n' % latest_version body += "Thanks!\n%s\n\n" % get_setting('site', 'global', 'sitedisplayname') msg = EmailMessage(subject, body, settings.DEFAULT_FROM_EMAIL, [request_user.email]) msg.send()
def handle(self, *args, **options): from tendenci.apps.site_settings.utils import get_setting from tendenci import __version__ as version from tendenci.apps.base.utils import get_latest_version verbosity = int(options['verbosity']) user_id = options['user_id'] if user_id: [request_user] = User.objects.filter(pk=user_id)[:1] or [None] else: request_user = None site_url = get_setting('site', 'global', 'siteurl') # check what tendenci version we're on major_bit = int(version.split('.')[0]) if major_bit < 7: if verbosity >1: print("No update for this version {}.".format(version)) print("Please consider to upgrade https://tendenci.readthedocs.org/en/latest/") return project_root = settings.PROJECT_ROOT err_list = [] # check the latest version latest_version = get_latest_version() if int(latest_version.split('.')[0]) < 7 or version == latest_version: # STOP - NO UPDATE return if verbosity >1: print("Latest version: {}".format(latest_version)) print("Your version: {}".format(version)) print("Start updating...") # update requirements/tendenci.txt files_to_update = {'requirements/tendenci.txt': 'https://raw.githubusercontent.com/tendenci/tendenci-project-template/master/requirements/tendenci.txt'} for key, value in files_to_update.items(): try: subprocess.check_output('curl {0} > {1}/{2}'.format(value, project_root, key), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) # update tendenci if not err_list: try: if verbosity >1: print("Updating tendenci...") update_cmd = '{0} -m pip install -r {1}/{2} --upgrade'.format(python_executable(), project_root, 'requirements/tendenci.txt') subprocess.check_output('cd {}; {}'.format(project_root, update_cmd), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: # run migrate try: subprocess.check_output("cd {0}; {1} manage.py migrate".format(latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: known_error = "BadMigrationError: Migrated app 'djcelery' contains South migrations" known_error2 = 'relation "djcelery_crontabschedule" already exists' if known_error in e.output or known_error2 in e.output: try: subprocess.check_output("cd {0}; {1} manage.py migrate djcelery 0001 --fake".format(latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) subprocess.check_output("cd {0}; {1} manage.py migrate".format(latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: # run collectstatic, etc via deploy try: call_command('deploy') except CommandError as e: err_list.append(e.output) if not err_list: if verbosity >1: print('Reloading the site...') # reload the site. # it's a guessing game here - because we don't know what wsgi server the site is behind # and how exactly the site was set up try: subprocess.check_output("sudo reload %s" % os.path.basename(settings.PROJECT_ROOT), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: try: subprocess.check_output("sudo sv kill tendenci_site && sv start tendenci_site", stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if verbosity >1: if err_list: print('Sorry, updating tendenci is not complete due to the following error(s):\n\n') print('\n\n'.join(err_list)) else: print("Update is done.") if request_user and request_user.email: # notify update is done if err_list: subject = 'Error on updating tendenci %s' % site_url body = 'Error(s) encountered on updating tendenci:\n\n' body += '\n\n'.join(err_list) else: subject = 'Update tendenci is done %s' % site_url body = 'Successfully updated tendenci for %s.\n\n' % site_url body += 'Tendenci version: %s\n\n' % latest_version body += "Thanks!\n%s\n\n" % get_setting('site', 'global', 'sitedisplayname') msg = EmailMessage(subject, body, settings.DEFAULT_FROM_EMAIL, [request_user.email]) msg.send()