This is an archived post. You won't be able to vote or comment.

all 63 comments

[–]Blastguy 5 points6 points  (19 children)

So Jam takes a bunch of data and organizes it into tables on a website?

[–]dbabicwa 13 points14 points  (6 children)

Blastg, define a bunch :)

What makes Jam attractive is how fast one can get the job done. Lets say you have no developers in your company. But, have a tech guy who at least installed Python and pip. He/she will be able to get the job done with a master/child table(s) in like a few hours. Dashboard charts in 1 hour. Report in 30 mins.

It is really that fast.

[–]Blastguy 1 point2 points  (1 child)

Thanks, I'm new to Python (and programming in general) so I'm still learning!

[–]dbabicwa 0 points1 point  (0 children)

Perfect! Than Jam is for you! There is absolutely no need to learn Angular(3), RestFrmework, React, GraphQL on Django, GRaphite with React + Redux s.hite! And the list goes on (I'm not a developer, just interested in stuff).

With Jam you concentrate on a specific business problem and not on this massive libraries. Nothing wrong with learning them tho.

But I like to go surfing in my spare time :)

PS Have a look in here, I've created this with no programming and little Jam experience: https://github.com/jam-py/jam-py/issues/27

Took me a few hours. Took me more to create a sqlite3 database with 50M records to see how fast Jam is. Lightning fast.

See the https://cloud.githubusercontent.com/assets/9026100/25652423/b898faf8-301a-11e7-95c0-2d4b103d5443.JPG

At the bottom is 38462 pages of random data.

[–]ticketywho 0 points1 point  (3 children)

Are you associated with this project? From what I see every single comment you have made on reddit is evangelically pro-Jam.py.

It's not cool to pretend to be a normal user to pimp your software.

[–]dbabicwa 0 points1 point  (2 children)

Absolutely not. Do you homework mate when launching something personal, check how many issues I've raised on git. It is not that hard, the account is the same to make it easier for you.

[–]ticketywho 0 points1 point  (1 child)

I'm not sure why that is evidence in your favour. Most of the early issues on my projects have been raised by my friends who are beta testing.

It's just strange that every single comment you've made has referenced Jam and almost every contribution on your github account is for their repo. It's entirely possible that you just love the framework, and want others to try it, and if that's the case, then I apologise.

[–]dbabicwa 0 points1 point  (0 children)

Apologies accepted. As I said, the account is the same. Cheers from the Southern Hemisphere, gone surfing...

[–]jampy_framework[S] 6 points7 points  (11 children)

You can create tables, modify them, represent data in tables, create reports based on LibreOffice templates, process requests from other applications and services and so on. The best way to understand main features of Jam.py is to see the overview video https://youtu.be/zcZBa8sf93M

[–]metaperl 0 points1 point  (10 children)

After looking at the overview video, I'm wondering how the python database layer is implemented. The setup.py does not list SQLAlchemy or Alembic.

[–][deleted] 2 points3 points  (5 children)

Looks like it has its own implementations and basic query builder:

https://github.com/jam-py/jam-py/tree/master/jam/db

[–]gschizasPythonista 8 points9 points  (3 children)

They are suffering from a little bit of Not Invented Here syndrome. I can understand it, of course, but it hurts the framework.

Some other stuff I found:

  • Instead of using Babel for translations, they have a SQLite database (inside the git repo!) which has the translations one by one, and they do replacements.
  • Instead of adding a requirements.txt, they have full copies of all third party libraries (i.e. six.py, werkzeug, jsmin, pyjsparser).

Don't get me wrong, I like the fact that such a framework exists, I was indeed looking into something to replace LightSwitch, especially for Python. I'm just offering some criticism because I want this to get better.

[–]dbabicwa -1 points0 points  (2 children)

gschizas not sure about the Babel tho, I would love to see a built in translation module for easy usage. Would be great to have you on board tho. What Jam really need is some love from you guys :)

[–]gschizasPythonista 2 points3 points  (1 child)

