Why Tendenci Chose Python over PHP

Note: this is a repost from the eschipul.com blog.

This blog is a WordPress blog written in PHP. And WordPress, which is written in PHP is a great platform when secured properly.

So why did our team choose to rewrite Tendenci Open Source and in the Python Programming language? It is a question I get asked a lot. We’ve never been a company that likes to talk in the negative if at all possible, yet it is important to talk about the megatrends going on given we work with associations and nonprofits.

Python Growing in Academia
Why Python instead of PHP for Tendenci

Source: https://www.upguard.com/blog/which-web-programming-language-is-the-most-secure

programming vulnerabilities
Vulnerabilities in each language

Source: http://info.whitehatsec.com/rs/whitehatsecurity/images/statsreport2014-20140410.pdf

security-report

Source: http://info.whitehatsec.com/rs/whitehatsecurity/images/statsreport2014-20140410.pdf

Popularity of a language is a trend, and what you want is as many developers familiar and liking the language of your open source project as possible. This means you have a better chance to have a secure web site and therefore a more secure future.

To be fair – as Disraeli said – “lies, damn lies and statistics” – so there is no one perfectly secure language any more than there is a perfectly “safe” hammer. There will always be operator error and programmers make mistakes.

So we’re not saying Python is perfect, and all of us have used most of the other languages on those charts at some point. We’re just saying we are pleased so many other programmers also like Python and Open Source. THAT is the best that can be done to secure your future online. Secure code that you can examine yourself and even host yourself!

Addendum: As I post this on the Tendenci Blog. Given we focus on non-profits, associations, memberships, education, medical, religious – basically the do-good cause-based organizations, I believe it is particularly important that the project is as transparent as possible. Sometimes it is healthy to inform everyone of WHY we made a decision seven years ago. Python was the right call.

DBSA Houston goes Mobile and Responsive with Tendenci’s Tech

Note: If you have arrived at this page from a search result, this is about the launch of the new web site. Thus

If you are in need of IMMEDIATE crisis services, please call
the Harris Center 24-hr Hotline at (713) 970-7000. If you are
seeking ongoing support visit http://www.dbsahouston.org/

From the news release:

Depression and Bipolar Support Alliance Greater Houston Revamps Website for Better Accessibility

HOUSTON, February 12, 2016 –Tendenci (www.tendenci.com), the software development company spearheading the Tendenci Open Source platform for associations and other nonprofits (NPOs), is proud to release a dynamic new website for the Depression and Bipolar Support Alliance Greater Houston. The website, http://www.dbsahouston.org, sponsors free and confidential support groups in the Greater Houston area for individuals suffering from depression and bipolar disorder and the family and friends that support them….

DBSA Houston
Depression and Bipolar Support Alliance Greater Houston Revamps Website for Better Accessibility

From the DBSA Houston website:

Depression and Bipolar Support Alliance Greater Houston provides free and confidential support groups for individuals living with, or family and friends affected by, depression and bipolar disorders. Our support groups are also offered to family members, caregivers and friends who are trying to understand these two difficult mental disorders as they try to assist loved ones.

If you, or someone you love, or friends with is in pain, please point them to resources like DBSA Houston for support (or google one in your area.)

UCOA-Unified Chart of Accounts for NPOs

Short version: Unified Chart of Accounts for NPOs

“Hey y’all, let’s all adopt the Unified Chart Chart of Accounts and save time and energy to focus on our causes!

Long version:

Dear Board of Directors, Executive Director, long time accountant, and major donors. Let’s all adopt the Unified Chart Chart of Accounts and save time and energy to focus on our causes!

Wouldn’t it be better if at least reviewing the financials was simplified so you could focus on your cause? Here is a partial solution:

Unified Chart of Accounts for NPOs
National Center for Charitable Statistics UCOA

The big organizations know, but for smaller NGOs, did you know that the National Center for Charitable Statistics has published an open source/free/please-use-it Unified Chart Chart of Accounts JUST FOR YOU!

Like many of the folks reading this blog, living the life of adventure which accompanies working with worldwide NGOs, we serve on a lot of boards and sponsor a lot of activities for the greater good. We love that part of our responsibilities!

OK, maybe we just agree on the need.