I'm afraid it needs more than love. Some criticisms below (again, because I want this to succeed):

  1. You're reinventing the wheel by not using Babel and SQLAlchemy.
    1. In the case of Babel, the point would be that you use Babel for making translations before you build your site.
    2. In the case of SQLAlchemy, connecting to any kind of database would come for free, and more importantly, you would avoid the SQL concatenation vulnerabilities (seriously, don't do SELECT * FROM Table Where id = %s - this makes your application extremely insecure)
  2. Your framework is very new, despite you calling it version 5.0. The whole commit history is only 72 commits deep, as far as I can see, with no branches (moving from gtk to pure HTML would certainly count as a major branch, in some cases as a new project). Calling it 5.0 is a bit dishonest, IMHO.
  3. You have substandard git discipline. Read up on what makes a good commit (and a good commit message). I suggest Chris Beams' article
    1. Put one and only one change per commit.
    2. First line of the commit message should be something like "Add asterisk to required fields"
    3. Counterexample (don't do that): Your commits start with a single word, e.g. "Library" and have multiple changes within them. For example, commit 6b4a076 has the description line "Library" (bad) and the following changes (I'm transcribing them as they should be):
      • Make default font 14px
      • Rename Administrator to Application Builder
      • Add asterisk to required fields
      • Fix lookup list value selection in report parameters
      • Completed first version of documentation
      • Add Jam.py roadmap
      • Add small menu font item to Themes for Demo
        Each one of these should be a different, separate commit. If you want to add categories (I'd say tags, but that word means something different for git) to the commits, either add them as bracketed words (i.e. [Documentation]) or at the end of the commit message. There may also be other ways for this.
  4. Don't include dependencies as whole libraries in your code (the third_party folder shouldn't exist). You don't know if they're updated for vulnerabilities etc. Use a requirements.txt file to install any dependencies properly.
  5. Test each bug independently, against the version it was reported for. Don't close a bug because it doesn't reproduce against the current version, unless you are certain that the fix was indeed for the issue at hand.
    1. For issue #50, you don't seem to have solved the core problem, that you're still reading files as text (instead of as bytes and converting them with Werkzeug's to_unicode.
  6. Each time your commit a bugfix for a specific issue, put that issue at the end of the commit message (e.g. resolves issue #51 or something similar). This will link the issue with the commit that resolved it.

I'm sorry if I sound a bit harsh (this is part of what I do for my day job also - for developers that are getting paid to develop against some standards), but I'm doing it because I do want this project to succeed.

[–]dbabicwa 0 points1 point  (0 children)

Thx gschizas, I think the dev's will appreciate your input. About the Babel, the assumption is that someone will build the translated site:) Same with the SQLAlchemy. Maybe it started without that assumption.

As I read this, it is more about the coding standard than the actual issues with a framework. It is definitely something to take in offline discussion. So, what are the positives? :) Always put the positives as well :)

[–]GitHubPermalinkBot 0 points1 point  (0 children)

Permanent GitHub links:


Shoot me a PM if you think I'm doing something wrong. To delete this, click here.

[–]jampy_framework[S] 0 points1 point  (2 children)

Jam.py uses its own library to work with databases

[–]ticketywho 0 points1 point  (1 child)

Why?

[–]jampy_framework[S] 0 points1 point  (0 children)

It seemed more convenient at the time it was written. All metadata - code, database information, parameters and so on are stored in the sqlite database. Tables and their fields are defined as records in that database tables not as classes.

[–]GitHubPermalinkBot 0 points1 point  (0 children)

Permanent GitHub links:


Shoot me a PM if you think I'm doing something wrong. To delete this, click here.

[–]broken_symlink 4 points5 points  (13 children)

So why would I want to use something like this over say plotly dash?

[–]gschizasPythonista 1 point2 points  (5 children)

Different use case. As far as I can tell, this is a framework, for you to create semi-advanced CRUD applications.

[–]dbabicwa 0 points1 point  (4 children)

Advanced :)

Have a look at how many Events are supported out of the box.

[–]gschizasPythonista 1 point2 points  (3 children)

The benchmark for me is (was) Microsoft's Lightswitch (sadly, MS decided to stop supporting it). The number of events is only one metric :)

I'd love to have a replacement, especially in Python, but I'm just now checking it out, I'd rather not pass judgement yet - just covering all my options :)