A board member must understand their serious and legal responsibility to provide financial stewardship and demonstrate strong fiduciary responsibility to the organization. While not losing site of the goals.  Nothing “returns to your soul” like giving of your time and energy. It comes back to us all big time as long as it is fulfilling.

May your organization never again lose a board member to the tedium of going through financials printed out of Excel that have evolved from double entry accounting as fast as Moore’s law to quantum accounting for no reason at all. Simplify with the Unified Chart of Accounts. Even if the rules are constantly changing on you.

Python still the most popular coding language and growing

Tendenci, the Open Source Membership Management Software, is written in in a programming language named Python. (Named after Monty Python of course!)

python ranks 1 for popular coding languages
Python – the most popular coding language of 2015

And Python is the most Popular Coding Language of 2015. A nice winning streak! This matters to people choosing membership software because open source means it can’t be taken away from you. Lots of options to export from Tendenci as well if a better solution for your particular needs comes up.

The more people who know a given programming language means you have lots of resources to support, extend, upgrade and hopefully also contribute to the tendenci software and get involved.

So let’s be honest, we all like playing on the winning team. We bet on Python very early. We used Python even on the windows platform in the early 2000s. Python has truly hit a critical-mass among developers.

Given the Django web framework behind Open Source Tendenci is written in Python, and all of Tendenci’s apps are written in Python, we feel pretty good about the future stability of our technology stack.

In other words, the future looks bright and we welcome more developers to join the Tendenci community!

(source: http://blog.codeeval.com/codeevalblog/2015#.VohU45MrLeQ= )

10 Million NGOs Worldwide (who just might want open source multilingual software)

Let’s start 2016 off with some great news. NGOs are growing internationally and their role in our society is becoming more important.  From the post:
https://www.ongood.ngo/portal/facts-and-stats-about-ngos-worldwide

NGO Facts - 10 Million#NGOfacts is an ongoing campaign that highlights statistical data about NGOs, nonprofits and charities worldwide. Committed to building a comprehensive list of facts and stats about the NGO sector, please check back regularly for updates.

1. There are an estimated 10 million (non-governmental organizations) NGOs worldwide.
Source: The Global Journal

2. The number of people worldwide donating money to NGOs increased from 1.2 billion in 2011 to 1.4 billion in 2014. By 2030, the number is expected to grow to 2.5 billion.
Source: Charities Aid Foundation

(those are the first two points of 14 – go read the full post here!)

And yes, we are pretty happy to see greater adoption of Tendenci – an open source software solution for NGOs that is already multilingual. Join us!

RIP Ian Murdock

ian-murdockRIP Ian Murdock,the  founder of Debian Linux. Without Ian’s work in the Open Source Community there could be no Tendenci. This is a sad way to end 2015.

News links below:

#RIP

Translations, Client iphone and Android Apps

A few cool things in the land of Tendenci clients and open source users internationally to share.

Client Created iPhone and Android Apps

Kudos to www.hapl.org and the developer Jaime Lossada who created this application for the iphone and android on top of Tendenci. This was completely the work of Jaime so if you have questions please reach out to him directly.

HAPL iPhone App by Jaime Lossada
HAPL iPhone and Android Apps by Jaime Lossada

We just think it’s cool to see what “Open” software enables people to do versus closed-old-world-options.

Translations

And we’ve had a few requests lately for translations via Transifex as well as new languages to add. Transifex it integrates with github and Open Source Projects like Tendenci.

Translations for Tendenci via Transifex
Translations for Tendenci via Transifex

You can check our our Transifex project for Tendenci. It’s crowd-sourced translations for open source projects.

HOW TO USE DJANGO-SQL-EXPLORER IN TENDENCI MMS

tendenci6megamenu.png

Tendenci 6 ships with the excellent django-sql-explorer from ePantry. This means you can export anything at any time and build any report you want whenever you want. Absolute 100% anytime freedom of access to your data. #JOY #FREEDOM #ROCKS

First a warning. If you choose to use a direct query tool know they are dangerous. You are doing so at your own risk and could possibly corrupt your database beyond repair up to and including requiring a dba to come in and repair it at a cost of thousands of quid. So…. BE CAREFUL.

SQL explorer is a way to directly query your site through the user interface. It is for superusers only and we recommend disabling it by default (see disclaimer above.) But if you are still reading here is the lightning version.

  1. Login to your Tendenci6 site at /accounts/login/
  2. Navigate to /explorer/
  3. Click on playground and test out some queries. For example here are two
    1. “select tablename from pg_tables” – without the quotes to list all 300 tables in your database
    2. “select * from articles_article” – list all articles including expired and inactive etc.
  4. If you like the queries click “new query” and name and describe them and click save.
  5. Click on the SQL explorer icon top left and your back at the dashboard with icons to download the results of your queries.

Visually when you add the URL /explorer/ to the end of your site path you will see something very similar to this.

django-sql-query-dashboard.png

First note the icon on the right to Download CSV so you can download all of whatever that query is for.  If you don’t see any, no worries – that’s what this post is about!

So let’s write a basic sql statement.

django-sql-playground.png

And then when you click “New  Query” you will find this interface and you can carefully name and describe your query so you know what it does later.

creating-new-tendenci-query-for-csv-download.png

 

1) ALL Interactive users:

SELECT  u.first_name, u.last_name, u.email, u.username, u.is_staff,  u.is_superuser, p.salutation, p.company, p.position_title, p.phone,  p.address, p.address2, p.member_number, p.city, p.state, p.zipcode,  p.country, p.url, p.sex, p.address_type, p.phone2, p.fax, p.work_phone,  p.home_phone, p.mobile_phone, p.notes, p.admin_notes FROM auth_user u  INNER JOIN profiles_profile p ON u.id=p.user_id WHERE u.is_active=True  AND p.status=True AND p.status_detail='active'

Copy Paste Version:

SELECT u.first_name, u.last_name, u.email, u.username, u.is_staff, u.is_superuser, p.salutation, p.company, p.position_title, p.phone, p.address, p.address2, p.member_number, p.city, p.state, p.zipcode, p.country, p.url, p.sex, p.address_type, p.phone2, p.fax, p.work_phone, p.home_phone, p.mobile_phone, p.notes, p.admin_notes FROM auth_user u INNER JOIN profiles_profile p ON u.id=p.user_id WHERE u.is_active=True AND p.status=True AND p.status_detail=’active’

2) ALL memberships:

SELECT u.first_name, u.last_name, u.email, u.username, u.is_staff, u.is_superuser,
    p.salutation, p.company, p.position_title, p.phone, p.address, p.address2, 
    p.member_number, p.city, p.state, p.zipcode, p.country, p.url, p.sex, 
    p.address_type, p.phone2, p.fax, p.work_phone, p.home_phone, p.mobile_phone,
    m.membership_type_id, m.renewal, m.certifications, m.work_experience,
    m.referer_url, m.referral_source, m.join_dt, m.expire_dt, m.renew_dt,
    m.primary_practice, m.how_long_in_practice, m.application_approved,
    m.application_approved_dt, m.areas_of_expertise, m.home_state,
    m.year_left_native_country, m.network_sectors, m.networking,
    m.government_worker, m.government_agency, m.license_number,
    m.license_state, m.status_detail
FROM auth_user u
INNER JOIN profiles_profile p
ON u.id=p.user_id
INNER JOIN memberships_membershipdefault m
ON m.user_id=u.id
WHERE u.is_active=True
AND p.status=True
AND m.status_detail <> 'archive'

Copy Paste Version:

SELECT u.first_name, u.last_name, u.email, u.username, u.is_staff, u.is_superuser, p.salutation, p.company, p.position_title, p.phone, p.address, p.address2, p.member_number, p.city, p.state, p.zipcode, p.country, p.url, p.sex, p.address_type, p.phone2, p.fax, p.work_phone, p.home_phone, p.mobile_phone, m.membership_type_id, m.renewal, m.certifications, m.work_experience, m.referer_url, m.referral_source, m.join_dt, m.expire_dt, m.renew_dt, m.primary_practice, m.how_long_in_practice, m.application_approved, m.application_approved_dt, m.areas_of_expertise, m.home_state, m.year_left_native_country, m.network_sectors, m.networking, m.government_worker, m.government_agency, m.license_number, m.license_state, m.status_detail FROM auth_user u INNER JOIN profiles_profile p ON u.id=p.user_id INNER JOIN memberships_membershipdefault m ON m.user_id=u.id WHERE u.is_active=True AND p.status=True AND m.status_detail <> ‘archive’

3) ALL corporate members:

SELECT cp.name, cp.address, cp.address2, cp.city, cp.state, cp.zip, cp.country,
    cp.phone, cp.email, cp.url, cp.number_employees, cp.chapter, cp.tax_exempt,
    cp.annual_revenue, cp.annual_ad_expenditure, cp.description, cp.expectations,
    cp.notes, cp.referral_source, cp.ud1, cp.ud2, cp.ud3, cp.ud4, cp.ud5, cp.ud6, 
    cp.ud7, cp.ud8, cm.corporate_membership_type_id, cm.renewal, cm.renew_dt,
    cm.join_dt, cm.expiration_dt, cm.approved, cm.admin_notes, cm.status_detail
FROM corporate_memberships_corpprofile cp
INNER JOIN corporate_memberships_corpmembership cm
ON cp.id=cm.corp_profile_id
WHERE cm.status_detail <> 'archive'

Copy Paste Version:

SELECT cp.name, cp.address, cp.address2, cp.city, cp.state, cp.zip, cp.country, cp.phone, cp.email, cp.url, cp.number_employees, cp.chapter, cp.tax_exempt, cp.annual_revenue, cp.annual_ad_expenditure, cp.description, cp.expectations, cp.notes, cp.referral_source, cp.ud1, cp.ud2, cp.ud3, cp.ud4, cp.ud5, cp.ud6, cp.ud7, cp.ud8, cm.corporate_membership_type_id, cm.renewal, cm.renew_dt, cm.join_dt, cm.expiration_dt, cm.approved, cm.admin_notes, cm.status_detail FROM corporate_memberships_corpprofile cp INNER JOIN corporate_memberships_corpmembership cm ON cp.id=cm.corp_profile_id WHERE cm.status_detail <> ‘archive’

4) All users in a specific group (replace <YOUR GROUP ID> with your group id)

SELECT ug.name, u.first_name, u.last_name, u.email, u.username, u.is_staff, u.is_superuser, p.salutation, p.company, p.position_title, p.phone, p.address, p.address2, p.member_number, p.city, p.state, p.zipcode, p.country, p.url, p.sex, p.address_type, p.phone2, p.fax, p.work_phone, p.home_phone, p.mobile_phone FROM auth_user u INNER JOIN profiles_profile p ON u.id=p.user_id INNER JOIN user_groups_groupmembership ugm on u.id=ugm.member_id INNER JOIN user_groups_group ug on ug.id=ugm.group_id WHERE ug.id=<YOUR GROUP ID> AND ugm.status=True AND ugm.status_detail='active'

Copy Paste Version:

SELECT ug.name, u.first_name, u.last_name, u.email, u.username, u.is_staff, u.is_superuser, p.salutation, p.company, p.position_title, p.phone, p.address, p.address2, p.member_number, p.city, p.state, p.zipcode, p.country, p.url, p.sex, p.address_type, p.phone2, p.fax, p.work_phone, p.home_phone, p.mobile_phone FROM auth_user u INNER JOIN profiles_profile p ON u.id=p.user_id INNER JOIN user_groups_groupmembership ugm on u.id=ugm.member_id INNER JOIN user_groups_group ug on ug.id=ugm.group_id WHERE ug.id=<YOUR GROUP ID> AND ugm.status=True AND ugm.status_detail=’active’

 

 

 

Contribute back your brilliance to the rest of us? Have you written some good queries for Tendenci using the amazing  django-sql-explorer from ePantry? Post them on the Tendenci Community Site for others to learn and share with!

Please do be careful. Remember the warnings above. Using a live sql tool on a relational database for anything besides SELECT queries is ill-advised. It really is your live data on a live site SO BE CAREFUL!

We believe this level of access to the superusers on Tendenci sites is empowering. We like knowing people can download any of their data when they need it. And perhaps contribute back some suggested new reports to the Tendenci Community as a whole!

Because Tendenci is part of the Django community and we couldn’t have brought this functionality to you without others in the community “giving first.” We may have added it to Tendenci, but that’s ONLY because of the generosity of building and making it available by others. Explorer is brought to you by the power of collaborative open source software (THANK YOU ePantry!)

Note this is a cross post from our help files. See the Help File for the latest accurate info at: https://www.tendenci.com/help-files/how-use-django-sql-explorer-tendenci/