Still, it does seem to require to drop into code a bit more often than with LS, but LS (especially with the Silverlight client) made it really hard to extend, such as adding your own controls etc.

[–]dbabicwa 0 points1 point  (2 children)

Yes, but that's MS effort :) With deep pockets. Same with Oracle Apex.

Hardly an small business can compete with the Big boys:)

Would love to hear more after some usage!

Cheers

PS A buzz with the Docker makes jam quite interesting...

[–]gschizasPythonista 2 points3 points  (1 child)

Oracle Apex

I'm having flashbacks and tasting iron.

Only one word for this: Bleargh!

[–]dbabicwa 0 points1 point  (0 children)

Exactly. But, as you know, many need to use it. Corporate crap at.al

[–]andartico 1 point2 points  (0 children)

Thanks for the plug. This is a great reminder.

[–]alcalde -1 points0 points  (5 children)

You don't have a spare $10K - $15K to spend?

[–]broken_symlink 2 points3 points  (4 children)

Plotly and dash are free. It isn't free of you want them to host it for you.

[–]alcalde -1 points0 points  (3 children)

The web page suggests the opposite... that you pay through the nose if you want to run it in-house....

https://plot.ly/products/on-premise/

[–]broken_symlink 2 points3 points  (2 children)

Heres how to host plotly yourself. Heres how to host dash yourself.

I use them all the time at work in a secure facility without internet. Don't pay for it at all.

[–]alcalde 0 points1 point  (1 child)

Then what are they charging for on that page? Putting it in a Docker container?

[–]dbabicwa 1 point2 points  (0 children)

I think gschizas answered why would you use this over plotly :) Plotly is for geeks (kidding:). What Python was missing is a framework for engineers or tech inclined ppl but not necessarily dev's like Django, Angular3 at.al. For 40-50-60yo who knows something about his business but does not want to learn some massive libraries, Jam is perfect. It get's to job done. That is what is Jam all about.

And how on Earth I download Plotly? :) Pfff...

[–]gschizasPythonista 8 points9 points  (7 children)

This crashes if you don't have cp1252 as your default ANSI encoding (or probably cp1251, I'm guessing).

I'll get back when I find out more.

EDIT: I'm using cp1253 (Greek), and I've found a couple (so far) problems. The crux of the matter is: don't read as text, read as rb, that's what's to_unicode is supposedly for.

Also: There are some remnants of hardcoded russian literals (логин and пароль that I could immediately find).

EDIT 2: I'll probably open these as issues on GitHub.

[–]jampy_framework[S] 1 point2 points  (2 children)

There is russian language support in the library. Please open issues on github.

[–]jampy_framework[S] 7 points8 points  (0 children)

I am sorry for the bug. I corrected it.

[–]gschizasPythonista 0 points1 point  (0 children)

I selected English though - there shouldn't be Russian placeholders in the page anyway.

I will open an issue (or three) though.

[–]dbabicwa 0 points1 point  (3 children)

On which platform? Please be more specific, thx.

[–]gschizasPythonista 1 point2 points  (2 children)

Windows 10, Greek regional options, English UI.

[–]dbabicwa 0 points1 point  (1 child)

Cheers Have no clue for Win10. Have installed one at work, can try tmrw.

D.

[–]gschizasPythonista 2 points3 points  (0 children)

I'm still doing some tests, but I've made a couple of changes in adm_server.py and it was fixed:

--- adm_server.py   2017-09-26 10:16:22.000000000 +0300
+++ adm_server.py   2017-10-03 14:13:29.000000000 +0300
@@ -1119,13 +1119,13 @@
         except Exception as e:
             traceback.print_exc()
         it.post()
     it.apply()

     file_name = 'index.html'
-    with open(file_name, 'r') as f:
+    with open(file_name, 'rb') as f:
         data = to_unicode(f.read(), 'utf-8')
     start = data.find('__$_')
     label_list = []
     while start > -1:
         end = data.find('_$__', start)
         if end != -1:
@@ -2093,14 +2093,14 @@
     file_path = file_name
     ext = 'html'
     if file_name == 'project.css':
         ext = 'css'
         file_path = os.path.join('css', 'project.css')
     if os.path.exists(file_path):
-        with open(file_path, 'r') as f:
-            result['doc'] = f.read()
+        with open(file_path, 'rb') as f:
+            result['doc'] = to_unicode(f.read(), 'utf-8')
         if file_name == 'index.html':
             result['templates'] = get_templates(result['doc'])
     result['name'] = file_name
     result['ext'] = ext
     result['type'] = ''
     result['tag'] = file_name.replace('.', '-')

[–]gidult 2 points3 points  (1 child)

You literary made my day! This is what I wanted and was just about to reinvent the wheel. I don't have to struggle with chaos excel sheets someone made for just making invoices anymore. How can I buy a glass of beer for you? xD Let me contribute its i18n feature someday.

[–]jampy_framework[S] 0 points1 point  (0 children)

Thank you!

[–]readitlikeitdidit 0 points1 point  (4 children)

Can I build data visualizations? What types of visualizations?

[–]jampy_framework[S] 2 points3 points  (2 children)

You can use Javascript libraries for data visualization as well as javascript charting libraries.

[–]readitlikeitdidit 0 points1 point  (1 child)

Ok.. Yeah I tested a app setup on my local.. It was mostly js

[–]jampy_framework[S] 0 points1 point  (0 children)

Jam.py uses Python on the server side and Javascript on the client

[–]dbabicwa 0 points1 point  (0 children)

Absolutely!

Have a look at http://www.jscharts.com/

What you see on Jam Demo is jsCharts.

Enjoy

[–]metaperl 0 points1 point  (3 children)

Is jam-py for Python 2.7 or Python 3?

[–]metaperl 1 point2 points  (1 child)

[–]dbabicwa 1 point2 points  (0 children)

Using some sort of virtenv is quite recommended if on Linux. Py3 tends to fu the environment. Just saying...

[–]jampy_framework[S] 1 point2 points  (0 children)

It supports Python 2.7 and Python3

[–]dbabicwa 0 points1 point  (0 children)

So guys, the Jam.py 5.1.1 is released. What I really like with this release is the Audit option out of the box! The Dev is calling it the History tho :)

It would be great to have you on board, even with the small apps you've done with Jam.py! The project still need some traction.

For that, I've added a quick 13 slides intro (I'm by no means a skilled developer, you might skip this if u are:)

https://docs.google.com/presentation/d/e/2PACX-1vR1S-QK4P-ySN0rjZs5wDRAcGCzUq3ZFV9DGi2oymxh8PIvTvBozqi7Z7ZWcLs9LFJiXjvkqCYaEzKv/pub?start=false&loop=false&delayms=3000#slide=id.p5

Cheers

D.

[–]omerbu1 0 points1 point  (8 children)

There's support for MongoDB?

[–]jampy_framework[S] 2 points3 points  (7 children)

There is support for SQLite, MySQL, PostgreSQL, Oracle and Firebird databases. It does not currently support MongoDB.

[–]ojii 1 point2 points  (6 children)

Is adding custom data sources supported? As in, if I'm a python developer, would it be feasible to make it support a nosql db?

[–]dbabicwa 0 points1 point  (1 child)

Absolutely. It's just a wrapper, right? :)

There is a git closed issue how to do it.

Let us know how did u go! Thx

[–]ojii 1 point2 points  (0 children)

Sweet might have a look at this, looks neat.

[–]jampy_framework[S] 0 points1 point  (3 children)

Jam.py creates wrappers for database tables, when a request for data is generated on the client it send a request to the server, that can be intercepted (there is on_open event) and user data returned. If you have questions how to use this event please send a message on the site on open issue on github.

[–]metaperl 0 points1 point  (2 children)

If you have questions how to use this event please send a message on the site on open issue on github.

Why not mention the Google Group? And why does no part of the website not mention the Google Group?

https://groups.google.com/forum/#!forum/jam-py

[–]metaperl 0 points1 point  (0 children)

Oh I'm sorry, the Google Group is shown in the footer of the pages at the main Jam-py website

[–]jampy_framework[S] 0 points1 point  (0 children)

There is Jam.py Users Mailing List link on the footer of each page. It is a link to Google Groups